@@ -20,11 +20,13 @@ import (
2020 "math/big"
2121 "testing"
2222
23+ "github.com/BitBoxSwiss/bitbox-wallet-app/backend/coins/btc/addresses"
2324 addressesTest "github.com/BitBoxSwiss/bitbox-wallet-app/backend/coins/btc/addresses/test"
2425 "github.com/BitBoxSwiss/bitbox-wallet-app/backend/coins/btc/types"
2526 "github.com/BitBoxSwiss/bitbox-wallet-app/backend/signing"
2627 "github.com/btcsuite/btcd/btcutil"
2728 "github.com/btcsuite/btcd/mempool"
29+ "github.com/btcsuite/btcd/txscript"
2830 "github.com/btcsuite/btcd/wire"
2931 "github.com/stretchr/testify/require"
3032)
@@ -57,6 +59,51 @@ func makeSig() types.Signature {
5759 return sig
5860}
5961
62+ // signatureScript returns the signature script (and witness) needed to spend from this address.
63+ func signatureScript (
64+ t * testing.T ,
65+ address * addresses.AccountAddress ,
66+ signature types.Signature ,
67+ ) ([]byte , wire.TxWitness ) {
68+ t .Helper ()
69+ publicKey := address .PublicKey
70+ switch address .AccountConfiguration .ScriptType () {
71+ case signing .ScriptTypeP2PKH :
72+ signatureScript , err := txscript .NewScriptBuilder ().
73+ AddData (append (signature .SerializeDER (), byte (txscript .SigHashAll ))).
74+ AddData (publicKey .SerializeCompressed ()).
75+ Script ()
76+ require .NoError (t , err )
77+ return signatureScript , nil
78+ case signing .ScriptTypeP2WPKHP2SH :
79+ signatureScript , err := txscript .NewScriptBuilder ().
80+ AddData (address .RedeemScript ).
81+ Script ()
82+ require .NoError (t , err )
83+ txWitness := wire.TxWitness {
84+ append (signature .SerializeDER (), byte (txscript .SigHashAll )),
85+ publicKey .SerializeCompressed (),
86+ }
87+ return signatureScript , txWitness
88+ case signing .ScriptTypeP2WPKH :
89+ txWitness := wire.TxWitness {
90+ append (signature .SerializeDER (), byte (txscript .SigHashAll )),
91+ publicKey .SerializeCompressed (),
92+ }
93+ return []byte {}, txWitness
94+ case signing .ScriptTypeP2TR :
95+ // We assume SIGHASH_DEFAULT, which defaults to SIGHASH_ALL without needing to explicitly
96+ // append it to the signature. See:
97+ // https://github.com/bitcoin/bips/blob/97e02b2223b21753acefa813a4e59dbb6e849e77/bip-0341.mediawiki#taproot-key-path-spending-signature-validation
98+ txWitness := wire.TxWitness {
99+ signature .SerializeCompact (),
100+ }
101+ return []byte {}, txWitness
102+ default :
103+ panic ("Unrecognized address type." )
104+ }
105+ }
106+
60107func testEstimateTxSize (
61108 t * testing.T , useSegwit bool , outputScriptType , changeScriptType signing.ScriptType ) {
62109 t .Helper ()
@@ -86,7 +133,7 @@ func testEstimateTxSize(
86133 for counter := 0 ; counter < 10 ; counter ++ {
87134 for _ , inputScriptType := range inputScriptTypes {
88135 inputAddress := addressesTest .GetAddress (inputScriptType )
89- sigScript , witness := inputAddress . SignatureScript ( sig )
136+ sigScript , witness := signatureScript ( t , inputAddress , sig )
90137 tx .TxIn = append (tx .TxIn , & wire.TxIn {
91138 SignatureScript : sigScript ,
92139 Witness : witness ,
@@ -121,7 +168,7 @@ func TestSigScriptWitnessSize(t *testing.T) {
121168 address := addressesTest .GetAddress (scriptType )
122169 t .Run (address .AccountConfiguration .String (), func (t * testing.T ) {
123170 sigScriptSize , witnessSize := sigScriptWitnessSize (address .AccountConfiguration )
124- sigScript , witness := address . SignatureScript ( sig )
171+ sigScript , witness := signatureScript ( t , address , sig )
125172 require .Equal (t , len (sigScript ), sigScriptSize )
126173 if witness != nil {
127174 require .Equal (t , witness .SerializeSize (), witnessSize )
0 commit comments