From 7b124e7f9a1ba7de7b80cde62f39ab4dc8e9b3e5 Mon Sep 17 00:00:00 2001 From: sstone Date: Thu, 15 Feb 2024 11:58:53 +0100 Subject: [PATCH] Use Chain type provided by bitcoin-kmp --- .../kotlin/fr/acinq/lightning/NodeParams.kt | 19 ++--------- .../acinq/lightning/channel/InteractiveTx.kt | 26 ++++++++------- .../fr/acinq/lightning/crypto/KeyManager.kt | 33 +++++++++---------- .../acinq/lightning/crypto/LocalKeyManager.kt | 23 +++++++------ .../lightning/transactions/SwapInProtocol.kt | 17 +++++----- .../electrum/SwapInManagerTestsCommon.kt | 3 +- .../lightning/channel/RecoveryTestsCommon.kt | 3 +- .../states/WaitForAcceptChannelTestsCommon.kt | 3 +- .../crypto/LocalKeyManagerTestsCommon.kt | 25 +++++++------- .../fr/acinq/lightning/tests/TestConstants.kt | 9 ++--- .../lightning/wire/InitTlvTestsCommon.kt | 4 +-- 11 files changed, 75 insertions(+), 90 deletions(-) diff --git a/src/commonMain/kotlin/fr/acinq/lightning/NodeParams.kt b/src/commonMain/kotlin/fr/acinq/lightning/NodeParams.kt index 54e1e58c4..22ecad6cd 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/NodeParams.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/NodeParams.kt @@ -1,7 +1,7 @@ package fr.acinq.lightning import co.touchlab.kermit.Logger -import fr.acinq.bitcoin.Block +import fr.acinq.bitcoin.Bitcoin import fr.acinq.bitcoin.PublicKey import fr.acinq.bitcoin.Satoshi import fr.acinq.lightning.Lightning.nodeFee @@ -152,7 +152,7 @@ data class NodeParams( val autoReconnect: Boolean, val initialRandomReconnectDelaySeconds: Long, val maxReconnectIntervalSeconds: Long, - val chain: Chain, + val chain: Bitcoin.Chain, val channelFlags: Byte, val paymentRequestExpirySeconds: Long, val multiPartPaymentExpirySeconds: Long, @@ -183,7 +183,7 @@ data class NodeParams( /** * Library integrators should use this constructor and override values. */ - constructor(chain: Chain, loggerFactory: LoggerFactory, keyManager: KeyManager) : this( + constructor(chain: Bitcoin.Chain, loggerFactory: LoggerFactory, keyManager: KeyManager) : this( loggerFactory = loggerFactory, keyManager = keyManager, alias = "lightning-kmp", @@ -244,17 +244,4 @@ data class NodeParams( paymentRecipientExpiryParams = RecipientCltvExpiryParams(CltvExpiryDelta(75), CltvExpiryDelta(200)), liquidityPolicy = MutableStateFlow(LiquidityPolicy.Auto(maxAbsoluteFee = 2_000.sat, maxRelativeFeeBasisPoints = 3_000 /* 3000 = 30 % */, skipAbsoluteFeeCheck = false)) ) - - sealed class Chain(val name: String, private val genesis: Block) { - object Regtest : Chain("Regtest", Block.RegtestGenesisBlock) - object Testnet : Chain("Testnet", Block.TestnetGenesisBlock) - object Mainnet : Chain("Mainnet", Block.LivenetGenesisBlock) - - fun isMainnet(): Boolean = this is Mainnet - fun isTestnet(): Boolean = this is Testnet - - val chainHash by lazy { genesis.hash } - - override fun toString(): String = name - } } diff --git a/src/commonMain/kotlin/fr/acinq/lightning/channel/InteractiveTx.kt b/src/commonMain/kotlin/fr/acinq/lightning/channel/InteractiveTx.kt index b559a30a2..7b3daeabf 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/channel/InteractiveTx.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/channel/InteractiveTx.kt @@ -686,24 +686,25 @@ data class InteractiveTxSession( } } is Either.Left -> { - val txAddInput = when (msg.value) { - is InteractiveTxInput.LocalOnly -> TxAddInput(fundingParams.channelId, msg.value.serialId, msg.value.previousTx, msg.value.previousTxOutput, msg.value.sequence) + val inputOutgoing = msg.value + val txAddInput = when (inputOutgoing) { + is InteractiveTxInput.LocalOnly -> TxAddInput(fundingParams.channelId, inputOutgoing.serialId, inputOutgoing.previousTx, inputOutgoing.previousTxOutput, inputOutgoing.sequence) is InteractiveTxInput.LocalLegacySwapIn -> { val swapInParams = TxAddInputTlv.SwapInParamsLegacy(swapInKeys.userPublicKey, swapInKeys.remoteServerPublicKey, swapInKeys.refundDelay) - TxAddInput(fundingParams.channelId, msg.value.serialId, msg.value.previousTx, msg.value.previousTxOutput, msg.value.sequence, TlvStream(swapInParams)) + TxAddInput(fundingParams.channelId, inputOutgoing.serialId, inputOutgoing.previousTx, inputOutgoing.previousTxOutput, inputOutgoing.sequence, TlvStream(swapInParams)) } is InteractiveTxInput.LocalSwapIn -> { val swapInParams = TxAddInputTlv.SwapInParams(swapInKeys.userPublicKey, swapInKeys.remoteServerPublicKey, swapInKeys.userRefundPublicKey, swapInKeys.refundDelay) - TxAddInput(fundingParams.channelId, msg.value.serialId, msg.value.previousTx, msg.value.previousTxOutput, msg.value.sequence, TlvStream(swapInParams)) + TxAddInput(fundingParams.channelId, inputOutgoing.serialId, inputOutgoing.previousTx, inputOutgoing.previousTxOutput, inputOutgoing.sequence, TlvStream(swapInParams)) } - is InteractiveTxInput.Shared -> TxAddInput(fundingParams.channelId, msg.value.serialId, msg.value.outPoint, msg.value.sequence) + is InteractiveTxInput.Shared -> TxAddInput(fundingParams.channelId, inputOutgoing.serialId, inputOutgoing.outPoint, inputOutgoing.sequence) } - val nextSecretNonces = when (msg.value) { + val nextSecretNonces = when (inputOutgoing) { // Generate a secret nonce for this input if we don't already have one. - is InteractiveTxInput.LocalSwapIn -> when (secretNonces[msg.value.serialId]) { + is InteractiveTxInput.LocalSwapIn -> when (secretNonces[inputOutgoing.serialId]) { null -> { val secretNonce = Musig2.generateNonce(randomBytes32(), swapInKeys.userPrivateKey, listOf(swapInKeys.userPublicKey, swapInKeys.remoteServerPublicKey)) - secretNonces + (msg.value.serialId to secretNonce) + secretNonces + (inputOutgoing.serialId to secretNonce) } else -> secretNonces } @@ -713,10 +714,11 @@ data class InteractiveTxSession( Pair(next, InteractiveTxSessionAction.SendMessage(txAddInput)) } is Either.Right -> { - val next = copy(toSend = toSend.tail(), localOutputs = localOutputs + msg.value, txCompleteSent = null) - val txAddOutput = when (msg.value) { - is InteractiveTxOutput.Local -> TxAddOutput(fundingParams.channelId, msg.value.serialId, msg.value.amount, msg.value.pubkeyScript) - is InteractiveTxOutput.Shared -> TxAddOutput(fundingParams.channelId, msg.value.serialId, msg.value.amount, msg.value.pubkeyScript) + val outputOutgoing = msg.value + val next = copy(toSend = toSend.tail(), localOutputs = localOutputs + outputOutgoing, txCompleteSent = null) + val txAddOutput = when (outputOutgoing) { + is InteractiveTxOutput.Local -> TxAddOutput(fundingParams.channelId, outputOutgoing.serialId, outputOutgoing.amount, outputOutgoing.pubkeyScript) + is InteractiveTxOutput.Shared -> TxAddOutput(fundingParams.channelId, outputOutgoing.serialId, outputOutgoing.amount, outputOutgoing.pubkeyScript) } Pair(next, InteractiveTxSessionAction.SendMessage(txAddOutput)) } diff --git a/src/commonMain/kotlin/fr/acinq/lightning/crypto/KeyManager.kt b/src/commonMain/kotlin/fr/acinq/lightning/crypto/KeyManager.kt index 33716dede..850e2ede3 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/crypto/KeyManager.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/crypto/KeyManager.kt @@ -7,7 +7,6 @@ import fr.acinq.bitcoin.crypto.musig2.SecretNonce import fr.acinq.bitcoin.io.ByteArrayInput import fr.acinq.bitcoin.utils.Either import fr.acinq.lightning.DefaultSwapInParams -import fr.acinq.lightning.NodeParams import fr.acinq.lightning.blockchain.fee.FeeratePerKw import fr.acinq.lightning.transactions.SwapInProtocol import fr.acinq.lightning.transactions.SwapInProtocolLegacy @@ -71,7 +70,7 @@ interface KeyManager { } data class Bip84OnChainKeys( - private val chain: NodeParams.Chain, + private val chain: Bitcoin.Chain, private val master: DeterministicWallet.ExtendedPrivateKey, val account: Long ) { @@ -80,8 +79,8 @@ interface KeyManager { val xpub: String = DeterministicWallet.encode( input = DeterministicWallet.publicKey(xpriv), prefix = when (chain) { - NodeParams.Chain.Testnet, NodeParams.Chain.Regtest -> DeterministicWallet.vpub - NodeParams.Chain.Mainnet -> DeterministicWallet.zpub + Bitcoin.Chain.Testnet, Bitcoin.Chain.Regtest, Bitcoin.Chain.Signet -> DeterministicWallet.vpub + Bitcoin.Chain.Mainnet -> DeterministicWallet.zpub } ) @@ -101,9 +100,9 @@ interface KeyManager { } companion object { - fun bip84BasePath(chain: NodeParams.Chain) = when (chain) { - NodeParams.Chain.Regtest, NodeParams.Chain.Testnet -> KeyPath.empty / hardened(84) / hardened(1) - NodeParams.Chain.Mainnet -> KeyPath.empty / hardened(84) / hardened(0) + fun bip84BasePath(chain: Bitcoin.Chain) = when (chain) { + Bitcoin.Chain.Regtest, Bitcoin.Chain.Testnet, Bitcoin.Chain.Signet -> KeyPath.empty / hardened(84) / hardened(1) + Bitcoin.Chain.Mainnet -> KeyPath.empty / hardened(84) / hardened(0) } } } @@ -116,7 +115,7 @@ interface KeyManager { * The keys used are static across swaps to make recovery easier. */ data class SwapInOnChainKeys( - private val chain: NodeParams.Chain, + private val chain: Bitcoin.Chain, private val master: DeterministicWallet.ExtendedPrivateKey, val remoteServerPublicKey: PublicKey, val refundDelay: Int = DefaultSwapInParams.RefundDelay @@ -200,20 +199,20 @@ interface KeyManager { } companion object { - private fun swapInKeyBasePath(chain: NodeParams.Chain) = when (chain) { - NodeParams.Chain.Regtest, NodeParams.Chain.Testnet -> KeyPath.empty / hardened(51) / hardened(0) - NodeParams.Chain.Mainnet -> KeyPath.empty / hardened(52) / hardened(0) + private fun swapInKeyBasePath(chain: Bitcoin.Chain) = when (chain) { + Bitcoin.Chain.Regtest, Bitcoin.Chain.Testnet, Bitcoin.Chain.Signet -> KeyPath.empty / hardened(51) / hardened(0) + Bitcoin.Chain.Mainnet -> KeyPath.empty / hardened(52) / hardened(0) } - fun swapInUserKeyPath(chain: NodeParams.Chain) = swapInKeyBasePath(chain) / hardened(0) + fun swapInUserKeyPath(chain: Bitcoin.Chain) = swapInKeyBasePath(chain) / hardened(0) - fun swapInLocalServerKeyPath(chain: NodeParams.Chain) = swapInKeyBasePath(chain) / hardened(1) + fun swapInLocalServerKeyPath(chain: Bitcoin.Chain) = swapInKeyBasePath(chain) / hardened(1) - fun swapInUserRefundKeyPath(chain: NodeParams.Chain) = swapInKeyBasePath(chain) / hardened(2) / 0L + fun swapInUserRefundKeyPath(chain: Bitcoin.Chain) = swapInKeyBasePath(chain) / hardened(2) / 0L - fun encodedSwapInUserKeyPath(chain: NodeParams.Chain) = when (chain) { - NodeParams.Chain.Regtest, NodeParams.Chain.Testnet -> "51h/0h/0h" - NodeParams.Chain.Mainnet -> "52h/0h/0h" + fun encodedSwapInUserKeyPath(chain: Bitcoin.Chain) = when (chain) { + Bitcoin.Chain.Regtest, Bitcoin.Chain.Testnet, Bitcoin.Chain.Signet -> "51h/0h/0h" + Bitcoin.Chain.Mainnet -> "52h/0h/0h" } /** Swap-in servers use a different swap-in key for different users. */ diff --git a/src/commonMain/kotlin/fr/acinq/lightning/crypto/LocalKeyManager.kt b/src/commonMain/kotlin/fr/acinq/lightning/crypto/LocalKeyManager.kt index 87adcfded..d8764fb8a 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/crypto/LocalKeyManager.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/crypto/LocalKeyManager.kt @@ -5,7 +5,6 @@ import fr.acinq.bitcoin.DeterministicWallet.derivePrivateKey import fr.acinq.bitcoin.DeterministicWallet.hardened import fr.acinq.bitcoin.crypto.Pack import fr.acinq.lightning.Lightning.secureRandom -import fr.acinq.lightning.NodeParams.Chain import fr.acinq.lightning.crypto.LocalKeyManager.Companion.channelKeyPath /** @@ -34,7 +33,7 @@ import fr.acinq.lightning.crypto.LocalKeyManager.Companion.channelKeyPath * @param seed seed from which the channel keys will be derived * @param remoteSwapInExtendedPublicKey xpub belonging to our swap-in server, that must be used in our swap address */ -data class LocalKeyManager(val seed: ByteVector, val chain: Chain, val remoteSwapInExtendedPublicKey: String) : KeyManager { +data class LocalKeyManager(val seed: ByteVector, val chain: Bitcoin.Chain, val remoteSwapInExtendedPublicKey: String) : KeyManager { private val master = DeterministicWallet.generate(seed) @@ -47,7 +46,7 @@ data class LocalKeyManager(val seed: ByteVector, val chain: Chain, val remoteSwa override val swapInOnChainWallet: KeyManager.SwapInOnChainKeys = run { val (prefix, xpub) = DeterministicWallet.ExtendedPublicKey.decode(remoteSwapInExtendedPublicKey) val expectedPrefix = when (chain) { - Chain.Mainnet -> DeterministicWallet.xpub + Bitcoin.Chain.Mainnet -> DeterministicWallet.xpub else -> DeterministicWallet.tpub } require(prefix == expectedPrefix) { "unexpected swap-in xpub prefix $prefix (expected $expectedPrefix)" } @@ -150,21 +149,21 @@ data class LocalKeyManager(val seed: ByteVector, val chain: Chain, val remoteSwa return KeyPath(path) } - fun channelKeyBasePath(chain: Chain) = when (chain) { - Chain.Regtest, Chain.Testnet -> KeyPath.empty / hardened(48) / hardened(1) - Chain.Mainnet -> KeyPath.empty / hardened(50) / hardened(1) + fun channelKeyBasePath(chain: Bitcoin.Chain) = when (chain) { + Bitcoin.Chain.Regtest, Bitcoin.Chain.Testnet, Bitcoin.Chain.Signet -> KeyPath.empty / hardened(48) / hardened(1) + Bitcoin.Chain.Mainnet -> KeyPath.empty / hardened(50) / hardened(1) } /** Path for node keys generated by eclair-core */ @Deprecated("used for backward-compat with eclair-core", replaceWith = ReplaceWith("nodeKeyBasePath(chain)")) - fun eclairNodeKeyBasePath(chain: Chain) = when (chain) { - Chain.Regtest, Chain.Testnet -> KeyPath.empty / hardened(46) / hardened(0) - Chain.Mainnet -> KeyPath.empty / hardened(47) / hardened(0) + fun eclairNodeKeyBasePath(chain: Bitcoin.Chain) = when (chain) { + Bitcoin.Chain.Regtest, Bitcoin.Chain.Testnet, Bitcoin.Chain.Signet -> KeyPath.empty / hardened(46) / hardened(0) + Bitcoin.Chain.Mainnet -> KeyPath.empty / hardened(47) / hardened(0) } - fun nodeKeyBasePath(chain: Chain) = when (chain) { - Chain.Regtest, Chain.Testnet -> KeyPath.empty / hardened(48) / hardened(0) - Chain.Mainnet -> KeyPath.empty / hardened(50) / hardened(0) + fun nodeKeyBasePath(chain: Bitcoin.Chain) = when (chain) { + Bitcoin.Chain.Regtest, Bitcoin.Chain.Testnet, Bitcoin.Chain.Signet -> KeyPath.empty / hardened(48) / hardened(0) + Bitcoin.Chain.Mainnet -> KeyPath.empty / hardened(50) / hardened(0) } } } diff --git a/src/commonMain/kotlin/fr/acinq/lightning/transactions/SwapInProtocol.kt b/src/commonMain/kotlin/fr/acinq/lightning/transactions/SwapInProtocol.kt index d55a2d380..2381494f7 100644 --- a/src/commonMain/kotlin/fr/acinq/lightning/transactions/SwapInProtocol.kt +++ b/src/commonMain/kotlin/fr/acinq/lightning/transactions/SwapInProtocol.kt @@ -5,7 +5,6 @@ import fr.acinq.bitcoin.crypto.musig2.IndividualNonce import fr.acinq.bitcoin.crypto.musig2.Musig2 import fr.acinq.bitcoin.crypto.musig2.SecretNonce import fr.acinq.bitcoin.utils.Either -import fr.acinq.lightning.NodeParams /** * new swap-in protocol based on musig2 and taproot: (user key + server key) OR (user refund key + delay) @@ -24,7 +23,7 @@ data class SwapInProtocol(val userPublicKey: PublicKey, val serverPublicKey: Pub private val scriptTree = ScriptTree.Leaf(0, refundScript) val pubkeyScript: List = Script.pay2tr(internalPublicKey, scriptTree) - fun address(chain: NodeParams.Chain): String = Bitcoin.addressFromPublicKeyScript(chain.chainHash, pubkeyScript).right!! + fun address(chain: Bitcoin.Chain): String = Bitcoin.addressFromPublicKeyScript(chain.chainHash, pubkeyScript).right!! fun witness(fundingTx: Transaction, index: Int, parentTxOuts: List, userNonce: IndividualNonce, serverNonce: IndividualNonce, userPartialSig: ByteVector32, serverPartialSig: ByteVector32): Either { val publicKeys = listOf(userPublicKey, serverPublicKey) @@ -56,10 +55,10 @@ data class SwapInProtocol(val userPublicKey: PublicKey, val serverPublicKey: Pub } companion object { - fun privateDescriptor(chain: NodeParams.Chain, userPublicKey: PublicKey, serverPublicKey: PublicKey, refundDelay: Int, masterRefundKey: DeterministicWallet.ExtendedPrivateKey): String { + fun privateDescriptor(chain: Bitcoin.Chain, userPublicKey: PublicKey, serverPublicKey: PublicKey, refundDelay: Int, masterRefundKey: DeterministicWallet.ExtendedPrivateKey): String { val internalPubKey = Musig2.aggregateKeys(listOf(userPublicKey, serverPublicKey)) val prefix = when (chain) { - NodeParams.Chain.Mainnet -> DeterministicWallet.xprv + Bitcoin.Chain.Mainnet -> DeterministicWallet.xprv else -> DeterministicWallet.tprv } val xpriv = DeterministicWallet.encode(masterRefundKey, prefix) @@ -68,10 +67,10 @@ data class SwapInProtocol(val userPublicKey: PublicKey, val serverPublicKey: Pub return "$desc#$checksum" } - fun publicDescriptor(chain: NodeParams.Chain, userPublicKey: PublicKey, serverPublicKey: PublicKey, refundDelay: Int, masterRefundKey: DeterministicWallet.ExtendedPublicKey): String { + fun publicDescriptor(chain: Bitcoin.Chain, userPublicKey: PublicKey, serverPublicKey: PublicKey, refundDelay: Int, masterRefundKey: DeterministicWallet.ExtendedPublicKey): String { val internalPubKey = Musig2.aggregateKeys(listOf(userPublicKey, serverPublicKey)) val prefix = when (chain) { - NodeParams.Chain.Mainnet -> DeterministicWallet.xpub + Bitcoin.Chain.Mainnet -> DeterministicWallet.xpub else -> DeterministicWallet.tpub } val xpub = DeterministicWallet.encode(masterRefundKey, prefix) @@ -99,7 +98,7 @@ data class SwapInProtocolLegacy(val userPublicKey: PublicKey, val serverPublicKe val pubkeyScript: List = Script.pay2wsh(redeemScript) - fun address(chain: NodeParams.Chain): String = Bitcoin.addressFromPublicKeyScript(chain.chainHash, pubkeyScript).right!! + fun address(chain: Bitcoin.Chain): String = Bitcoin.addressFromPublicKeyScript(chain.chainHash, pubkeyScript).right!! fun witness(userSig: ByteVector64, serverSig: ByteVector64): ScriptWitness { return ScriptWitness(listOf(Scripts.der(serverSig, SigHash.SIGHASH_ALL), Scripts.der(userSig, SigHash.SIGHASH_ALL), Script.write(redeemScript).byteVector())) @@ -130,12 +129,12 @@ data class SwapInProtocolLegacy(val userPublicKey: PublicKey, val serverPublicKe * @param refundDelay refund delay * @return a p2wsh descriptor that can be imported in bitcoin core (from version 24 on) to recover user funds once the funding delay has passed. */ - fun descriptor(chain: NodeParams.Chain, masterPublicKey: DeterministicWallet.ExtendedPublicKey, userExtendedPublicKey: DeterministicWallet.ExtendedPublicKey, remoteServerPublicKey: PublicKey, refundDelay: Int): String { + fun descriptor(chain: Bitcoin.Chain, masterPublicKey: DeterministicWallet.ExtendedPublicKey, userExtendedPublicKey: DeterministicWallet.ExtendedPublicKey, remoteServerPublicKey: PublicKey, refundDelay: Int): String { // Since child public keys cannot be derived from a master xpub when hardened derivation is used, // we need to provide the fingerprint of the master xpub and the hardened derivation path. // This lets wallets that have access to the master xpriv derive the corresponding private and public keys. val masterFingerprint = ByteVector(Crypto.hash160(masterPublicKey.publickeybytes).take(4).toByteArray()) - val encodedChildKey = DeterministicWallet.encode(userExtendedPublicKey, testnet = chain != NodeParams.Chain.Mainnet) + val encodedChildKey = DeterministicWallet.encode(userExtendedPublicKey, testnet = chain != Bitcoin.Chain.Mainnet) val userKey = "[${masterFingerprint.toHex()}/${userExtendedPublicKey.path.asString('h').removePrefix("m/")}]$encodedChildKey" return "wsh(and_v(v:pk($userKey),or_d(pk(${remoteServerPublicKey.toHex()}),older($refundDelay))))" } diff --git a/src/commonTest/kotlin/fr/acinq/lightning/blockchain/electrum/SwapInManagerTestsCommon.kt b/src/commonTest/kotlin/fr/acinq/lightning/blockchain/electrum/SwapInManagerTestsCommon.kt index 5a9f9e747..7ac28bcd1 100644 --- a/src/commonTest/kotlin/fr/acinq/lightning/blockchain/electrum/SwapInManagerTestsCommon.kt +++ b/src/commonTest/kotlin/fr/acinq/lightning/blockchain/electrum/SwapInManagerTestsCommon.kt @@ -2,7 +2,6 @@ package fr.acinq.lightning.blockchain.electrum import fr.acinq.bitcoin.* import fr.acinq.lightning.Lightning.randomBytes32 -import fr.acinq.lightning.NodeParams import fr.acinq.lightning.SwapInParams import fr.acinq.lightning.blockchain.BITCOIN_FUNDING_DEPTHOK import fr.acinq.lightning.blockchain.WatchEventConfirmed @@ -25,7 +24,7 @@ class SwapInManagerTestsCommon : LightningTestSuite() { private val dummyPubkey = PublicKey.fromHex("02eae982c8563a1c256ee9b4655af7d4c0dc545d1e5c350a68c5f8902cd4cf3021") private val dummyScript = Script.pay2wpkh(dummyPubkey) - private val dummyAddress = Bitcoin.computeP2WpkhAddress(dummyPubkey, NodeParams.Chain.Regtest.chainHash) + private val dummyAddress = Bitcoin.computeP2WpkhAddress(dummyPubkey, Bitcoin.Chain.Regtest.chainHash) @Test fun `swap funds`() { diff --git a/src/commonTest/kotlin/fr/acinq/lightning/channel/RecoveryTestsCommon.kt b/src/commonTest/kotlin/fr/acinq/lightning/channel/RecoveryTestsCommon.kt index 1e3c08be1..b0e3ad5a0 100644 --- a/src/commonTest/kotlin/fr/acinq/lightning/channel/RecoveryTestsCommon.kt +++ b/src/commonTest/kotlin/fr/acinq/lightning/channel/RecoveryTestsCommon.kt @@ -2,7 +2,6 @@ package fr.acinq.lightning.channel import fr.acinq.bitcoin.* import fr.acinq.lightning.MilliSatoshi -import fr.acinq.lightning.NodeParams import fr.acinq.lightning.blockchain.fee.FeeratePerKw import fr.acinq.lightning.crypto.LocalKeyManager import fr.acinq.lightning.tests.TestConstants @@ -37,7 +36,7 @@ class RecoveryTestsCommon { // use Bob's mnemonic words to initialise his key manager val seed = MnemonicCode.toSeed(TestConstants.Bob.mnemonics, "").toByteVector32() - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, TestConstants.aliceSwapInServerXpub) // recompute our channel keys from the extracted funding pubkey and see if we can find and spend our output fun findAndSpend(fundingKey: PublicKey): Transaction? { diff --git a/src/commonTest/kotlin/fr/acinq/lightning/channel/states/WaitForAcceptChannelTestsCommon.kt b/src/commonTest/kotlin/fr/acinq/lightning/channel/states/WaitForAcceptChannelTestsCommon.kt index c14c31113..1f4fd506e 100644 --- a/src/commonTest/kotlin/fr/acinq/lightning/channel/states/WaitForAcceptChannelTestsCommon.kt +++ b/src/commonTest/kotlin/fr/acinq/lightning/channel/states/WaitForAcceptChannelTestsCommon.kt @@ -1,5 +1,6 @@ package fr.acinq.lightning.channel.states +import fr.acinq.bitcoin.Bitcoin import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.Satoshi import fr.acinq.lightning.* @@ -107,7 +108,7 @@ class WaitForAcceptChannelTestsCommon : LightningTestSuite() { // we don't want their dust limit to be below 354 val lowDustLimitSatoshis = 353.sat // but we only enforce it on mainnet - val aliceMainnet = alice.copy(ctx = alice.ctx.copy(staticParams = alice.ctx.staticParams.copy(nodeParams = alice.staticParams.nodeParams.copy(chain = NodeParams.Chain.Mainnet)))) + val aliceMainnet = alice.copy(ctx = alice.ctx.copy(staticParams = alice.ctx.staticParams.copy(nodeParams = alice.staticParams.nodeParams.copy(chain = Bitcoin.Chain.Mainnet)))) val (alice1, actions1) = aliceMainnet.process(ChannelCommand.MessageReceived(accept.copy(dustLimit = lowDustLimitSatoshis))) assertIs>(alice1) val error = actions1.hasOutgoingMessage() diff --git a/src/commonTest/kotlin/fr/acinq/lightning/crypto/LocalKeyManagerTestsCommon.kt b/src/commonTest/kotlin/fr/acinq/lightning/crypto/LocalKeyManagerTestsCommon.kt index 058dff5df..968fc2a07 100644 --- a/src/commonTest/kotlin/fr/acinq/lightning/crypto/LocalKeyManagerTestsCommon.kt +++ b/src/commonTest/kotlin/fr/acinq/lightning/crypto/LocalKeyManagerTestsCommon.kt @@ -3,7 +3,6 @@ package fr.acinq.lightning.crypto import fr.acinq.bitcoin.* import fr.acinq.bitcoin.crypto.Pack import fr.acinq.lightning.Lightning.randomKey -import fr.acinq.lightning.NodeParams import fr.acinq.lightning.blockchain.fee.FeeratePerByte import fr.acinq.lightning.blockchain.fee.FeeratePerKw import fr.acinq.lightning.tests.TestConstants @@ -21,7 +20,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { // if this test breaks it means that we will generate a different node id from // the same seed, which could be a problem during an upgrade val seed = ByteVector("17b086b228025fa8f4416324b6ba2ec36e68570ae2fc3d392520969f2a9d0c1501") - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, TestConstants.aliceSwapInServerXpub) assertEquals(keyManager.nodeKeys.nodeKey.publicKey, PublicKey.fromHex("0392ea6e914abcee840dc8a763b02ba5ac47e0ac3fadcd5294f9516fe353882522")) } @@ -30,14 +29,14 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { // if this test breaks it means that we will generate a different legacy node id from // the same seed, which could be a problem during migration from legacy to kmp val seed = MnemonicCode.toSeed("sock able evoke work output half bamboo energy simple fiber unhappy afford", passphrase = "").byteVector() - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, TestConstants.aliceSwapInServerXpub) assertEquals(keyManager.nodeKeys.legacyNodeKey.publicKey, PublicKey.fromHex("0388a99397c5a599c4c56ea2b9f938bd2893744a590af7c1f05c9c3ee822c13fdc")) } @Test fun `generate channel keys`() { val seed = ByteVector("aeb3e9b5642cd4523e9e09164047f60adb413633549c3c6189192921311894d501") - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, TestConstants.aliceSwapInServerXpub) val fundingKeyPath = makeFundingKeyPath(ByteVector("06535806c1aa73971ec4877a5e2e684fa636136c073810f190b63eefc58ca488"), isInitiator = false) val channelKeys = keyManager.channelKeys(fundingKeyPath) @@ -57,8 +56,8 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { @Test fun `generate different node ids from the same seed on different chains`() { val seed = ByteVector("17b086b228025fa8f4416324b6ba2ec36e68570ae2fc3d392520969f2a9d0c1501") - val keyManager1 = LocalKeyManager(seed, NodeParams.Chain.Regtest, DeterministicWallet.encode(dummyExtendedPubkey, testnet = true)) - val keyManager2 = LocalKeyManager(seed, NodeParams.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) + val keyManager1 = LocalKeyManager(seed, Bitcoin.Chain.Regtest, DeterministicWallet.encode(dummyExtendedPubkey, testnet = true)) + val keyManager2 = LocalKeyManager(seed, Bitcoin.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) assertNotEquals(keyManager1.nodeKeys.nodeKey.publicKey, keyManager2.nodeKeys.nodeKey.publicKey) val fundingKeyPath = KeyPath("1") val channelKeys1 = keyManager1.channelKeys(fundingKeyPath) @@ -85,7 +84,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { @Test fun `test vectors -- testnet + initiator`() { val seed = ByteVector("17b086b228025fa8f4416324b6ba2ec36e68570ae2fc3d392520969f2a9d0c1501") - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, TestConstants.aliceSwapInServerXpub) val fundingKeyPath = makeFundingKeyPath(ByteVector("be4fa97c62b9f88437a3be577b31eb48f2165c7bc252194a15ff92d995778cfb"), isInitiator = true) val localParams = TestConstants.Alice.channelParams().copy(fundingKeyPath = fundingKeyPath) @@ -102,7 +101,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { @Test fun `test vectors -- testnet + non-initiator`() { val seed = ByteVector("aeb3e9b5642cd4523e9e09164047f60adb413633549c3c6189192921311894d501") - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, TestConstants.aliceSwapInServerXpub) val fundingKeyPath = makeFundingKeyPath(ByteVector("06535806c1aa73971ec4877a5e2e684fa636136c073810f190b63eefc58ca488"), isInitiator = false) val localParams = TestConstants.Alice.channelParams().copy(fundingKeyPath = fundingKeyPath) @@ -119,7 +118,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { @Test fun `test vectors -- mainnet + initiator`() { val seed = ByteVector("d8d5431487c2b19ee6486aad6c3bdfb99d10b727bade7fa848e2ab7901c15bff01") - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) val fundingKeyPath = makeFundingKeyPath(ByteVector("ec1c41cd6be2b6e4ef46c1107f6c51fbb2066d7e1f7720bde4715af233ae1322"), isInitiator = true) val localParams = TestConstants.Alice.channelParams().copy(fundingKeyPath = fundingKeyPath) @@ -136,7 +135,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { @Test fun `test vectors -- mainnet + non-initiator`() { val seed = ByteVector("4b809dd593b36131c454d60c2f7bdfd49d12ec455e5b657c47a9ca0f5dfc5eef01") - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) val fundingKeyPath = makeFundingKeyPath(ByteVector("2b4f045be5303d53f9d3a84a1e70c12251168dc29f300cf9cece0ec85cd8182b"), isInitiator = false) val localParams = TestConstants.Alice.channelParams().copy(fundingKeyPath = fundingKeyPath) @@ -155,7 +154,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { // basic test taken from https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki val mnemonics = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".split(" ") val seed = MnemonicCode.toSeed(mnemonics, "").toByteVector() - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Mainnet, DeterministicWallet.encode(dummyExtendedPubkey, testnet = false)) assertEquals(keyManager.finalOnChainWallet.address(addressIndex = 0L), "bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu") assertEquals(keyManager.finalOnChainWallet.address(addressIndex = 1L), "bc1qnjg0jd8228aq7egyzacy8cys3knf9xvrerkf9g") assertEquals(keyManager.finalOnChainWallet.privateKey(addressIndex = 1L).toBase58(Base58.Prefix.SecretKey), "Kxpf5b8p3qX56DKEe5NqWbNUP9MnqoRFzZwHRtsFqhzuvUJsYZCy") @@ -168,7 +167,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { // reference data was generated from electrum 4.1.5 val mnemonics = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".split(" ") val seed = MnemonicCode.toSeed(mnemonics, "").toByteVector() - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Testnet, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Testnet, TestConstants.aliceSwapInServerXpub) assertEquals(keyManager.finalOnChainWallet.privateKey(addressIndex = 0L).toBase58(Base58.Prefix.SecretKeyTestnet), "cTGhosGriPpuGA586jemcuH9pE9spwUmneMBmYYzrQEbY92DJrbo") assertEquals(keyManager.finalOnChainWallet.privateKey(addressIndex = 1L).toBase58(Base58.Prefix.SecretKeyTestnet), "cQFUndrpAyMaE3HAsjMCXiT94MzfsABCREat1x7Qe3Mtq9KihD4V") assertEquals(keyManager.finalOnChainWallet.xpub, "vpub5Y6cjg78GGuNLsaPhmYsiw4gYX3HoQiRBiSwDaBXKUafCt9bNwWQiitDk5VZ5BVxYnQdwoTyXSs2JHRPAgjAvtbBrf8ZhDYe2jWAqvZVnsc") @@ -216,7 +215,7 @@ class LocalKeyManagerTestsCommon : LightningTestSuite() { fun `compute descriptors to recover swap-in funds`() { val seed = MnemonicCode.toSeed("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", "") val master = DeterministicWallet.generate(seed) - val chain = NodeParams.Chain.Regtest + val chain = Bitcoin.Chain.Regtest val userPublicKey = PrivateKey.fromHex("0101010101010101010101010101010101010101010101010101010101010101").publicKey() val remoteServerPublicKey = PrivateKey.fromHex("0202020202020202020202020202020202020202020202020202020202020202").publicKey() val userRefundExtendedPrivateKey = DeterministicWallet.derivePrivateKey(master, KeyManager.SwapInOnChainKeys.swapInUserRefundKeyPath(chain)) diff --git a/src/commonTest/kotlin/fr/acinq/lightning/tests/TestConstants.kt b/src/commonTest/kotlin/fr/acinq/lightning/tests/TestConstants.kt index 2c4509f1a..bb69977bc 100644 --- a/src/commonTest/kotlin/fr/acinq/lightning/tests/TestConstants.kt +++ b/src/commonTest/kotlin/fr/acinq/lightning/tests/TestConstants.kt @@ -1,5 +1,6 @@ package fr.acinq.lightning.tests +import fr.acinq.bitcoin.Bitcoin import fr.acinq.bitcoin.ByteVector import fr.acinq.bitcoin.ByteVector32 import fr.acinq.bitcoin.MnemonicCode @@ -47,10 +48,10 @@ object TestConstants { private val mnemonics = MnemonicCode.toMnemonics(entropy) private val seed = MnemonicCode.toSeed(mnemonics, "").toByteVector32() - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, bobSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, bobSwapInServerXpub) val walletParams = WalletParams(NodeUri(Bob.keyManager.nodeKeys.nodeKey.publicKey, "bob.com", 9735), trampolineFees, InvoiceDefaultRoutingFees(1_000.msat, 100, CltvExpiryDelta(144)), swapInParams) val nodeParams = NodeParams( - chain = NodeParams.Chain.Regtest, + chain = Bitcoin.Chain.Regtest, loggerFactory = testLoggerFactory, keyManager = keyManager, ).copy( @@ -96,10 +97,10 @@ object TestConstants { val mnemonics = MnemonicCode.toMnemonics(entropy) private val seed = MnemonicCode.toSeed(mnemonics, "").toByteVector32() - val keyManager = LocalKeyManager(seed, NodeParams.Chain.Regtest, aliceSwapInServerXpub) + val keyManager = LocalKeyManager(seed, Bitcoin.Chain.Regtest, aliceSwapInServerXpub) val walletParams = WalletParams(NodeUri(Alice.keyManager.nodeKeys.nodeKey.publicKey, "alice.com", 9735), trampolineFees, InvoiceDefaultRoutingFees(1_000.msat, 100, CltvExpiryDelta(144)), swapInParams) val nodeParams = NodeParams( - chain = NodeParams.Chain.Regtest, + chain = Bitcoin.Chain.Regtest, loggerFactory = testLoggerFactory, keyManager = keyManager, ).copy( diff --git a/src/commonTest/kotlin/fr/acinq/lightning/wire/InitTlvTestsCommon.kt b/src/commonTest/kotlin/fr/acinq/lightning/wire/InitTlvTestsCommon.kt index b8f348a51..09ac763e9 100644 --- a/src/commonTest/kotlin/fr/acinq/lightning/wire/InitTlvTestsCommon.kt +++ b/src/commonTest/kotlin/fr/acinq/lightning/wire/InitTlvTestsCommon.kt @@ -1,9 +1,9 @@ package fr.acinq.lightning.wire +import fr.acinq.bitcoin.Bitcoin import fr.acinq.bitcoin.Crypto import fr.acinq.bitcoin.MnemonicCode import fr.acinq.bitcoin.byteVector -import fr.acinq.lightning.NodeParams import fr.acinq.lightning.crypto.LocalKeyManager import fr.acinq.lightning.tests.TestConstants import fr.acinq.lightning.tests.utils.LightningTestSuite @@ -15,7 +15,7 @@ import kotlin.test.assertTrue class InitTlvTestsCommon : LightningTestSuite() { @Test fun `legacy phoenix TLV`() { - val keyManager = LocalKeyManager(MnemonicCode.toSeed("sock able evoke work output half bamboo energy simple fiber unhappy afford", passphrase = "").byteVector(), NodeParams.Chain.Testnet, TestConstants.aliceSwapInServerXpub) + val keyManager = LocalKeyManager(MnemonicCode.toSeed("sock able evoke work output half bamboo energy simple fiber unhappy afford", passphrase = "").byteVector(), Bitcoin.Chain.Testnet, TestConstants.aliceSwapInServerXpub) val testCases = listOf( Pair( first = keyManager.nodeKeys.legacyNodeKey.publicKey,