Skip to content

Commit

Permalink
Use specific input types for sewgit and taproot inputs
Browse files Browse the repository at this point in the history
  • Loading branch information
sstone committed Jan 7, 2025
1 parent 42d559c commit 3681ad4
Show file tree
Hide file tree
Showing 11 changed files with 173 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -232,11 +232,11 @@ object Helpers {
if (isTaprootChannel) {
val fundingScript = musig2FundingScript(fundingPubkey1, fundingPubkey2)
val fundingTxOut = TxOut(fundingAmount, fundingScript)
return Transactions.InputInfo(OutPoint(fundingTxId, fundingTxOutputIndex.toLong()), fundingTxOut, ByteVector(write(fundingScript)))
return Transactions.InputInfo.SegwitInput(OutPoint(fundingTxId, fundingTxOutputIndex.toLong()), fundingTxOut, ByteVector(write(fundingScript)))
} else {
val fundingScript = multiSig2of2(fundingPubkey1, fundingPubkey2)
val fundingTxOut = TxOut(fundingAmount, pay2wsh(fundingScript))
return Transactions.InputInfo(OutPoint(fundingTxId, fundingTxOutputIndex.toLong()), fundingTxOut, ByteVector(write(fundingScript)))
return Transactions.InputInfo.SegwitInput(OutPoint(fundingTxId, fundingTxOutputIndex.toLong()), fundingTxOut, ByteVector(write(fundingScript)))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,12 @@
JsonSerializers.EncodedNodeIdSerializer::class,
JsonSerializers.BlindedHopSerializer::class,
JsonSerializers.BlindedRouteSerializer::class,
JsonSerializers.SegwitInputSerializer::class,
JsonSerializers.TaprootInputSerializer::class
)
@file:UseContextualSerialization(
PersistedChannelState::class
PersistedChannelState::class,
Transactions.InputInfo::class
)

package fr.acinq.lightning.json
Expand All @@ -133,6 +136,7 @@ import fr.acinq.lightning.payment.Bolt11Invoice.TaggedField
import fr.acinq.lightning.transactions.CommitmentSpec
import fr.acinq.lightning.transactions.IncomingHtlc
import fr.acinq.lightning.transactions.OutgoingHtlc
import fr.acinq.lightning.transactions.Transactions
import fr.acinq.lightning.utils.UUID
import fr.acinq.lightning.wire.*
import fr.acinq.lightning.wire.OfferTypes.OfferChains
Expand All @@ -143,10 +147,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.PolymorphicModuleBuilder
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.contextual
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.*

/**
* Json support for [ChannelState] based on `kotlinx-serialization`.
Expand Down Expand Up @@ -236,9 +237,16 @@ object JsonSerializers {
contextual(ByteVector32Serializer)
contextual(IndividualNonceSerializer)
contextual(SecretNonceSerializer)
contextual(ScriptTreeSerializer)
contextual(XonlyPublicKeySerializer)

contextual(Bolt11InvoiceSerializer)
contextual(OfferSerializer)

polymorphic(Transactions.InputInfo::class) {
subclass(Transactions.InputInfo.SegwitInput::class, SegwitInputSerializer)
subclass(Transactions.InputInfo.TaprootInput::class, TaprootInputSerializer)
}
}
}

Expand Down Expand Up @@ -415,6 +423,7 @@ object JsonSerializers {
object ByteVector64Serializer : StringSerializer<ByteVector64>()
object BlockHashSerializer : StringSerializer<BlockHash>()
object PublicKeySerializer : StringSerializer<PublicKey>()
object XonlyPublicKeySerializer : StringSerializer<XonlyPublicKey>()
object TxIdSerializer : StringSerializer<TxId>()
object KeyPathSerializer : StringSerializer<KeyPath>()
object ShortChannelIdSerializer : StringSerializer<ShortChannelId>()
Expand All @@ -423,9 +432,18 @@ object JsonSerializers {
object IndividualNonceSerializer : StringSerializer<IndividualNonce>({ "${it.data} " })
object SecretNonceSerializer : StringSerializer<SecretNonce>({ "<redacted>" })

@Serializer(forClass = ScriptTree::class)
object ScriptTreeSerializer

@Serializer(forClass = PublishableTxs::class)
object PublishableTxsSerializer

@Serializer(forClass = Transactions.InputInfo.SegwitInput::class)
object SegwitInputSerializer

@Serializer(forClass = Transactions.InputInfo.TaprootInput::class)
object TaprootInputSerializer

@Serializable
data class CommitmentsSpecSurrogate(val htlcsIn: List<UpdateAddHtlc>, val htlcsOut: List<UpdateAddHtlc>, val feerate: FeeratePerKw, val toLocal: MilliSatoshi, val toRemote: MilliSatoshi)
object CommitmentSpecSerializer : SurrogateSerializer<CommitmentSpec, CommitmentsSpecSurrogate>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -713,11 +713,10 @@ object Deserialization {
val outPoint = readOutPoint()
val txOut = TxOut.read(readDelimitedByteArray())
val redeemScript = readDelimitedByteArray().toByteVector()
val scriptTreeAndInternalKey = when (redeemScript.isEmpty()) {
true -> readNullable { readScriptTreeAndInternalKey() }
else -> null
return when (redeemScript.isEmpty()) {
true -> Transactions.InputInfo.TaprootInput(outPoint, txOut, readScriptTreeAndInternalKey())
else -> Transactions.InputInfo.SegwitInput(outPoint, txOut, redeemScript)
}
return Transactions.InputInfo(outPoint, txOut, redeemScript, scriptTreeAndInternalKey)
}

private fun Input.readOutPoint(): OutPoint = OutPoint.read(readDelimitedByteArray())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -634,9 +634,12 @@ object Serialization {
private fun Output.writeInputInfo(o: Transactions.InputInfo): Unit = o.run {
writeBtcObject(outPoint)
writeBtcObject(txOut)
writeDelimited(redeemScript.toByteArray())
if (redeemScript.isEmpty()) {
writeNullable(scriptTreeAndInternalKey) { writeScriptTreeAndInternalKey(it) }
when (o) {
is Transactions.InputInfo.SegwitInput -> writeDelimited(o.redeemScript.toByteArray())
is Transactions.InputInfo.TaprootInput -> {
writeDelimited(ByteArray(0))
writeScriptTreeAndInternalKey(o.scriptTreeAndInternalKey)
}
}
}

Expand Down
Loading

0 comments on commit 3681ad4

Please sign in to comment.