btcd/txscript/p2a_test.go
2026-05-14 18:05:33 -07:00

157 lines
3.7 KiB
Go

package txscript
import (
"encoding/hex"
"testing"
"github.com/btcsuite/btcd/chaincfg/v2"
)
// TestIsPayToAnchorScript tests the IsPayToAnchorScript function.
func TestIsPayToAnchorScript(t *testing.T) {
tests := []struct {
name string
script []byte
want bool
}{
{
name: "valid P2A script",
script: PayToAnchorScript,
want: true,
},
{
name: "invalid - wrong data",
script: []byte{OP_1, OP_DATA_2, 0x4e, 0x74},
want: false,
},
{
name: "invalid - wrong length",
script: []byte{OP_1, OP_DATA_2, 0x4e},
want: false,
},
{
name: "invalid - wrong version",
script: []byte{OP_0, OP_DATA_2, 0x4e, 0x73},
want: false,
},
{
name: "invalid - P2WPKH",
script: []byte{
OP_0, OP_DATA_20, 0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
},
want: false,
},
{
name: "empty script",
script: []byte{},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := IsPayToAnchorScript(tt.script)
if got != tt.want {
t.Errorf(
"IsPayToAnchorScript() = %v, want %v",
got, tt.want,
)
}
})
}
}
// TestGetScriptClassP2A tests that P2A scripts are properly classified.
func TestGetScriptClassP2A(t *testing.T) {
p2aScript := PayToAnchorScript
class := GetScriptClass(p2aScript)
if class != PayToAnchorTy {
t.Errorf("GetScriptClass() = %v, want %v", class, PayToAnchorTy)
}
if class.String() != "anchor" {
t.Errorf("PayToAnchorTy.String() = %v, want 'anchor'",
class.String())
}
// Test that regular taproot scripts are still recognized as
// WitnessV1TaprootTy.
taprootScript := []byte{
OP_1, OP_DATA_32,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
}
class = GetScriptClass(taprootScript)
if class != WitnessV1TaprootTy {
t.Errorf("GetScriptClass(taproot) = %v, want %v",
class, WitnessV1TaprootTy)
}
}
// TestExtractPkScriptAddrs_P2A tests ExtractPkScriptAddrs with P2A scripts.
func TestExtractPkScriptAddrs_P2A(t *testing.T) {
p2aScript := PayToAnchorScript
class, addrs, reqSigs, err := ExtractPkScriptAddrs(
p2aScript, &chaincfg.MainNetParams,
)
if err != nil {
t.Fatalf("ExtractPkScriptAddrs() error = %v", err)
}
if class != PayToAnchorTy {
t.Errorf("ExtractPkScriptAddrs() class = %v, want %v",
class, PayToAnchorTy)
}
if len(addrs) != 1 {
t.Fatalf("ExtractPkScriptAddrs() addrs = %v, want 1 entry",
addrs)
}
const wantAddr = "bc1pfeessrawgf"
if addrs[0].EncodeAddress() != wantAddr {
t.Errorf("ExtractPkScriptAddrs() addrs[0] = %v, want %v",
addrs[0].EncodeAddress(), wantAddr)
}
if reqSigs != 0 {
t.Errorf("ExtractPkScriptAddrs() reqSigs = %v, want 0", reqSigs)
}
}
// TestExpectedInputs_P2A tests that P2A scripts require no inputs.
func TestExpectedInputs_P2A(t *testing.T) {
p2aScript := PayToAnchorScript
inputs := expectedInputs(p2aScript, PayToAnchorTy)
if inputs != 0 {
t.Errorf("expectedInputs() = %v, want 0", inputs)
}
}
// TestP2AScriptHex tests P2A script in hex format.
func TestP2AScriptHex(t *testing.T) {
// The P2A script in hex should be "51024e73".
expectedHex := "51024e73"
p2aScript := PayToAnchorScript
actualHex := hex.EncodeToString(p2aScript)
if actualHex != expectedHex {
t.Errorf("P2A script hex = %v, want %v", actualHex, expectedHex)
}
// Test decoding.
decoded, err := hex.DecodeString(expectedHex)
if err != nil {
t.Fatalf("Failed to decode hex: %v", err)
}
if !IsPayToAnchorScript(decoded) {
t.Error("Decoded hex not recognized as P2A script")
}
}