25 if (
tx->GetHash() != psbt.
tx->GetHash()) {
29 for (
unsigned int i = 0; i <
inputs.size(); ++i) {
32 for (
unsigned int i = 0; i <
outputs.size(); ++i) {
35 for (
auto& xpub_pair : psbt.
m_xpubs) {
36 if (
m_xpubs.count(xpub_pair.first) == 0) {
37 m_xpubs[xpub_pair.first] = xpub_pair.second;
39 m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
49 if (std::find(
tx->vin.begin(),
tx->vin.end(), txin) !=
tx->vin.end()) {
52 tx->vin.push_back(txin);
62 tx->vout.push_back(txout);
70 uint32_t prevout_index =
tx->vin[input_index].prevout.n;
114 sigdata.
misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
128 for (
const auto& [leaf_script, control_block] :
m_tap_scripts) {
219 sigdata.
misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
223 for (
const auto& [depth, leaf_ver, script] :
m_tap_tree) {
224 builder.
Add((
int)depth, script, (
int)leaf_ver,
true);
283 for (
const auto& input : psbt.
inputs) {
315 bool have_all_spent_outputs =
true;
316 std::vector<CTxOut> utxos(tx.
vin.size());
317 for (
size_t idx = 0; idx < tx.
vin.size(); ++idx) {
318 if (!psbt.
GetInputUTXO(utxos[idx], idx)) have_all_spent_outputs =
false;
321 if (have_all_spent_outputs) {
322 txdata.
Init(tx, std::move(utxos),
true);
324 txdata.
Init(tx, {},
true);
343 bool require_witness_sig =
false;
362 require_witness_sig =
true;
369 if (txdata ==
nullptr) {
376 if (require_witness_sig && !sigdata.
witness)
return false;
408 bool complete =
true;
410 for (
unsigned int i = 0; i < psbtx.
tx->vin.size(); ++i) {
426 for (
unsigned int i = 0; i < result.
vin.size(); ++i) {
427 result.
vin[i].scriptSig = psbtx.
inputs[i].final_script_sig;
428 result.
vin[i].scriptWitness = psbtx.
inputs[i].final_script_witness;
438 for (
auto it = std::next(psbtxs.begin()); it != psbtxs.end(); ++it) {
439 if (!out.
Merge(*it)) {
462 error =
"invalid base64";
473 if (!ss_data.
empty()) {
474 error =
"extra data after PSBT";
477 }
catch (
const std::exception& e) {
bool SignPSBTInput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index, const PrecomputedTransactionData *txdata, int sighash, SignatureData *out_sigdata, bool finalize)
Signs a PSBTInput, verifying that all provided data matches what is being signed. ...
bool AddInput(const CTxIn &txin, PSBTInput &psbtin)
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > taproot_misc_pubkeys
Miscellaneous Taproot pubkeys involved in this input along with their leaf script hashes and key orig...
bool IsNull() const
Test whether this is the 0 key (the result of default construction).
CScript witness_script
The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format...
std::vector< CKeyID > missing_sigs
KeyIDs of pubkeys for signatures which could not be found.
bool FinalizePSBT(PartiallySignedTransaction &psbtx)
Finalizes a PSBT if possible, combining partial signatures.
std::vector< CKeyID > missing_pubkeys
KeyIDs of pubkeys which could not be found.
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
static unsigned const char sighash[]
void Merge(const PSBTOutput &output)
A version of CTransaction with the PSBT format.
Double ended buffer combining vector and stream-like interfaces.
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > misc_pubkeys
A signature creator for transactions.
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > m_tap_bip32_paths
bool AddOutput(const CTxOut &txout, const PSBTOutput &psbtout)
uint256 missing_witness_script
SHA256 of the missing witnessScript (if any)
std::map< KeyOriginInfo, std::set< CExtPubKey > > m_xpubs
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized...
XOnlyPubKey m_tap_internal_key
void FromSignatureData(const SignatureData &sigdata)
std::map< std::pair< XOnlyPubKey, uint256 >, std::vector< unsigned char > > taproot_script_sigs
Schnorr signature for key path spending.
std::string PSBTRoleName(PSBTRole role)
A structure for PSBTs which contains per output information.
std::optional< uint32_t > m_version
std::vector< PSBTOutput > outputs
std::map< CPubKey, KeyOriginInfo > hd_keypaths
uint160 missing_redeem_script
ScriptID of the missing redeemScript (if any)
void Init(const T &tx, std::vector< CTxOut > &&spent_outputs, bool force=false)
Initialize this PrecomputedTransactionData with transaction data.
An input of a transaction.
uint32_t GetVersion() const
bool DecodeBase64PSBT(PartiallySignedTransaction &psbt, const std::string &base64_tx, std::string &error)
Decode a base64ed PSBT into a PartiallySignedTransaction.
std::optional< std::vector< unsigned char > > DecodeBase64(std::string_view str)
const SigningProvider & DUMMY_SIGNING_PROVIDER
TaprootBuilder & Add(int depth, const CScript &script, int leaf_version, bool track=true)
Add a new script at a certain depth in the tree.
TaprootBuilder & Finalize(const XOnlyPubKey &internal_key)
Finalize the construction.
std::optional< TaprootBuilder > tr_builder
Taproot tree used to build tr_spenddata.
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
An output of a transaction.
void UpdatePSBTOutput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index)
Updates a PSBTOutput with information from provider.
uint256 merkle_root
The Merkle root of the script tree (0 if no scripts).
An outpoint - a combination of a transaction hash and an index n into its vout.
std::vector< CTxOut > vout
std::vector< PSBTInput > inputs
CScriptWitness scriptWitness
The scriptWitness of an input. Contains complete signatures or the traditional partial signatures for...
bool IsFullyValid() const
Determine if this pubkey is fully valid.
TaprootSpendData GetSpendData() const
Compute spending data (after Finalize()).
Utility class to construct Taproot outputs from internal key and script tree.
size_t CountPSBTUnsignedInputs(const PartiallySignedTransaction &psbt)
Counts the unsigned inputs of a PSBT.
void FillSignatureData(SignatureData &sigdata) const
bool Merge(const PartiallySignedTransaction &psbt)
Merge psbt into this.
std::map< std::pair< CScript, int >, std::set< std::vector< unsigned char >, ShortestVectorFirstComparator > > scripts
Map from (script, leaf_version) to (sets of) control blocks.
An interface to be implemented by keystores that support signing.
XOnlyPubKey internal_key
The BIP341 internal key.
static const int PROTOCOL_VERSION
network protocol versioning
Span< const std::byte > MakeByteSpan(V &&v) noexcept
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
A mutable version of CTransaction.
bool PSBTInputSigned(const PSBTInput &input)
Checks whether a PSBTInput is already signed.
bool IsComplete() const
Return whether there were either no leaves, or the leaves form a Huffman tree.
std::vector< std::tuple< uint8_t, uint8_t, CScript > > m_tap_tree
A Span is an object that can refer to a contiguous sequence of objects.
std::optional< CMutableTransaction > tx
std::vector< unsigned char > taproot_key_path_sig
bool complete
Stores whether the scriptSig and scriptWitness are complete.
bool DecodeRawPSBT(PartiallySignedTransaction &psbt, Span< const std::byte > tx_data, std::string &error)
Decode a raw (binary blob) PSBT into a PartiallySignedTransaction.
bool GetInputUTXO(CTxOut &utxo, int input_index) const
Finds the UTXO for a given input index.
bool error(const char *fmt, const Args &... args)
CScript redeem_script
The redeemScript (if any) for the input.
PartiallySignedTransaction()
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
bool witness
Stores whether the input this SigData corresponds to is a witness input.
#define Assert(val)
Identity function.
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
void Merge(TaprootSpendData other)
Merge other TaprootSpendData (for the same scriptPubKey) into this.
PrecomputedTransactionData PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
TransactionError CombinePSBTs(PartiallySignedTransaction &out, const std::vector< PartiallySignedTransaction > &psbtxs)
Combines PSBTs with the same underlying transaction, resulting in a single PSBT with all partial sign...
TaprootSpendData tr_spenddata
Taproot spending data.