11package fr .acinq .bitcoin .scalacompat
22
3+ import fr .acinq .bitcoin .scalacompat .Crypto .TaprootTweak .KeyPathTweak
34import fr .acinq .bitcoin .scalacompat .Crypto .{PrivateKey , PublicKey , TaprootTweak }
45import fr .acinq .bitcoin .scalacompat .KotlinUtils ._
56import fr .acinq .bitcoin .{Bech32 , ScriptFlags , SigHash , SigVersion }
@@ -14,10 +15,10 @@ class TaprootSpec extends FunSuite {
1415 val (_, master) = DeterministicWallet .ExtendedPrivateKey .decode(" tprv8ZgxMBicQKsPeQQADibg4WF7mEasy3piWZUHyThAzJCPNgMHDVYhTCVfev3jFbDhcYm4GimeFMbbi9z1d9rfY1aL5wfJ9mNebQ4thJ62EJb" )
1516 val key = DeterministicWallet .derivePrivateKey(master, " 86'/1'/0'/0/1" )
1617 val internalKey = key.publicKey.xOnly
17- val script = Script .pay2tr(internalKey, scripts_opt = None )
18- val (outputKey, _) = internalKey.outputKey(TaprootTweak .NoScriptTweak )
18+ val script = Script .pay2tr(internalKey, KeyPathTweak )
19+ val (outputKey, _) = internalKey.outputKey(TaprootTweak .KeyPathTweak )
1920 assert(" tb1phlhs7afhqzkgv0n537xs939s687826vn8l24ldkrckvwsnlj3d7qj6u57c" == Bech32 .encodeWitnessAddress(" tb" , 1 , outputKey.pub.value.toByteArray))
20- assert(script == Script .pay2tr(outputKey ))
21+ assert(addressFromPublicKeyScript( Block . Testnet3GenesisBlock .hash, script).contains( " tb1phlhs7afhqzkgv0n537xs939s687826vn8l24ldkrckvwsnlj3d7qj6u57c " ))
2122
2223 // tx sends to tb1phlhs7afhqzkgv0n537xs939s687826vn8l24ldkrckvwsnlj3d7qj6u57c
2324 val tx = Transaction .read(
@@ -41,31 +42,31 @@ class TaprootSpec extends FunSuite {
4142 assert(Crypto .verifySignatureSchnorr(hash, sig, outputKey))
4243
4344 // re-create signature
44- val ourSig = Crypto .signSchnorr(hash, key.privateKey, TaprootTweak .NoScriptTweak )
45+ val ourSig = Crypto .signSchnorr(hash, key.privateKey, Some ( TaprootTweak .KeyPathTweak ) )
4546 assert(Crypto .verifySignatureSchnorr(hash, ourSig, outputKey))
4647 assert(Secp256k1 .get().verifySchnorr(ourSig.toArray, hash.toArray, outputKey.pub.value.toByteArray))
4748
4849 // setting auxiliary random data to all-zero yields the same result as not setting any auxiliary random data
49- val ourSig1 = Crypto .signSchnorr(hash, key.privateKey, TaprootTweak .NoScriptTweak , Some (ByteVector32 .Zeroes ))
50+ val ourSig1 = Crypto .signSchnorr(hash, key.privateKey, Some ( TaprootTweak .KeyPathTweak ) , Some (ByteVector32 .Zeroes ))
5051 assert(ourSig == ourSig1)
5152
5253 // setting auxiliary random data to a non-zero value yields a different result
53- val ourSig2 = Crypto .signSchnorr(hash, key.privateKey, TaprootTweak .NoScriptTweak , Some (ByteVector32 .One ))
54+ val ourSig2 = Crypto .signSchnorr(hash, key.privateKey, Some ( TaprootTweak .KeyPathTweak ) , Some (ByteVector32 .One ))
5455 assert(ourSig != ourSig2)
5556 }
5657
5758 test(" send to and spend from taproot addresses" ) {
5859 val privateKey = PrivateKey (ByteVector32 .fromValidHex(" 0101010101010101010101010101010101010101010101010101010101010101" ))
5960 val internalKey = privateKey.publicKey.xOnly
60- val (outputKey, _) = internalKey.outputKey(TaprootTweak .NoScriptTweak )
61+ val (outputKey, _) = internalKey.outputKey(TaprootTweak .KeyPathTweak )
6162 val address = Bech32 .encodeWitnessAddress(" tb" , 1 , outputKey.pub.value.toByteArray)
6263 assert(" tb1p33wm0auhr9kkahzd6l0kqj85af4cswn276hsxg6zpz85xe2r0y8snwrkwy" == address)
6364
6465 // this tx sends to tb1p33wm0auhr9kkahzd6l0kqj85af4cswn276hsxg6zpz85xe2r0y8snwrkwy
6566 val tx = Transaction .read(
6667 " 02000000000101bf77ef36f2c0f32e0822cef0514948254997495a34bfba7dd4a73aabfcbb87900000000000fdffffff02c2c2000000000000160014b5c3dbfeb8e7d0c809c3ba3f815fd430777ef4be50c30000000000002251208c5db7f797196d6edc4dd7df6048f4ea6b883a6af6af032342088f436543790f0140583f758bea307216e03c1f54c3c6088e8923c8e1c89d96679fb00de9e808a79d0fba1cc3f9521cb686e8f43fb37cc6429f2e1480c70cc25ecb4ac0dde8921a01f1f70000"
6768 )
68- assert(Script .pay2tr(internalKey, scripts_opt = None ) == Script .parse(tx.txOut(1 ).publicKeyScript))
69+ assert(Script .pay2tr(internalKey, KeyPathTweak ) == Script .parse(tx.txOut(1 ).publicKeyScript))
6970
7071 // we want to spend
7172 val Right (outputScript) = addressToPublicKeyScript(Block .Testnet3GenesisBlock .hash, " tb1pn3g330w4n5eut7d4vxq0pp303267qc6vg8d2e0ctjuqre06gs3yqnc5yx0" )
@@ -157,7 +158,7 @@ class TaprootSpec extends FunSuite {
157158 val internalPubkey = PublicKey .fromBin(ByteVector .fromValidHex(" 0250929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0" )).xOnly
158159
159160 // funding tx sends to our tapscript
160- val fundingTx = Transaction (version = 2 , txIn = Nil , txOut = Seq (TxOut (Satoshi (1000000 ), Script .pay2tr(internalPubkey, Some ( scriptTree) ))), lockTime = 0 )
161+ val fundingTx = Transaction (version = 2 , txIn = Nil , txOut = Seq (TxOut (Satoshi (1000000 ), Script .pay2tr(internalPubkey, scriptTree))), lockTime = 0 )
161162
162163 // create an unsigned transaction
163164 val tmp = Transaction (
@@ -213,7 +214,7 @@ class TaprootSpec extends FunSuite {
213214 val (tweakedKey, _) = internalPubkey.outputKey(scriptTree)
214215
215216 // this is the tapscript we send funds to
216- val script = Script .pay2tr(internalPubkey, Some ( scriptTree) )
217+ val script = Script .pay2tr(internalPubkey, scriptTree)
217218 val bip350Address = Bech32 .encodeWitnessAddress(Bech32 .hrp(blockchain), 1 .toByte, tweakedKey.pub.value.toByteArray)
218219 assert(bip350Address == " tb1p78gx95syx0qz8w5nftk8t7nce78zlpqpsxugcvq5xpfy4tvn6rasd7wk0y" )
219220 val Right (sweepPublicKeyScript) = addressToPublicKeyScript(blockchain, " tb1qxy9hhxkw7gt76qrm4yzw4j06gkk4evryh8ayp7" )
0 commit comments