mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 14:59:39 -04:00
Update wallet for PSBTv2
This commit is contained in:
parent
a1d5544d16
commit
41f3148fc3
3 changed files with 11 additions and 15 deletions
|
@ -643,8 +643,7 @@ std::optional<PSBTError> LegacyScriptPubKeyMan::FillPSBT(PartiallySignedTransact
|
||||||
if (n_signed) {
|
if (n_signed) {
|
||||||
*n_signed = 0;
|
*n_signed = 0;
|
||||||
}
|
}
|
||||||
for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
|
for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
|
||||||
const CTxIn& txin = psbtx.tx->vin[i];
|
|
||||||
PSBTInput& input = psbtx.inputs.at(i);
|
PSBTInput& input = psbtx.inputs.at(i);
|
||||||
|
|
||||||
if (PSBTInputSigned(input)) {
|
if (PSBTInputSigned(input)) {
|
||||||
|
@ -658,7 +657,7 @@ std::optional<PSBTError> LegacyScriptPubKeyMan::FillPSBT(PartiallySignedTransact
|
||||||
|
|
||||||
// Check non_witness_utxo has specified prevout
|
// Check non_witness_utxo has specified prevout
|
||||||
if (input.non_witness_utxo) {
|
if (input.non_witness_utxo) {
|
||||||
if (txin.prevout.n >= input.non_witness_utxo->vout.size()) {
|
if (*input.prev_out >= input.non_witness_utxo->vout.size()) {
|
||||||
return PSBTError::MISSING_INPUTS;
|
return PSBTError::MISSING_INPUTS;
|
||||||
}
|
}
|
||||||
} else if (input.witness_utxo.IsNull()) {
|
} else if (input.witness_utxo.IsNull()) {
|
||||||
|
@ -677,7 +676,7 @@ std::optional<PSBTError> LegacyScriptPubKeyMan::FillPSBT(PartiallySignedTransact
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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.outputs.size(); ++i) {
|
||||||
UpdatePSBTOutput(HidingSigningProvider(this, true, !bip32derivs), psbtx, i);
|
UpdatePSBTOutput(HidingSigningProvider(this, true, !bip32derivs), psbtx, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2570,8 +2569,7 @@ std::optional<PSBTError> DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTran
|
||||||
if (n_signed) {
|
if (n_signed) {
|
||||||
*n_signed = 0;
|
*n_signed = 0;
|
||||||
}
|
}
|
||||||
for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
|
for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
|
||||||
const CTxIn& txin = psbtx.tx->vin[i];
|
|
||||||
PSBTInput& input = psbtx.inputs.at(i);
|
PSBTInput& input = psbtx.inputs.at(i);
|
||||||
|
|
||||||
if (PSBTInputSigned(input)) {
|
if (PSBTInputSigned(input)) {
|
||||||
|
@ -2588,10 +2586,10 @@ std::optional<PSBTError> DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTran
|
||||||
if (!input.witness_utxo.IsNull()) {
|
if (!input.witness_utxo.IsNull()) {
|
||||||
script = input.witness_utxo.scriptPubKey;
|
script = input.witness_utxo.scriptPubKey;
|
||||||
} else if (input.non_witness_utxo) {
|
} else if (input.non_witness_utxo) {
|
||||||
if (txin.prevout.n >= input.non_witness_utxo->vout.size()) {
|
if (*input.prev_out >= input.non_witness_utxo->vout.size()) {
|
||||||
return PSBTError::MISSING_INPUTS;
|
return PSBTError::MISSING_INPUTS;
|
||||||
}
|
}
|
||||||
script = input.non_witness_utxo->vout[txin.prevout.n].scriptPubKey;
|
script = input.non_witness_utxo->vout[*input.prev_out].scriptPubKey;
|
||||||
} else {
|
} else {
|
||||||
// There's no UTXO so we can just skip this now
|
// There's no UTXO so we can just skip this now
|
||||||
continue;
|
continue;
|
||||||
|
@ -2652,8 +2650,8 @@ std::optional<PSBTError> DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTran
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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.outputs.size(); ++i) {
|
||||||
std::unique_ptr<SigningProvider> keys = GetSolvingProvider(psbtx.tx->vout.at(i).scriptPubKey);
|
std::unique_ptr<SigningProvider> keys = GetSolvingProvider(*psbtx.outputs.at(i).script);
|
||||||
if (!keys) {
|
if (!keys) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,7 @@ BOOST_AUTO_TEST_CASE(psbt_updater_test)
|
||||||
|
|
||||||
// Mutate the transaction so that one of the inputs is invalid
|
// Mutate the transaction so that one of the inputs is invalid
|
||||||
psbtx.tx->vin[0].prevout.n = 2;
|
psbtx.tx->vin[0].prevout.n = 2;
|
||||||
|
psbtx.inputs[0].prev_out = 2;
|
||||||
|
|
||||||
// Try to sign the mutated input
|
// Try to sign the mutated input
|
||||||
SignatureData sigdata;
|
SignatureData sigdata;
|
||||||
|
|
|
@ -2218,17 +2218,14 @@ std::optional<PSBTError> CWallet::FillPSBT(PartiallySignedTransaction& psbtx, bo
|
||||||
}
|
}
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
// Get all of the previous transactions
|
// Get all of the previous transactions
|
||||||
for (unsigned int i = 0; i < psbtx.tx->vin.size(); ++i) {
|
for (PSBTInput& input : psbtx.inputs) {
|
||||||
const CTxIn& txin = psbtx.tx->vin[i];
|
|
||||||
PSBTInput& input = psbtx.inputs.at(i);
|
|
||||||
|
|
||||||
if (PSBTInputSigned(input)) {
|
if (PSBTInputSigned(input)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have no utxo, grab it from the wallet.
|
// If we have no utxo, grab it from the wallet.
|
||||||
if (!input.non_witness_utxo) {
|
if (!input.non_witness_utxo) {
|
||||||
const uint256& txhash = txin.prevout.hash;
|
const uint256& txhash = input.prev_txid;
|
||||||
const auto it = mapWallet.find(txhash);
|
const auto it = mapWallet.find(txhash);
|
||||||
if (it != mapWallet.end()) {
|
if (it != mapWallet.end()) {
|
||||||
const CWalletTx& wtx = it->second;
|
const CWalletTx& wtx = it->second;
|
||||||
|
|
Loading…
Add table
Reference in a new issue