Skip to content

Commit 2e4e77d

Browse files
committed
Merge branch 'master' into test/framework
# Conflicts: # lib/android/src/main/java/com/reactnativeldk/LdkModule.kt
2 parents f91d4ab + 067f7b6 commit 2e4e77d

File tree

43 files changed

+53380
-41234
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+53380
-41234
lines changed

example/Dev.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,23 @@ const Dev = (): ReactElement => {
587587
}}
588588
/>
589589

590+
<Button
591+
title={'List channel monitors'}
592+
onPress={async (): Promise<void> => {
593+
const monitorsRes = await ldk.listChannelMonitors(true);
594+
if (monitorsRes.isErr()) {
595+
return setMessage(monitorsRes.error.message);
596+
}
597+
598+
let msg = `Channel Monitors (${monitorsRes.value.length}): \n`;
599+
monitorsRes.value.forEach((monitor) => {
600+
msg += `\n\n${JSON.stringify(monitor)}`;
601+
});
602+
603+
setMessage(msg);
604+
}}
605+
/>
606+
590607
<Button
591608
title={'Show version'}
592609
onPress={async (): Promise<void> => {

lib/android/libs/LDK-release.aar

794 KB
Binary file not shown.

lib/android/libs/ldk-java-javadoc.jar

-8.11 MB
Binary file not shown.

lib/android/src/main/java/com/reactnativeldk/Helpers.kt

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ val Bolt11Invoice.asJson: WritableMap
7272
val rawInvoice = signedInv.raw_invoice()
7373

7474
if (amount_milli_satoshis() is Option_u64Z.Some) result.putInt("amount_satoshis", ((amount_milli_satoshis() as Option_u64Z.Some).some.toInt() / 1000)) else result.putNull("amount_satoshis")
75-
result.putString("description", rawInvoice.description()?.into_inner())
75+
result.putString("description", rawInvoice.description()?.to_str())
7676
result.putBoolean("check_signature", signedInv.check_signature())
7777
result.putBoolean("is_expired", is_expired)
7878
result.putInt("duration_since_epoch", duration_since_epoch().toInt())
@@ -199,6 +199,21 @@ val RouteHop.asJson: WritableMap
199199
return hop
200200
}
201201

202+
203+
fun ChannelMonitor.asJson(channelId: String): WritableMap {
204+
val result = Arguments.createMap()
205+
result.putString("channel_id", channelId)
206+
result.putHexString("funding_txo", _funding_txo._b)
207+
result.putHexString("counterparty_node_id", _counterparty_node_id)
208+
209+
val balances = Arguments.createArray()
210+
_claimable_balances.iterator().forEach { balance ->
211+
balances.pushMap(balance.asJson)
212+
}
213+
result.putArray("claimable_balances", balances)
214+
return result
215+
}
216+
202217
fun WritableMap.putHexString(key: String, bytes: ByteArray?) {
203218
if (bytes != null) {
204219
putString(key, bytes.hexEncodedString())
@@ -434,56 +449,60 @@ fun UserConfig.mergeWithMap(map: ReadableMap): UserConfig {
434449
return this
435450
}
436451

437-
fun ChainMonitor.getClaimableBalancesAsJson(ignoredChannels: Array<ChannelDetails>): WritableArray {
438-
val result = Arguments.createArray()
439-
440-
get_claimable_balances(ignoredChannels).iterator().forEach { balance ->
452+
val Balance.asJson: WritableMap
453+
get() {
441454
val map = Arguments.createMap()
442455
//Defaults if all castings for balance fail
443456
map.putInt("amount_satoshis", 0)
444457
map.putString("type", "Unknown")
445458

446-
(balance as? Balance.ClaimableAwaitingConfirmations)?.let { claimableAwaitingConfirmations ->
459+
(this as? Balance.ClaimableAwaitingConfirmations)?.let { claimableAwaitingConfirmations ->
447460
map.putInt("amount_satoshis", claimableAwaitingConfirmations.amount_satoshis.toInt())
448461
map.putInt("confirmation_height", claimableAwaitingConfirmations.confirmation_height)
449462
map.putString("type", "ClaimableAwaitingConfirmations")
450463
}
451464

452-
(balance as? Balance.ClaimableOnChannelClose)?.let { claimableOnChannelClose ->
465+
(this as? Balance.ClaimableOnChannelClose)?.let { claimableOnChannelClose ->
453466
map.putInt("amount_satoshis", claimableOnChannelClose.amount_satoshis.toInt())
454467
map.putString("type", "ClaimableOnChannelClose")
455468
}
456469

457-
(balance as? Balance.ContentiousClaimable)?.let { contentiousClaimable ->
470+
(this as? Balance.ContentiousClaimable)?.let { contentiousClaimable ->
458471
map.putInt("amount_satoshis", contentiousClaimable.amount_satoshis.toInt())
459472
map.putInt("timeout_height", contentiousClaimable.timeout_height)
460473
map.putString("type", "ContentiousClaimable")
461474
}
462475

463-
(balance as? Balance.CounterpartyRevokedOutputClaimable)?.let { counterpartyRevokedOutputClaimable ->
476+
(this as? Balance.CounterpartyRevokedOutputClaimable)?.let { counterpartyRevokedOutputClaimable ->
464477
map.putInt("amount_satoshis", counterpartyRevokedOutputClaimable.amount_satoshis.toInt())
465478
map.putString("type", "CounterpartyRevokedOutputClaimable")
466479
}
467480

468-
(balance as? Balance.MaybePreimageClaimableHTLC)?.let { maybePreimageClaimableHTLC ->
481+
(this as? Balance.MaybePreimageClaimableHTLC)?.let { maybePreimageClaimableHTLC ->
469482
map.putInt("amount_satoshis", maybePreimageClaimableHTLC.amount_satoshis.toInt())
470483
map.putInt("expiry_height", maybePreimageClaimableHTLC.expiry_height)
471484
map.putString("type", "MaybePreimageClaimableHTLC")
472485
}
473486

474-
(balance as? Balance.MaybeTimeoutClaimableHTLC)?.let { maybeTimeoutClaimableHTLC ->
487+
(this as? Balance.MaybeTimeoutClaimableHTLC)?.let { maybeTimeoutClaimableHTLC ->
475488
map.putInt("amount_satoshis", maybeTimeoutClaimableHTLC.amount_satoshis.toInt())
476489
map.putInt("claimable_height", maybeTimeoutClaimableHTLC.claimable_height)
477490
map.putString("type", "MaybeTimeoutClaimableHTLC")
478491
}
479492

480-
result.pushMap(map)
493+
return map
494+
}
495+
496+
fun ChainMonitor.getClaimableBalancesAsJson(ignoredChannels: Array<ChannelDetails>): WritableArray {
497+
val result = Arguments.createArray()
498+
499+
get_claimable_balances(ignoredChannels).iterator().forEach { balance ->
500+
result.pushMap(balance.asJson)
481501
}
482502

483503
return result
484504
}
485505

486-
487506
/// Helper for returning real network and currency as a tuple from a string
488507
fun getNetwork(chain: String): Pair<Network, Currency> {
489508
return when (chain) {

lib/android/src/main/java/com/reactnativeldk/LdkModule.kt

Lines changed: 72 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ import org.ldk.batteries.NioPeerHandler
1111
import org.ldk.enums.Currency
1212
import org.ldk.enums.Network
1313
import org.ldk.enums.Recipient
14+
import org.ldk.enums.RetryableSendFailure
15+
import org.ldk.impl.bindings.LDKPaymentSendFailure.DuplicatePayment
1416
import org.ldk.impl.bindings.get_ldk_c_bindings_version
1517
import org.ldk.impl.bindings.get_ldk_version
1618
import org.ldk.structs.*
1719
import org.ldk.structs.Result_Bolt11InvoiceParseOrSemanticErrorZ.Result_Bolt11InvoiceParseOrSemanticErrorZ_OK
1820
import org.ldk.structs.Result_Bolt11InvoiceSignOrCreationErrorZ.Result_Bolt11InvoiceSignOrCreationErrorZ_OK
1921
import org.ldk.structs.Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ.Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_OK
22+
import org.ldk.structs.Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ.Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_OK
23+
import org.ldk.structs.Result_NoneRetryableSendFailureZ.Result_NoneRetryableSendFailureZ_Err
2024
import org.ldk.structs.Result_PublicKeyNoneZ.Result_PublicKeyNoneZ_OK
2125
import org.ldk.structs.Result_StrSecp256k1ErrorZ.Result_StrSecp256k1ErrorZ_OK
2226
import org.ldk.util.UInt128
@@ -75,11 +79,9 @@ enum class LdkErrors {
7579
invoice_payment_fail_must_specify_amount,
7680
invoice_payment_fail_must_not_specify_amount,
7781
invoice_payment_fail_invoice,
78-
invoice_payment_fail_sending,
79-
invoice_payment_fail_resend_safe,
80-
invoice_payment_fail_parameter_error,
81-
invoice_payment_fail_partial,
82-
invoice_payment_fail_path_parameter_error,
82+
invoice_payment_fail_duplicate_payment,
83+
invoice_payment_fail_payment_expired,
84+
invoice_payment_fail_route_not_found,
8385
init_ldk_currency,
8486
invoice_create_failed,
8587
init_scorer_failed,
@@ -580,8 +582,8 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
580582
//MARK: Update methods
581583

582584
@ReactMethod
583-
fun updateFees(anchorChannelFee: Double, nonAnchorChannelFee: Double, channelCloseMinimum: Double, minAllowedAnchorChannelRemoteFee: Double, maxAllowedNonAnchorChannelRemoteFee: Double, onChainSweep: Double, minAllowedNonAnchorChannelRemoteFee: Double, promise: Promise) {
584-
feeEstimator.update(anchorChannelFee.toInt(), nonAnchorChannelFee.toInt(), channelCloseMinimum.toInt(), minAllowedAnchorChannelRemoteFee.toInt(), maxAllowedNonAnchorChannelRemoteFee.toInt(), onChainSweep.toInt(), minAllowedNonAnchorChannelRemoteFee.toInt())
585+
fun updateFees(anchorChannelFee: Double, nonAnchorChannelFee: Double, channelCloseMinimum: Double, minAllowedAnchorChannelRemoteFee: Double, onChainSweep: Double, minAllowedNonAnchorChannelRemoteFee: Double, promise: Promise) {
586+
feeEstimator.update(anchorChannelFee.toInt(), nonAnchorChannelFee.toInt(), channelCloseMinimum.toInt(), minAllowedAnchorChannelRemoteFee.toInt(), onChainSweep.toInt(), minAllowedNonAnchorChannelRemoteFee.toInt())
585587
handleResolve(promise, LdkCallbackResponses.fees_updated)
586588
}
587589

@@ -792,14 +794,27 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
792794
return handleReject(promise, LdkErrors.invoice_payment_fail_must_not_specify_amount)
793795
}
794796

795-
val res = if (isZeroValueInvoice)
796-
UtilMethods.pay_zero_value_invoice(invoice, amountSats.toLong() * 1000, Retry.timeout(timeoutSeconds.toLong()), channelManager) else
797-
UtilMethods.pay_invoice(invoice, Retry.timeout(timeoutSeconds.toLong()), channelManager)
797+
val paymentId = invoice.payment_hash()
798+
val detailsRes = if (isZeroValueInvoice)
799+
UtilMethods.payment_parameters_from_zero_amount_invoice(invoice, amountSats.toLong()) else
800+
UtilMethods.payment_parameters_from_invoice(invoice)
801+
802+
if (!detailsRes.is_ok) {
803+
return handleReject(promise, LdkErrors.invoice_payment_fail_invoice)
804+
}
805+
806+
val sendDetails = detailsRes as Result_C3Tuple_ThirtyTwoBytesRecipientOnionFieldsRouteParametersZNoneZ_OK
807+
val paymentHash = sendDetails.res._a
808+
val recipientOnion = sendDetails.res._b
809+
val routeParams = sendDetails.res._c
810+
811+
val res = channelManager!!.send_payment(paymentHash, recipientOnion, paymentId, routeParams, Retry.timeout(timeoutSeconds.toLong()))
812+
798813
if (res.is_ok) {
799814
channelManagerPersister.persistPaymentSent(hashMapOf(
800815
"bolt11_invoice" to paymentRequest,
801-
"description" to (invoice.into_signed_raw().raw_invoice().description()?.into_inner() ?: ""),
802-
"payment_id" to (res as Result_ThirtyTwoBytesPaymentErrorZ.Result_ThirtyTwoBytesPaymentErrorZ_OK).res.hexEncodedString(),
816+
"description" to (invoice.into_signed_raw().raw_invoice().description()?.to_str() ?: ""),
817+
"payment_id" to paymentId.hexEncodedString(),
803818
"payment_hash" to invoice.payment_hash().hexEncodedString(),
804819
"amount_sat" to if (isZeroValueInvoice) amountSats.toLong() else ((invoice.amount_milli_satoshis() as Option_u64Z.Some).some.toInt() / 1000),
805820
"unix_timestamp" to (System.currentTimeMillis() / 1000).toInt(),
@@ -809,39 +824,24 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
809824
return handleResolve(promise, LdkCallbackResponses.invoice_payment_success)
810825
}
811826

812-
val error = res as? Result_ThirtyTwoBytesPaymentErrorZ.Result_ThirtyTwoBytesPaymentErrorZ_Err
813-
814-
val invoiceError = error?.err as? PaymentError.Invoice
815-
if (invoiceError != null) {
816-
return handleReject(promise, LdkErrors.invoice_payment_fail_invoice, Error(invoiceError.invoice))
817-
}
818-
819-
val sendingError = error?.err as? PaymentError.Sending
820-
if (sendingError != null) {
821-
val paymentAllFailedResendSafe = sendingError.sending as? PaymentSendFailure.AllFailedResendSafe
822-
if (paymentAllFailedResendSafe != null) {
823-
return handleReject(promise, LdkErrors.invoice_payment_fail_resend_safe, Error(paymentAllFailedResendSafe.all_failed_resend_safe.map { it.toString() }.toString()))
824-
}
827+
val error = res as? Result_NoneRetryableSendFailureZ_Err
828+
?: return handleReject(promise, LdkErrors.invoice_payment_fail_unknown)
825829

826-
val paymentParameterError = sendingError.sending as? PaymentSendFailure.ParameterError
827-
if (paymentParameterError != null) {
828-
return handleReject(promise, LdkErrors.invoice_payment_fail_parameter_error, Error(paymentParameterError.parameter_error.toString()))
830+
when (error.err) {
831+
RetryableSendFailure.LDKRetryableSendFailure_DuplicatePayment -> {
832+
handleReject(promise, LdkErrors.invoice_payment_fail_duplicate_payment)
829833
}
830834

831-
val paymentPartialFailure = sendingError.sending as? PaymentSendFailure.PartialFailure
832-
if (paymentPartialFailure != null) {
833-
return handleReject(promise, LdkErrors.invoice_payment_fail_partial, Error(paymentPartialFailure.toString()))
835+
RetryableSendFailure.LDKRetryableSendFailure_PaymentExpired -> {
836+
handleReject(promise, LdkErrors.invoice_payment_fail_payment_expired)
834837
}
835838

836-
val paymentPathParameterError = sendingError.sending as? PaymentSendFailure.PathParameterError
837-
if (paymentPathParameterError != null) {
838-
return handleReject(promise, LdkErrors.invoice_payment_fail_path_parameter_error, Error(paymentPartialFailure.toString()))
839+
RetryableSendFailure.LDKRetryableSendFailure_RouteNotFound -> {
840+
handleReject(promise, LdkErrors.invoice_payment_fail_route_not_found)
839841
}
840842

841-
return handleReject(promise, LdkErrors.invoice_payment_fail_sending, Error("PaymentError.Sending: ${sendingError.sending.name}"))
843+
else -> handleReject(promise, LdkErrors.invoice_payment_fail_unknown)
842844
}
843-
844-
return handleReject(promise, LdkErrors.invoice_payment_fail_unknown)
845845
}
846846

847847
@ReactMethod
@@ -963,6 +963,40 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
963963
promise.resolve(list)
964964
}
965965

966+
@ReactMethod
967+
fun listChannelMonitors(ignoreOpenChannels: Boolean, promise: Promise) {
968+
val channelManager = channelManager ?: return handleReject(promise, LdkErrors.init_channel_manager)
969+
val keysManager = keysManager ?: return handleReject(promise, LdkErrors.init_keys_manager)
970+
if (channelStoragePath == "") {
971+
return handleReject(promise, LdkErrors.init_storage_path)
972+
}
973+
974+
val ignoredChannels = if (ignoreOpenChannels)
975+
channelManager.list_channels().map { it._channel_id.hexEncodedString() }.toTypedArray() else
976+
arrayOf()
977+
978+
val channelFiles = File(channelStoragePath).listFiles()
979+
980+
val result = Arguments.createArray()
981+
for (channelFile in channelFiles) {
982+
val channelId = channelFile.nameWithoutExtension
983+
984+
//Ignore open channels
985+
if (ignoredChannels.contains(channelId)) {
986+
continue
987+
}
988+
989+
val channelMonitor = UtilMethods.C2Tuple_ThirtyTwoBytesChannelMonitorZ_read(channelFile.readBytes(), keysManager!!.inner.as_EntropySource(), SignerProvider.new_impl(keysManager!!.signerProvider))
990+
991+
if (channelMonitor.is_ok) {
992+
val channelMonitorResult = (channelMonitor as Result_C2Tuple_ThirtyTwoBytesChannelMonitorZDecodeErrorZ_OK)
993+
result.pushMap(channelMonitorResult.res._b.asJson(channelMonitorResult.res._a.hexEncodedString()))
994+
}
995+
}
996+
997+
promise.resolve(result)
998+
}
999+
9661000
@ReactMethod
9671001
fun networkGraphListNodeIds(promise: Promise) {
9681002
val graph = networkGraph?.read_only() ?: return handleReject(promise, LdkErrors.init_network_graph)
@@ -1111,7 +1145,7 @@ class LdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMod
11111145

11121146
val output = TxOut(outputValue.toLong(), outputScriptPubKey.hexa())
11131147
val outpoint = OutPoint.of(outpointTxId.hexa().reversedArray(), outpointIndex.toInt().toShort())
1114-
val descriptor = SpendableOutputDescriptor.static_output(outpoint, output)
1148+
val descriptor = SpendableOutputDescriptor.static_output(outpoint, output, byteArrayOf())
11151149

11161150
val ldkDescriptors: MutableList<SpendableOutputDescriptor> = arrayListOf()
11171151
ldkDescriptors.add(descriptor)

lib/android/src/main/java/com/reactnativeldk/classes/CustomKeysManager.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import org.ldk.structs.Result_ShutdownScriptNoneZ
1010
import org.ldk.structs.Result_TransactionNoneZ
1111
import org.ldk.structs.Result_WriteableEcdsaChannelSignerDecodeErrorZ
1212
import org.ldk.structs.ShutdownScript
13-
import org.ldk.structs.SignerProvider
1413
import org.ldk.structs.SignerProvider.SignerProviderInterface
1514
import org.ldk.structs.SpendableOutputDescriptor
1615
import org.ldk.structs.TxOut
16+
import org.ldk.structs.WitnessProgram
1717
import org.ldk.structs.WriteableEcdsaChannelSigner
1818
import org.ldk.util.UInt128
1919
import org.ldk.util.WitnessVersion
@@ -59,15 +59,13 @@ class CustomKeysManager(
5959
class CustomSignerProvider : SignerProviderInterface {
6060
lateinit var customKeysManager: CustomKeysManager
6161

62-
override fun get_destination_script(): Result_CVec_u8ZNoneZ {
62+
override fun get_destination_script(p0: ByteArray?): Result_CVec_u8ZNoneZ {
6363
return Result_CVec_u8ZNoneZ.ok(customKeysManager.destinationScriptPublicKey)
6464
}
6565

6666
override fun get_shutdown_scriptpubkey(): Result_ShutdownScriptNoneZ {
67-
val res = ShutdownScript.new_witness_program(
68-
WitnessVersion(customKeysManager.witnessProgramVersion),
69-
customKeysManager.witnessProgram
70-
)
67+
val witness = WitnessProgram(customKeysManager.witnessProgram, WitnessVersion(customKeysManager.witnessProgramVersion))
68+
val res = ShutdownScript.new_witness_program(witness)
7169

7270
return if (res.is_ok) {
7371
Result_ShutdownScriptNoneZ.ok((res as Result_ShutdownScriptInvalidShutdownScriptZ.Result_ShutdownScriptInvalidShutdownScriptZ_OK).res)

lib/android/src/main/java/com/reactnativeldk/classes/LdkFeeEstimator.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,14 @@ class LdkFeeEstimator {
99
var nonAnchorChannelFee: Int = 0
1010
var channelCloseMinimum: Int = 0
1111
var minAllowedAnchorChannelRemoteFee: Int = 0
12-
var maxAllowedNonAnchorChannelRemoteFee: Int = 0
1312
var onChainSweep: Int = 0
1413
var minAllowedNonAnchorChannelRemoteFee: Int = 0
1514

16-
fun update(anchorChannelFee: Int, nonAnchorChannelFee: Int, channelCloseMinimum: Int, minAllowedAnchorChannelRemoteFee: Int, maxAllowedNonAnchorChannelRemoteFee: Int, onChainSweep: Int, minAllowedNonAnchorChannelRemoteFee: Int) {
15+
fun update(anchorChannelFee: Int, nonAnchorChannelFee: Int, channelCloseMinimum: Int, minAllowedAnchorChannelRemoteFee: Int, onChainSweep: Int, minAllowedNonAnchorChannelRemoteFee: Int) {
1716
this.anchorChannelFee = anchorChannelFee
1817
this.nonAnchorChannelFee = nonAnchorChannelFee
1918
this.channelCloseMinimum = channelCloseMinimum
2019
this.minAllowedAnchorChannelRemoteFee = minAllowedAnchorChannelRemoteFee
21-
this.maxAllowedNonAnchorChannelRemoteFee = maxAllowedNonAnchorChannelRemoteFee
2220
this.onChainSweep = onChainSweep
2321
this.minAllowedNonAnchorChannelRemoteFee = minAllowedNonAnchorChannelRemoteFee
2422

@@ -31,7 +29,6 @@ class LdkFeeEstimator {
3129
ConfirmationTarget.LDKConfirmationTarget_NonAnchorChannelFee -> nonAnchorChannelFee
3230
ConfirmationTarget.LDKConfirmationTarget_ChannelCloseMinimum -> channelCloseMinimum
3331
ConfirmationTarget.LDKConfirmationTarget_MinAllowedAnchorChannelRemoteFee -> minAllowedAnchorChannelRemoteFee
34-
ConfirmationTarget.LDKConfirmationTarget_MaxAllowedNonAnchorChannelRemoteFee -> maxAllowedNonAnchorChannelRemoteFee
3532
ConfirmationTarget.LDKConfirmationTarget_OnChainSweep -> onChainSweep
3633
ConfirmationTarget.LDKConfirmationTarget_MinAllowedNonAnchorChannelRemoteFee -> minAllowedNonAnchorChannelRemoteFee
3734
else -> {

0 commit comments

Comments
 (0)