Fixes support for bitcoind taproot descriptor wallets (#4415)

This commit is contained in:
benthecarman 2022-06-23 07:10:51 -05:00 committed by GitHub
parent 5115d8d076
commit 99b75d166f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 29 additions and 27 deletions

View file

@ -194,6 +194,10 @@ object RpcOpts {
case object Bech32 extends AddressType {
override def toString: String = "bech32"
}
case object Bech32m extends AddressType {
override def toString: String = "bech32m"
}
}
sealed trait LabelPurpose

View file

@ -96,7 +96,7 @@ case class GetWalletInfoResult(
unconfirmed_balance: Bitcoins,
immature_balance: Bitcoins,
txcount: Int,
keypoololdest: UInt32,
keypoololdest: Option[UInt32],
keypoolsize: Int,
keypoolsize_hd_internal: Int,
paytxfee: BitcoinFeeUnit,

View file

@ -3,7 +3,8 @@ package org.bitcoins.rpc.common
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.AddressType
import org.bitcoins.core.protocol.P2PKHAddress
import org.bitcoins.crypto.ECPrivateKey
import org.bitcoins.rpc.client.common.BitcoindRpcClient
import org.bitcoins.rpc.client.common.{BitcoindRpcClient, BitcoindVersion}
import org.bitcoins.rpc.config.BitcoindInstanceLocal
import org.bitcoins.testkit.rpc.BitcoindRpcTestUtil
import org.bitcoins.testkit.util.BitcoindRpcTest
@ -11,8 +12,12 @@ import scala.concurrent.Future
class MultisigRpcTest extends BitcoindRpcTest {
val instance: BitcoindInstanceLocal =
BitcoindRpcTestUtil.instance(versionOpt = Some(BitcoindVersion.V21))
lazy val clientF: Future[BitcoindRpcClient] =
BitcoindRpcTestUtil.startedBitcoindRpcClient(clientAccum = clientAccum)
BitcoindRpcTestUtil.startedBitcoindRpcClient(instanceOpt = Some(instance),
clientAccum = clientAccum)
behavior of "MultisigRpc"

View file

@ -55,7 +55,8 @@ class WalletRpcTest extends BitcoindFixturesCachedPairV21 {
// This client's wallet is encrypted
lazy val walletClientF: Future[BitcoindRpcClient] = clientsF.flatMap { _ =>
val walletClient =
BitcoindRpcClient.withActorSystem(BitcoindRpcTestUtil.instance())
BitcoindRpcClient.withActorSystem(
BitcoindRpcTestUtil.instance(versionOpt = Some(BitcoindVersion.V21)))
for {
_ <- startClient(walletClient)

View file

@ -1,9 +1,7 @@
package org.bitcoins.rpc.v23
import org.bitcoins.commons.jsonmodels.bitcoind.RpcOpts.AddressType
import org.bitcoins.core.protocol.P2PKHAddress
import org.bitcoins.core.script.ScriptType
import org.bitcoins.crypto.ECPrivateKey
import org.bitcoins.core.protocol.Bech32mAddress
import org.bitcoins.rpc.client.common.BitcoindVersion
import org.bitcoins.rpc.client.v23.BitcoindV23RpcClient
import org.bitcoins.testkit.rpc.BitcoindFixturesFundedCachedV23
@ -29,24 +27,11 @@ class BitcoindV23RpcClientTest extends BitcoindFixturesFundedCachedV23 {
}
}
it should "be able to decode a reedem script" in {
client: BitcoindV23RpcClient =>
val ecPrivKey1 = ECPrivateKey.freshPrivateKey
val pubKey1 = ecPrivKey1.publicKey
for {
address <- client.getNewAddress(addressType = AddressType.Legacy)
multisig <-
client
.addMultiSigAddress(
2,
Vector(Left(pubKey1), Right(address.asInstanceOf[P2PKHAddress])))
decoded <- client.decodeScript(multisig.redeemScript)
} yield {
assert(decoded.typeOfScript.contains(ScriptType.MULTISIG))
// these fields are no longer returned since v23
// assert(decoded.reqSigs.isEmpty)
// assert(decoded.addresses.isEmpty)
}
it should "generate a bech32m address" in { client: BitcoindV23RpcClient =>
for {
address <- client.getNewAddress(addressType = AddressType.Bech32m)
} yield {
assert(address.isInstanceOf[Bech32mAddress])
}
}
}

View file

@ -455,7 +455,14 @@ trait BitcoindRpcTestUtil extends Logging {
val startedServers = servers.map { server =>
server.start().flatMap { res =>
val createWalletF = for {
_ <- res.createWallet("")
version <- server.version
descriptors = version match {
case V16 | V17 | V18 | V19 | V20 |
V21 | V22 | Experimental | Unknown =>
false
case V23 => true
}
_ <- res.createWallet("", descriptors = true)
} yield res
createWalletF.recoverWith { case NonFatal(_) =>