diff --git a/src/test/script_standard_tests.cpp b/src/test/script_standard_tests.cpp index e9ce82ca8a6..5db66d512bd 100644 --- a/src/test/script_standard_tests.cpp +++ b/src/test/script_standard_tests.cpp @@ -197,11 +197,19 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_failure) s << OP_RETURN << std::vector({75}) << OP_ADD; BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::NONSTANDARD); - // TxoutType::WITNESS_UNKNOWN with incorrect program size + // TxoutType::WITNESS_V0_{KEY,SCRIPT}HASH with incorrect program size (-> consensus-invalid, i.e. non-standard) s.clear(); s << OP_0 << std::vector(19, 0x01); BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::NONSTANDARD); + // TxoutType::WITNESS_V1_TAPROOT with incorrect program size (-> undefined, but still policy-valid) + s.clear(); + s << OP_1 << std::vector(31, 0x01); + BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN); + s.clear(); + s << OP_1 << std::vector(33, 0x01); + BOOST_CHECK_EQUAL(Solver(s, solutions), TxoutType::WITNESS_UNKNOWN); + // TxoutType::ANCHOR but wrong witness version s.clear(); s << OP_2 << std::vector{0x4e, 0x73}; @@ -268,12 +276,33 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination) BOOST_CHECK(ExtractDestination(s, address)); BOOST_CHECK(std::get(address) == scripthash); + // TxoutType::WITNESS_V1_TAPROOT + s.clear(); + auto xpk = XOnlyPubKey(pubkey); + s << OP_1 << ToByteVector(xpk); + BOOST_CHECK(ExtractDestination(s, address)); + BOOST_CHECK(std::get(address) == WitnessV1Taproot(xpk)); + + // TxoutType::ANCHOR + std::vector anchor_bytes{0x4e, 0x73}; + s.clear(); + s << OP_1 << anchor_bytes; + BOOST_CHECK(ExtractDestination(s, address)); + BOOST_CHECK(std::get(address) == PayToAnchor()); + // TxoutType::WITNESS_UNKNOWN with unknown version + // -> segwit version 1 with an undefined program size (33 bytes in this test case) s.clear(); s << OP_1 << ToByteVector(pubkey); BOOST_CHECK(ExtractDestination(s, address)); - WitnessUnknown unk{1, ToByteVector(pubkey)}; - BOOST_CHECK(std::get(address) == unk); + WitnessUnknown unk_v1{1, ToByteVector(pubkey)}; + BOOST_CHECK(std::get(address) == unk_v1); + s.clear(); + // -> segwit versions 2+ are not specified yet + s << OP_2 << ToByteVector(xpk); + BOOST_CHECK(ExtractDestination(s, address)); + WitnessUnknown unk_v2{2, ToByteVector(xpk)}; + BOOST_CHECK(std::get(address) == unk_v2); } BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_) @@ -341,6 +370,20 @@ BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_) expected << OP_0 << ToByteVector(scriptHash); result = GetScriptForDestination(WitnessV0ScriptHash(witnessScript)); BOOST_CHECK(result == expected); + + // WitnessV1Taproot + auto xpk = XOnlyPubKey(pubkeys[0]); + expected.clear(); + expected << OP_1 << ToByteVector(xpk); + result = GetScriptForDestination(WitnessV1Taproot(xpk)); + BOOST_CHECK(result == expected); + + // PayToAnchor + std::vector anchor_bytes{0x4e, 0x73}; + expected.clear(); + expected << OP_1 << anchor_bytes; + result = GetScriptForDestination(PayToAnchor()); + BOOST_CHECK(result == expected); } BOOST_AUTO_TEST_CASE(script_standard_taproot_builder)