diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/AppConfiguration.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/AppConfiguration.kt index d02b6d744..232480f63 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/AppConfiguration.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/AppConfiguration.kt @@ -2,6 +2,7 @@ package fr.acinq.phoenix.data import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.Satoshi +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.payment.LiquidityPolicy import fr.acinq.lightning.utils.ServerAddress import fr.acinq.lightning.utils.sat @@ -238,7 +239,7 @@ data class StartupParams( /** The liquidity policy must be injected into the node params manager. */ val liquidityPolicy: LiquidityPolicy, /** List of transaction ids that can be used for swap-in even if they are zero-conf. */ - val trustedSwapInTxs: Set, + val trustedSwapInTxs: Set, // TODO: add custom electrum address, fiat currencies, ... ) diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/LocalChannelInfo.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/LocalChannelInfo.kt index e95eb2518..62c670fd5 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/LocalChannelInfo.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/data/LocalChannelInfo.kt @@ -17,6 +17,7 @@ package fr.acinq.phoenix.data import fr.acinq.bitcoin.Satoshi +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.MilliSatoshi import fr.acinq.lightning.channel.states.* import fr.acinq.lightning.json.JsonSerializers @@ -66,7 +67,7 @@ data class LocalChannelInfo( val changes = state.commitments.changes state.commitments.active.map { CommitmentInfo( - fundingTxId = it.fundingTxId.toHex(), + fundingTxId = it.fundingTxId, fundingTxIndex = it.fundingTxIndex, fundingAmount = it.fundingAmount, balanceForSend = it.availableBalanceForSend(params, changes) @@ -84,7 +85,7 @@ data class LocalChannelInfo( val changes = state.commitments.changes state.commitments.inactive.map { CommitmentInfo( - fundingTxId = it.fundingTxId.toHex(), + fundingTxId = it.fundingTxId, fundingTxIndex = it.fundingTxIndex, fundingAmount = it.fundingAmount, balanceForSend = it.availableBalanceForSend(params, changes) @@ -99,7 +100,7 @@ data class LocalChannelInfo( /** Stripped-down commitment, easier to consume from the frontend. */ data class CommitmentInfo( - val fundingTxId: String, + val fundingTxId: TxId, val fundingTxIndex: Long, val fundingAmount: Satoshi, val balanceForSend: MilliSatoshi, diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/SqlitePaymentsDb.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/SqlitePaymentsDb.kt index 2477de53d..a5641f03d 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/SqlitePaymentsDb.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/SqlitePaymentsDb.kt @@ -23,6 +23,7 @@ import com.squareup.sqldelight.runtime.coroutines.mapToList import com.squareup.sqldelight.runtime.coroutines.mapToOne import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.Crypto +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.MilliSatoshi import fr.acinq.lightning.channel.ChannelException import fr.acinq.lightning.db.* @@ -309,7 +310,7 @@ class SqlitePaymentsDb( } } - override suspend fun setLocked(txId: ByteVector32) { + override suspend fun setLocked(txId: TxId) { database.transaction { val lockedAt = currentTimestampMillis() linkTxToPaymentQueries.setLocked(txId, lockedAt) @@ -335,7 +336,7 @@ class SqlitePaymentsDb( } } - suspend fun setConfirmed(txId: ByteVector32) = withContext(Dispatchers.Default) { + suspend fun setConfirmed(txId: TxId) = withContext(Dispatchers.Default) { database.transaction { val confirmedAt = currentTimestampMillis() linkTxToPaymentQueries.setConfirmed(txId, confirmedAt) @@ -366,7 +367,7 @@ class SqlitePaymentsDb( } suspend fun listPaymentsForTxId( - txId: ByteVector32 + txId: TxId ): List = withContext(Dispatchers.Default) { database.transactionWithResult { linkTxToPaymentQueries.listWalletPaymentIdsForTx(txId).mapNotNull { diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/ChannelCloseType.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/ChannelCloseType.kt index cddee11ed..1210bf86a 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/ChannelCloseType.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/ChannelCloseType.kt @@ -1,5 +1,6 @@ package fr.acinq.phoenix.db.cloud +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.ChannelCloseOutgoingPayment import fr.acinq.lightning.db.ChannelClosingType import fr.acinq.lightning.utils.UUID @@ -34,7 +35,7 @@ data class ChannelClosePaymentWrapper( address = payment.address, isSentToDefaultAddress = payment.isSentToDefaultAddress, miningFeeSat = payment.miningFees.sat, - txId = payment.txId.toByteArray(), + txId = payment.txId.value.toByteArray(), createdAt = payment.createdAt, confirmedAt = payment.confirmedAt, lockedAt = payment.lockedAt, @@ -49,7 +50,7 @@ data class ChannelClosePaymentWrapper( address = address, isSentToDefaultAddress = isSentToDefaultAddress, miningFees = miningFeeSat.sat, - txId = txId.toByteVector32(), + txId = TxId(txId), createdAt = createdAt, confirmedAt = confirmedAt, lockedAt = lockedAt, diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceCpfpPaymentType.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceCpfpPaymentType.kt index a297e9091..86504a38c 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceCpfpPaymentType.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceCpfpPaymentType.kt @@ -1,5 +1,6 @@ package fr.acinq.phoenix.db.cloud +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.SpliceCpfpOutgoingPayment import fr.acinq.lightning.utils.UUID import fr.acinq.lightning.utils.sat @@ -29,7 +30,7 @@ data class SpliceCpfpPaymentWrapper( id = payment.id, miningFeeSat = payment.miningFees.sat, channelId = payment.channelId.toByteArray(), - txId = payment.txId.toByteArray(), + txId = payment.txId.value.toByteArray(), createdAt = payment.createdAt, confirmedAt = payment.confirmedAt, lockedAt = payment.lockedAt @@ -40,7 +41,7 @@ data class SpliceCpfpPaymentWrapper( id = id, miningFees = miningFeeSat.sat, channelId = channelId.toByteVector32(), - txId = txId.toByteVector32(), + txId = TxId(txId), createdAt = createdAt, confirmedAt = confirmedAt, lockedAt = lockedAt, diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceOutgoingType.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceOutgoingType.kt index 39557691d..9d642ca5a 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceOutgoingType.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/cloud/SpliceOutgoingType.kt @@ -1,5 +1,6 @@ package fr.acinq.phoenix.db.cloud +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.SpliceOutgoingPayment import fr.acinq.lightning.utils.UUID import fr.acinq.lightning.utils.sat @@ -30,7 +31,7 @@ data class SpliceOutgoingPaymentWrapper( amountSat = payment.recipientAmount.sat, address = payment.address, miningFeeSat = payment.miningFees.sat, - txId = payment.txId.toByteArray(), + txId = payment.txId.value.toByteArray(), channelId = payment.channelId.toByteArray(), createdAt = payment.createdAt, confirmedAt = payment.confirmedAt, @@ -43,7 +44,7 @@ data class SpliceOutgoingPaymentWrapper( recipientAmount = amountSat.sat, address = address, miningFees = miningFeeSat.sat, - txId = txId.toByteVector32(), + txId = TxId(txId), channelId = channelId.toByteVector32(), createdAt = createdAt, confirmedAt = confirmedAt, diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/ChannelCloseOutgoingQueries.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/ChannelCloseOutgoingQueries.kt index 6a3d72798..43ad47bfd 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/ChannelCloseOutgoingQueries.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/ChannelCloseOutgoingQueries.kt @@ -16,6 +16,7 @@ package fr.acinq.phoenix.db.payments +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.ChannelCloseOutgoingPayment import fr.acinq.lightning.utils.UUID import fr.acinq.lightning.utils.sat @@ -40,7 +41,7 @@ class ChannelCloseOutgoingQueries(val database: PaymentsDatabase) { address = payment.address, is_default_address = if (payment.isSentToDefaultAddress) 1 else 0, mining_fees_sat = payment.miningFees.sat, - tx_id = payment.txId.toByteArray(), + tx_id = payment.txId.value.toByteArray(), created_at = payment.createdAt, confirmed_at = payment.confirmedAt, locked_at = payment.lockedAt, @@ -87,7 +88,7 @@ class ChannelCloseOutgoingQueries(val database: PaymentsDatabase) { address = address, isSentToDefaultAddress = is_default_address == 1L, miningFees = mining_fees_sat.sat, - txId = tx_id.toByteVector32(), + txId = TxId(tx_id), createdAt = created_at, confirmedAt = confirmed_at, lockedAt = locked_at, diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingOriginType.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingOriginType.kt index 221e1f616..a322538b8 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingOriginType.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingOriginType.kt @@ -23,6 +23,7 @@ package fr.acinq.phoenix.db.payments import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.OutPoint +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.IncomingPayment import fr.acinq.lightning.payment.PaymentRequest import fr.acinq.phoenix.db.payments.DbTypesHelper.decodeBlob @@ -71,7 +72,7 @@ sealed class IncomingOriginData { IncomingOriginTypeVersion.INVOICE_V0 -> format.decodeFromString(json).let { IncomingPayment.Origin.Invoice(PaymentRequest.read(it.paymentRequest)) } IncomingOriginTypeVersion.SWAPIN_V0 -> format.decodeFromString(json).let { IncomingPayment.Origin.SwapIn(it.address) } IncomingOriginTypeVersion.ONCHAIN_V0 -> format.decodeFromString(json).let { - IncomingPayment.Origin.OnChain(it.txId, it.outpoints.toSet()) + IncomingPayment.Origin.OnChain(TxId(it.txId), it.outpoints.toSet()) } } } @@ -86,5 +87,5 @@ fun IncomingPayment.Origin.mapToDb(): Pair is IncomingPayment.Origin.SwapIn -> IncomingOriginTypeVersion.SWAPIN_V0 to Json.encodeToString(IncomingOriginData.SwapIn.V0(address)).toByteArray(Charsets.UTF_8) is IncomingPayment.Origin.OnChain -> IncomingOriginTypeVersion.ONCHAIN_V0 to - Json.encodeToString(IncomingOriginData.OnChain.V0(txid, localInputs.toList())).toByteArray(Charsets.UTF_8) + Json.encodeToString(IncomingOriginData.OnChain.V0(txId.value, localInputs.toList())).toByteArray(Charsets.UTF_8) } diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingReceivedWithType.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingReceivedWithType.kt index fd0a73d5f..6623e3df7 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingReceivedWithType.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/IncomingReceivedWithType.kt @@ -25,6 +25,7 @@ package fr.acinq.phoenix.db.payments import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.Satoshi +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.MilliSatoshi import fr.acinq.lightning.db.IncomingPayment import fr.acinq.lightning.utils.UUID @@ -159,7 +160,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.fees, miningFee = 0.sat, channelId = it.channelId ?: ByteVector32.Zeroes, - txId = ByteVector32.Zeroes, + txId = TxId(ByteVector32.Zeroes), confirmedAt = 0, lockedAt = 0, ) @@ -173,7 +174,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.fees, miningFee = 0.sat, channelId = it.channelId ?: ByteVector32.Zeroes, - txId = ByteVector32.Zeroes, + txId = TxId(ByteVector32.Zeroes), confirmedAt = 0, lockedAt = 0, ) @@ -183,7 +184,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.fees, miningFee = 0.sat, channelId = it.channelId ?: ByteVector32.Zeroes, - txId = ByteVector32.Zeroes, + txId = TxId(ByteVector32.Zeroes), confirmedAt = 0, lockedAt = 0, ) @@ -199,7 +200,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.fees, miningFee = 0.sat, channelId = it.channelId ?: ByteVector32.Zeroes, - txId = ByteVector32.Zeroes, + txId = TxId(ByteVector32.Zeroes), confirmedAt = 0, lockedAt = 0, ) @@ -208,7 +209,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.fees, miningFee = 0.sat, channelId = it.channelId ?: ByteVector32.Zeroes, - txId = ByteVector32.Zeroes, + txId = TxId(ByteVector32.Zeroes), confirmedAt = 0, lockedAt = 0, ) @@ -217,7 +218,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.serviceFee, miningFee = it.miningFee, channelId = it.channelId, - txId = it.txId, + txId = TxId(it.txId), confirmedAt = it.confirmedAt, lockedAt = it.lockedAt, ) @@ -226,7 +227,7 @@ sealed class IncomingReceivedWithData { serviceFee = it.serviceFee, miningFee = it.miningFee, channelId = it.channelId, - txId = it.txId, + txId = TxId(it.txId), confirmedAt = it.confirmedAt, lockedAt = it.lockedAt, ) @@ -246,7 +247,7 @@ fun List.mapToDb(): Pair.mapToDb(): Pair { - return linkTxQueries.getPaymentIdForTx(tx_id = txId.toByteArray()).executeAsList() + fun listWalletPaymentIdsForTx(txId: TxId): List { + return linkTxQueries.getPaymentIdForTx(tx_id = txId.value.toByteArray()).executeAsList() .mapNotNull { WalletPaymentId.create(it.type, it.id) } } - fun linkTxToPayment(txId: ByteVector32, walletPaymentId: WalletPaymentId) { - linkTxQueries.linkTxToPayment(tx_id = txId.toByteArray(), type = walletPaymentId.dbType.value, id = walletPaymentId.dbId) + fun linkTxToPayment(txId: TxId, walletPaymentId: WalletPaymentId) { + linkTxQueries.linkTxToPayment(tx_id = txId.value.toByteArray(), type = walletPaymentId.dbType.value, id = walletPaymentId.dbId) } - fun setConfirmed(txId: ByteVector32, confirmedAt: Long) { - linkTxQueries.setConfirmed(tx_id = txId.toByteArray(), confirmed_at = confirmedAt) + fun setConfirmed(txId: TxId, confirmedAt: Long) { + linkTxQueries.setConfirmed(tx_id = txId.value.toByteArray(), confirmed_at = confirmedAt) } - fun setLocked(txId: ByteVector32, lockedAt: Long) { - linkTxQueries.setLocked(tx_id = txId.toByteArray(), locked_at = lockedAt) + fun setLocked(txId: TxId, lockedAt: Long) { + linkTxQueries.setLocked(tx_id = txId.value.toByteArray(), locked_at = lockedAt) } } \ No newline at end of file diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceCpfpOutgoingQueries.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceCpfpOutgoingQueries.kt index e7b8baed0..2572343bf 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceCpfpOutgoingQueries.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceCpfpOutgoingQueries.kt @@ -16,6 +16,7 @@ package fr.acinq.phoenix.db.payments +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.SpliceCpfpOutgoingPayment import fr.acinq.lightning.db.SpliceOutgoingPayment import fr.acinq.lightning.utils.UUID @@ -34,7 +35,7 @@ class SpliceCpfpOutgoingQueries(val database: PaymentsDatabase) { id = payment.id.toString(), mining_fees_sat = payment.miningFees.sat, channel_id = payment.channelId.toByteArray(), - tx_id = payment.txId.toByteArray(), + tx_id = payment.txId.value.toByteArray(), created_at = payment.createdAt, confirmed_at = payment.confirmedAt, locked_at = payment.lockedAt @@ -78,7 +79,7 @@ class SpliceCpfpOutgoingQueries(val database: PaymentsDatabase) { id = UUID.fromString(id), miningFees = mining_fees_sat.sat, channelId = channel_id.toByteVector32(), - txId = tx_id.toByteVector32(), + txId = TxId(tx_id), createdAt = created_at, confirmedAt = confirmed_at, lockedAt = locked_at diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceOutgoingQueries.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceOutgoingQueries.kt index 2156aa34c..31767c686 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceOutgoingQueries.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/payments/SpliceOutgoingQueries.kt @@ -16,6 +16,7 @@ package fr.acinq.phoenix.db.payments +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.db.SpliceOutgoingPayment import fr.acinq.lightning.utils.UUID import fr.acinq.lightning.utils.sat @@ -35,7 +36,7 @@ class SpliceOutgoingQueries(val database: PaymentsDatabase) { address = payment.address, mining_fees_sat = payment.miningFees.sat, channel_id = payment.channelId.toByteArray(), - tx_id = payment.txId.toByteArray(), + tx_id = payment.txId.value.toByteArray(), created_at = payment.createdAt, confirmed_at = payment.confirmedAt, locked_at = payment.lockedAt @@ -82,7 +83,7 @@ class SpliceOutgoingQueries(val database: PaymentsDatabase) { recipientAmount = recipient_amount_sat.sat, address = address, miningFees = mining_fees_sat.sat, - txId = tx_id.toByteVector32(), + txId = TxId(tx_id), channelId = channel_id.toByteVector32(), createdAt = created_at, confirmedAt = confirmed_at, diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/serializers/v1/OutpointSerializer.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/serializers/v1/OutpointSerializer.kt index 5d3e00452..395640c25 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/serializers/v1/OutpointSerializer.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/db/serializers/v1/OutpointSerializer.kt @@ -16,15 +16,15 @@ package fr.acinq.phoenix.db.serializers.v1 -import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.OutPoint +import fr.acinq.bitcoin.TxHash class OutpointSerializer : AbstractStringSerializer( name = "Outpoint", - fromString = { str -> - str.split(":").let { - OutPoint(ByteVector32.fromValidHex(it[0]), it[1].toLong()) + fromString = { serialized -> + serialized.split(":").let { + OutPoint(hash = TxHash(it[0]), index = it[1].toLong()) } }, - toString = { outpoint -> "${outpoint.hash.toHex()}:${outpoint.index}" } + toString = { outpoint -> "${outpoint.hash}:${outpoint.index}" } ) diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/managers/PaymentsManager.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/managers/PaymentsManager.kt index 242be5bc1..cae7bf09d 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/managers/PaymentsManager.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/managers/PaymentsManager.kt @@ -1,6 +1,7 @@ package fr.acinq.phoenix.managers import fr.acinq.bitcoin.ByteVector32 +import fr.acinq.bitcoin.TxId import fr.acinq.bitcoin.byteVector32 import fr.acinq.lightning.blockchain.electrum.ElectrumClient import fr.acinq.lightning.blockchain.electrum.getConfirmations @@ -110,12 +111,11 @@ class PaymentsManager( paymentsDb.listUnconfirmedTransactions(), configurationManager.electrumMessages ) { unconfirmedTxs, header -> - unconfirmedTxs to header?.blockHeight + unconfirmedTxs.map { TxId(it) } to header?.blockHeight }.collect { (unconfirmedTxs, blockHeight) -> if (blockHeight != null) { - val unconfirmedTxIds = unconfirmedTxs.map { it.byteVector32() } - log.debug { "checking confirmation status of ${unconfirmedTxIds.size} txs at block=$blockHeight" } - unconfirmedTxIds.forEach { txId -> + log.debug { "checking confirmation status of ${unconfirmedTxs.size} txs at block=$blockHeight" } + unconfirmedTxs.forEach { txId -> electrumClient.getConfirmations(txId)?.let { conf -> if (conf > 0) { log.debug { "transaction $txId has $conf confirmations, updating database" } @@ -144,7 +144,7 @@ class PaymentsManager( * payment(s) that triggered that change. */ suspend fun listPaymentsForTxId( - txId: ByteVector32 + txId: TxId ): List { return paymentsDb().listPaymentsForTxId(txId) } diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/BlockchainExplorer.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/BlockchainExplorer.kt index 4175dd975..1fb51a6a6 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/BlockchainExplorer.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/BlockchainExplorer.kt @@ -1,5 +1,6 @@ package fr.acinq.phoenix.utils +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.NodeParams @@ -10,7 +11,7 @@ class BlockchainExplorer(private val chain: NodeParams.Chain) { object BlockstreamInfo: Website("https://blockstream.info") } - fun txUrl(txId: String, website: Website = Website.MempoolSpace): String { + fun txUrl(txId: TxId, website: Website = Website.MempoolSpace): String { return when (website) { Website.MempoolSpace -> { when (chain) { diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/CsvWriter.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/CsvWriter.kt index 7bd7f8335..67da1a71b 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/CsvWriter.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/CsvWriter.kt @@ -126,7 +126,7 @@ class CsvWriter { is IncomingPayment.Origin.OnChain -> { // append txs ids if any, nothing otherwise val inputs = origin.localInputs.takeIf { it.isNotEmpty() }?.joinToString("\n- ") { - it.txid.toHex() + it.txid.toString() }?.let { "\n$it" } ?: "" "Swap-in to ${config.swapInAddress}$inputs" } diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/IosMigrationHelper.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/IosMigrationHelper.kt index f6538f981..0f782dd3d 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/IosMigrationHelper.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/IosMigrationHelper.kt @@ -18,6 +18,7 @@ package fr.acinq.phoenix.utils.migrations import fr.acinq.bitcoin.ByteVector import fr.acinq.bitcoin.ByteVector32 +import fr.acinq.bitcoin.TxId import fr.acinq.bitcoin.byteVector import fr.acinq.lightning.Feature import fr.acinq.lightning.MilliSatoshi @@ -120,7 +121,7 @@ object IosMigrationHelper { peer.send(WrappedChannelCommand(ByteVector32.fromValidHex(it.channelId), command)) } // Wait for the closing tx publication for each consolidated channel (map of channelId -> closing tx id) - val closingTxs: MutableMap = mutableMapOf() + val closingTxs: MutableMap = mutableMapOf() channelsToMigrate.map { ByteVector32.fromValidHex(it.channelId) }.forEach { channelId -> // Wait until closing tx is published val channel = peer.channelsFlow @@ -154,7 +155,7 @@ object IosMigrationHelper { } sealed class IosMigrationResult { - data class Success(val closingTxs: Map) : IosMigrationResult() + data class Success(val closingTxs: Map) : IosMigrationResult() sealed class Failure : IosMigrationResult() { data class Generic(val error: Throwable) : Failure() object InvalidClosingScript : Failure() diff --git a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/LegacyChannelCloseHelper.kt b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/LegacyChannelCloseHelper.kt index 206fdbffc..790bcb72a 100644 --- a/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/LegacyChannelCloseHelper.kt +++ b/phoenix-shared/src/commonMain/kotlin/fr.acinq.phoenix/utils/migrations/LegacyChannelCloseHelper.kt @@ -18,6 +18,7 @@ package fr.acinq.phoenix.utils.migrations import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.Satoshi +import fr.acinq.bitcoin.TxId import fr.acinq.lightning.MilliSatoshi import fr.acinq.lightning.db.ChannelCloseOutgoingPayment import fr.acinq.lightning.db.ChannelClosingType @@ -82,7 +83,7 @@ object LegacyChannelCloseHelper { || closingType == ChannelClosingType.Remote || closingType == ChannelClosingType.Other), miningFees = fees, - txId = closingTxId ?: ByteVector32.Zeroes, + txId = TxId(closingTxId ?: ByteVector32.Zeroes), createdAt = createdAt, confirmedAt = confirmedAt ?: createdAt, lockedAt = confirmedAt ?: createdAt,