Skip to content

Commit

Permalink
Use TxId and TxHash instead of raw ByteVectors
Browse files Browse the repository at this point in the history
See for details:
- ACINQ/bitcoin-kmp#90
- ACINQ/lightning-kmp#524

Transaction ids are still stored as byte arrays in the
database (use txId.value to get the raw data), but we
should use the correct types whenever possible.

Use toString() to get the txid as an hexa string.
  • Loading branch information
dpad85 committed Nov 30, 2023
1 parent ac4bd7a commit a723176
Show file tree
Hide file tree
Showing 18 changed files with 68 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<ByteVector32>,
val trustedSwapInTxs: Set<TxId>,
// TODO: add custom electrum address, fiat currencies, ...
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -366,7 +367,7 @@ class SqlitePaymentsDb(
}

suspend fun listPaymentsForTxId(
txId: ByteVector32
txId: TxId
): List<WalletPayment> = withContext(Dispatchers.Default) {
database.transactionWithResult {
linkTxToPaymentQueries.listWalletPaymentIdsForTx(txId).mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -71,7 +72,7 @@ sealed class IncomingOriginData {
IncomingOriginTypeVersion.INVOICE_V0 -> format.decodeFromString<Invoice.V0>(json).let { IncomingPayment.Origin.Invoice(PaymentRequest.read(it.paymentRequest)) }
IncomingOriginTypeVersion.SWAPIN_V0 -> format.decodeFromString<SwapIn.V0>(json).let { IncomingPayment.Origin.SwapIn(it.address) }
IncomingOriginTypeVersion.ONCHAIN_V0 -> format.decodeFromString<OnChain.V0>(json).let {
IncomingPayment.Origin.OnChain(it.txId, it.outpoints.toSet())
IncomingPayment.Origin.OnChain(TxId(it.txId), it.outpoints.toSet())
}
}
}
Expand All @@ -86,5 +87,5 @@ fun IncomingPayment.Origin.mapToDb(): Pair<IncomingOriginTypeVersion, ByteArray>
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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
)
Expand All @@ -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,
)
Expand All @@ -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,
)
Expand All @@ -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,
)
Expand All @@ -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,
)
Expand All @@ -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,
)
Expand All @@ -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,
)
Expand All @@ -246,7 +247,7 @@ fun List<IncomingPayment.ReceivedWith>.mapToDb(): Pair<IncomingReceivedWithTypeV
serviceFee = it.serviceFee,
miningFee = it.miningFee,
channelId = it.channelId,
txId = it.txId,
txId = it.txId.value,
confirmedAt = it.confirmedAt,
lockedAt = it.lockedAt,
)
Expand All @@ -255,7 +256,7 @@ fun List<IncomingPayment.ReceivedWith>.mapToDb(): Pair<IncomingReceivedWithTypeV
serviceFee = it.serviceFee,
miningFee = it.miningFee,
channelId = it.channelId,
txId = it.txId,
txId = it.txId.value,
confirmedAt = it.confirmedAt,
lockedAt = it.lockedAt,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ package fr.acinq.phoenix.db.payments

import com.squareup.sqldelight.runtime.coroutines.asFlow
import com.squareup.sqldelight.runtime.coroutines.mapToList
import fr.acinq.bitcoin.ByteVector32
import fr.acinq.bitcoin.byteVector32
import fr.acinq.bitcoin.TxId
import fr.acinq.phoenix.data.WalletPaymentId
import fr.acinq.phoenix.db.PaymentsDatabase
import kotlinx.coroutines.flow.*
Expand All @@ -31,20 +30,20 @@ class LinkTxToPaymentQueries(val database: PaymentsDatabase) {
return linkTxQueries.listUnconfirmed().asFlow().mapToList()
}

fun listWalletPaymentIdsForTx(txId: ByteVector32): List<WalletPaymentId> {
return linkTxQueries.getPaymentIdForTx(tx_id = txId.toByteArray()).executeAsList()
fun listWalletPaymentIdsForTx(txId: TxId): List<WalletPaymentId> {
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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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,
Expand Down
Loading

0 comments on commit a723176

Please sign in to comment.