Abstract out UpdatePSBTOutput from FillPSBT
This commit is contained in:
parent
fb90ec3c33
commit
3135c1a2d2
3 changed files with 26 additions and 10 deletions
19
src/psbt.cpp
19
src/psbt.cpp
|
@ -215,6 +215,25 @@ bool PSBTInputSigned(const PSBTInput& input)
|
||||||
return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
|
return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
|
||||||
|
{
|
||||||
|
const CTxOut& out = psbt.tx->vout.at(index);
|
||||||
|
PSBTOutput& psbt_out = psbt.outputs.at(index);
|
||||||
|
|
||||||
|
// Fill a SignatureData with output info
|
||||||
|
SignatureData sigdata;
|
||||||
|
psbt_out.FillSignatureData(sigdata);
|
||||||
|
|
||||||
|
// Construct a would-be spend of this output, to update sigdata with.
|
||||||
|
// Note that ProduceSignature is used to fill in metadata (not actual signatures),
|
||||||
|
// so provider does not need to provide any private keys (it can be a HidingSigningProvider).
|
||||||
|
MutableTransactionSignatureCreator creator(psbt.tx.get_ptr(), /* index */ 0, out.nValue, SIGHASH_ALL);
|
||||||
|
ProduceSignature(provider, creator, out.scriptPubKey, sigdata);
|
||||||
|
|
||||||
|
// Put redeem_script, witness_script, key paths, into PSBTOutput.
|
||||||
|
psbt_out.FromSignatureData(sigdata);
|
||||||
|
}
|
||||||
|
|
||||||
bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, int sighash, SignatureData* out_sigdata, bool use_dummy)
|
bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, int sighash, SignatureData* out_sigdata, bool use_dummy)
|
||||||
{
|
{
|
||||||
PSBTInput& input = psbt.inputs.at(index);
|
PSBTInput& input = psbt.inputs.at(index);
|
||||||
|
|
|
@ -565,6 +565,12 @@ bool PSBTInputSigned(const PSBTInput& input);
|
||||||
/** Signs a PSBTInput, verifying that all provided data matches what is being signed. */
|
/** Signs a PSBTInput, verifying that all provided data matches what is being signed. */
|
||||||
bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, int sighash = SIGHASH_ALL, SignatureData* out_sigdata = nullptr, bool use_dummy = false);
|
bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, int sighash = SIGHASH_ALL, SignatureData* out_sigdata = nullptr, bool use_dummy = false);
|
||||||
|
|
||||||
|
/** Updates a PSBTOutput with information from provider.
|
||||||
|
*
|
||||||
|
* This fills in the redeem_script, witness_script, and hd_keypaths where possible.
|
||||||
|
*/
|
||||||
|
void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalizes a PSBT if possible, combining partial signatures.
|
* Finalizes a PSBT if possible, combining partial signatures.
|
||||||
*
|
*
|
||||||
|
|
|
@ -44,16 +44,7 @@ TransactionError FillPSBT(const CWallet* pwallet, PartiallySignedTransaction& ps
|
||||||
|
|
||||||
// Fill in the bip32 keypaths and redeemscripts for the outputs so that hardware wallets can identify change
|
// Fill in the bip32 keypaths and redeemscripts for the outputs so that hardware wallets can identify change
|
||||||
for (unsigned int i = 0; i < psbtx.tx->vout.size(); ++i) {
|
for (unsigned int i = 0; i < psbtx.tx->vout.size(); ++i) {
|
||||||
const CTxOut& out = psbtx.tx->vout.at(i);
|
UpdatePSBTOutput(HidingSigningProvider(pwallet, true, !bip32derivs), psbtx, i);
|
||||||
PSBTOutput& psbt_out = psbtx.outputs.at(i);
|
|
||||||
|
|
||||||
// Fill a SignatureData with output info
|
|
||||||
SignatureData sigdata;
|
|
||||||
psbt_out.FillSignatureData(sigdata);
|
|
||||||
|
|
||||||
MutableTransactionSignatureCreator creator(psbtx.tx.get_ptr(), 0, out.nValue, 1);
|
|
||||||
ProduceSignature(HidingSigningProvider(pwallet, true, !bip32derivs), creator, out.scriptPubKey, sigdata);
|
|
||||||
psbt_out.FromSignatureData(sigdata);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TransactionError::OK;
|
return TransactionError::OK;
|
||||||
|
|
Loading…
Reference in a new issue