16#include <boost/test/unit_test.hpp>
27 .identifier = {
'p',
's',
'b',
't'},
33void CheckTimeLock(
const std::string& base64_psbt, std::optional<uint32_t> timelock)
38 std::optional<uint32_t> computed_timelock = psbt->ComputeTimeLock();
39 std::optional<CMutableTransaction> tx = psbt->GetUnsignedTx();
53 CheckTimeLock(
"cHNidP8BAgQCAAAAAQQBAQEFAQIB+wQCAAAAAAEOIAsK2SFBnByHGXNdctxzn56p4GONH+TB7vD5lECEgV/IAQ8EAAAAAAABAwgACK8vAAAAAAEEFgAUxDD2TEdW2jENvRoIVXLvKZkmJywAAQMIi73rCwAAAAABBBYAFE3Rk6yWSlasG54cyoRU/i9HT4UTAA==", 0);
54 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAAAAQ4gOhs7PIN9ZInqejHY5sfdUDwAG+8+BpWOdXSAjWjKeKUBDwQAAAAAAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=", 0);
55 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAABAwhPkzV3AAAAAAEEFgAUCxNSys0Dz2qht/PI1jiGcbNKXhEA", 10000);
56 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAESBCgjAAAAAQMIT5M1dwAAAAABBBYAFAsTUsrNA89qobfzyNY4hnGzSl4RAA==", 10000);
57 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAERBIyNxGIBEgQoIwAAAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=", 10000);
58 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEQSLjcRiARIEECcAAAABDiA6Gzs8g31kiep6Mdjmx91QPAAb7z4GlY51dICNaMp4pQEPBAAAAAABEQSMjcRiARIEKCMAAAABAwhPkzV3AAAAAAEEFgAUCxNSys0Dz2qht/PI1jiGcbNKXhEA", 10000);
59 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEQSLjcRiAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAERBIyNxGIBEgQoIwAAAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=", 1657048460);
60 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEQSLjcRiARIEECcAAAABDiA6Gzs8g31kiep6Mdjmx91QPAAb7z4GlY51dICNaMp4pQEPBAAAAAABEQSMjcRiAAEDCE+TNXcAAAAAAQQWABQLE1LKzQPPaqG388jWOIZxs0peEQA=", 1657048460);
61 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAAAAQ4gOhs7PIN9ZInqejHY5sfdUDwAG+8+BpWOdXSAjWjKeKUBDwQAAAAAAREEjI3EYgABAwhPkzV3AAAAAAEEFgAUCxNSys0Dz2qht/PI1jiGcbNKXhEA", 1657048460);
62 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiAPdY2/vU2nwWyKMwnDyB4RAPVh6mRttbAXUsSF4b3enwEPBAEAAAABEgQQJwAAAAEOIDobOzyDfWSJ6nox2ObH3VA8ABvvPgaVjnV0gI1oynilAQ8EAAAAAAERBIyNxGIAAQMIT5M1dwAAAAABBBYAFAsTUsrNA89qobfzyNY4hnGzSl4RAA==", std::nullopt);
204 left.
inputs[0].m_proprietary.insert(left_prop);
205 left.
outputs[0].m_proprietary.insert(left_prop);
208 right.
inputs[0].m_proprietary.insert(right_prop);
209 right.
outputs[0].m_proprietary.insert(right_prop);
211 BOOST_REQUIRE(left.
Merge(right));
214 BOOST_REQUIRE_EQUAL(left.
inputs[0].m_proprietary.size(), 2U);
215 BOOST_REQUIRE_EQUAL(left.
outputs[0].m_proprietary.size(), 2U);
221 const auto input_it = left.
inputs[0].m_proprietary.find(right_prop);
222 BOOST_REQUIRE(input_it != left.
inputs[0].m_proprietary.end());
225 const auto output_it = left.
outputs[0].m_proprietary.find(right_prop);
226 BOOST_REQUIRE(output_it != left.
outputs[0].m_proprietary.end());
244 BOOST_REQUIRE_MESSAGE(!descriptors.empty(), error);
245 std::vector<CScript> output_scripts;
246 BOOST_REQUIRE(descriptors[0]->Expand(0,
provider, output_scripts,
provider));
247 BOOST_REQUIRE_EQUAL(output_scripts.size(), 1);
254 if (has_input) tx.
vin.emplace_back();
258 return psbt.outputs[0];
264 for (
bool has_input : {
false,
true}) {
265 for (
const auto& descriptor : {
"pkh(<KEY>)",
"wpkh(<KEY>)"}) {
267 auto out{test.UpdateOutput(has_input)};
277 for (
bool has_input : {
false,
true}) {
279 auto out{test.UpdateOutput(has_input)};
287 for (
bool has_input : {
false,
true}) {
289 auto out{test.UpdateOutput(has_input)};
297 for (
bool has_input : {
false,
true}) {
299 auto out{test.UpdateOutput(has_input)};
307 for (
bool has_input : {
false,
true}) {
309 auto out{test.UpdateOutput(has_input)};
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
An encapsulated private key.
An outpoint - a combination of a transaction hash and an index n into its vout.
An encapsulated public key.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Serialized script, used inside transaction inputs and outputs.
void fillrand(std::span< std::byte > output) noexcept
Fill a byte span with random bytes.
A structure for PSBTs which contains per output information.
A version of CTransaction with the PSBT format.
std::optional< std::bitset< 8 > > m_tx_modifiable
bool Merge(const PartiallySignedTransaction &psbt)
Merge psbt into this.
std::vector< PSBTInput > inputs
std::vector< PSBTOutput > outputs
std::set< PSBTProprietary > m_proprietary
bool AddOutput(const PSBTOutput &psbtout)
bool AddInput(const PSBTInput &psbtin)
static transaction_identifier FromUint256(const uint256 &id)
static UniValue Parse(std::string_view raw, ParamFormat format=ParamFormat::JSON)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
BOOST_CHECK_EQUAL(headers.FindFirst("key"), "value")
CKey GenerateRandomKey(bool compressed) noexcept
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
#define BOOST_CHECK(expr)
void UpdatePSBTOutput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index)
Updates a PSBTOutput with information from provider.
util::Result< PartiallySignedTransaction > DecodeBase64PSBT(const std::string &base64_tx)
Decode a base64ed PSBT into a PartiallySignedTransaction.
BOOST_AUTO_TEST_CASE(psbt2_timelock_test)
static PSBTProprietary MakeProprietary(uint64_t subtype, uint8_t key_data, uint8_t value)
void CheckTimeLock(const std::string &base64_psbt, std::optional< uint32_t > timelock)
constexpr unsigned int LOCKTIME_THRESHOLD
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
auto MakeWritableByteSpan(V &&v) noexcept
A mutable version of CTransaction.
std::vector< CTxOut > vout
std::vector< std::vector< unsigned char > > stack
std::map< CKeyID, CKey > keys
PSBTOutput UpdateOutput(bool has_input) const
FlatSigningProvider provider
PSBTOutputTest(std::string descriptor)
A structure for PSBT proprietary types.