mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 14:59:39 -04:00
Implement PSBTv2 field merging
This commit is contained in:
parent
b980898dfd
commit
f7d9a086fe
1 changed files with 15 additions and 0 deletions
15
src/psbt.cpp
15
src/psbt.cpp
|
@ -30,6 +30,9 @@ bool PartiallySignedTransaction::Merge(const PartiallySignedTransaction& psbt)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (!Assume(*tx_version == psbt.tx_version)) {
|
||||
return false;
|
||||
}
|
||||
for (unsigned int i = 0; i < inputs.size(); ++i) {
|
||||
inputs[i].Merge(psbt.inputs[i]);
|
||||
}
|
||||
|
@ -43,6 +46,9 @@ bool PartiallySignedTransaction::Merge(const PartiallySignedTransaction& psbt)
|
|||
m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
|
||||
}
|
||||
}
|
||||
if (fallback_locktime == std::nullopt && psbt.fallback_locktime != std::nullopt) fallback_locktime = psbt.fallback_locktime;
|
||||
if (m_tx_modifiable != std::nullopt && psbt.m_tx_modifiable != std::nullopt) *m_tx_modifiable |= *psbt.m_tx_modifiable;
|
||||
if (m_tx_modifiable == std::nullopt && psbt.m_tx_modifiable != std::nullopt) m_tx_modifiable = psbt.m_tx_modifiable;
|
||||
unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
|
||||
|
||||
return true;
|
||||
|
@ -300,6 +306,9 @@ void PSBTInput::FromSignatureData(const SignatureData& sigdata)
|
|||
|
||||
void PSBTInput::Merge(const PSBTInput& input)
|
||||
{
|
||||
assert(prev_txid == input.prev_txid);
|
||||
assert(*prev_out == *input.prev_out);
|
||||
|
||||
if (!non_witness_utxo && input.non_witness_utxo) non_witness_utxo = input.non_witness_utxo;
|
||||
if (witness_utxo.IsNull() && !input.witness_utxo.IsNull()) {
|
||||
witness_utxo = input.witness_utxo;
|
||||
|
@ -323,6 +332,9 @@ void PSBTInput::Merge(const PSBTInput& input)
|
|||
if (m_tap_key_sig.empty() && !input.m_tap_key_sig.empty()) m_tap_key_sig = input.m_tap_key_sig;
|
||||
if (m_tap_internal_key.IsNull() && !input.m_tap_internal_key.IsNull()) m_tap_internal_key = input.m_tap_internal_key;
|
||||
if (m_tap_merkle_root.IsNull() && !input.m_tap_merkle_root.IsNull()) m_tap_merkle_root = input.m_tap_merkle_root;
|
||||
if (sequence == std::nullopt && input.sequence != std::nullopt) sequence = input.sequence;
|
||||
if (time_locktime == std::nullopt && input.time_locktime != std::nullopt) time_locktime = input.time_locktime;
|
||||
if (height_locktime == std::nullopt && input.height_locktime != std::nullopt) height_locktime = input.height_locktime;
|
||||
}
|
||||
|
||||
void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
|
||||
|
@ -383,6 +395,9 @@ bool PSBTOutput::IsNull() const
|
|||
|
||||
void PSBTOutput::Merge(const PSBTOutput& output)
|
||||
{
|
||||
assert(*amount == *output.amount);
|
||||
assert(*script == *output.script);
|
||||
|
||||
hd_keypaths.insert(output.hd_keypaths.begin(), output.hd_keypaths.end());
|
||||
unknown.insert(output.unknown.begin(), output.unknown.end());
|
||||
m_tap_bip32_paths.insert(output.m_tap_bip32_paths.begin(), output.m_tap_bip32_paths.end());
|
||||
|
|
Loading…
Add table
Reference in a new issue