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);
63 CheckTimeLock(
"cHNidP8BAgQCAAAAAQMEAAAAAAEEAQIBBQEBAfsEAgAAAAABDiA6Gzs8g31kiep6Mdjmx91QPAAb7z4GlY51dICNaMp4pQEPBAAAAAABEQSMjcRiAAEOIA91jb+9TafBbIozCcPIHhEA9WHqZG21sBdSxIXhvd6fAQ8EAQAAAAESBBAnAAAAAQMIT5M1dwAAAAABBBYAFAsTUsrNA89qobfzyNY4hnGzSl4RAA==", std::nullopt);
205 left.
inputs[0].m_proprietary.insert(left_prop);
206 left.
outputs[0].m_proprietary.insert(left_prop);
209 right.
inputs[0].m_proprietary.insert(right_prop);
210 right.
outputs[0].m_proprietary.insert(right_prop);
212 BOOST_REQUIRE(left.
Merge(right));
215 BOOST_REQUIRE_EQUAL(left.
inputs[0].m_proprietary.size(), 2U);
216 BOOST_REQUIRE_EQUAL(left.
outputs[0].m_proprietary.size(), 2U);
222 const auto input_it = left.
inputs[0].m_proprietary.find(right_prop);
223 BOOST_REQUIRE(input_it != left.
inputs[0].m_proprietary.end());
226 const auto output_it = left.
outputs[0].m_proprietary.find(right_prop);
227 BOOST_REQUIRE(output_it != left.
outputs[0].m_proprietary.end());
245 BOOST_REQUIRE_MESSAGE(!descriptors.empty(), error);
246 std::vector<CScript> output_scripts;
247 BOOST_REQUIRE(descriptors[0]->Expand(0,
provider, output_scripts,
provider));
248 BOOST_REQUIRE_EQUAL(output_scripts.size(), 1);
255 if (has_input) tx.
vin.emplace_back();
259 return psbt.outputs[0];
265 for (
bool has_input : {
false,
true}) {
266 for (
const auto& descriptor : {
"pkh(<KEY>)",
"wpkh(<KEY>)"}) {
268 auto out{test.UpdateOutput(has_input)};
278 for (
bool has_input : {
false,
true}) {
280 auto out{test.UpdateOutput(has_input)};
288 for (
bool has_input : {
false,
true}) {
290 auto out{test.UpdateOutput(has_input)};
298 for (
bool has_input : {
false,
true}) {
300 auto out{test.UpdateOutput(has_input)};
308 for (
bool has_input : {
false,
true}) {
310 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, std::string_view search, std::string_view substitute)
Replace every non-overlapping occurrence of search with substitute, treating both literally; the repl...
#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.