diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -865,8 +865,10 @@ } FindCoins(coins); - return SignTransaction(mtx, request.params[2], &keystore, coins, true, - request.params[3]); + // Parse the prevtxs array + ParsePrevouts(request.params[2], &keystore, coins); + + return SignTransaction(mtx, &keystore, coins, request.params[3]); } static UniValue sendrawtransaction(const Config &config, diff --git a/src/rpc/rawtransaction_util.h b/src/rpc/rawtransaction_util.h --- a/src/rpc/rawtransaction_util.h +++ b/src/rpc/rawtransaction_util.h @@ -13,26 +13,37 @@ class CMutableTransaction; class Coin; class COutPoint; +class SigningProvider; class UniValue; /** * Sign a transaction with the given keystore and previous transactions * * @param mtx The transaction to-be-signed - * @param prevTxs Array of previous txns outputs that tx depends on but - * may not yet be in the block chain * @param keystore Temporary keystore containing signing keys * @param coins Map of unspent outputs - coins in mempool and current * chain UTXO set, may be extended by previous txns outputs after call - * @param tempKeystore Whether to use temporary keystore * @param hashType The signature hash type * @returns JSON object with details of signed transaction */ -UniValue SignTransaction(CMutableTransaction &mtx, const UniValue &prevTxs, - FillableSigningProvider *keystore, - std::map &coins, bool tempKeystore, +UniValue SignTransaction(CMutableTransaction &mtx, + const SigningProvider *keystore, + std::map &coins, const UniValue &hashType); +/** + * Parse a prevtxs UniValue array and get the map of coins from it + * + * @param prevTxs Array of previous txns outputs that tx depends on but + * may not yet be in the block chain + * @param keystore A pointer to the temprorary keystore if there is one + * @param coins Map of unspent outputs - coins in mempool and current + * chain UTXO set, may be extended by previous txns outputs after call + */ +void ParsePrevouts(const UniValue &prevTxsUnival, + FillableSigningProvider *keystore, + std::map &coins); + /** Create a transaction from univalue parameters */ CMutableTransaction ConstructTransaction(const CChainParams ¶ms, const UniValue &inputs_in, diff --git a/src/rpc/rawtransaction_util.cpp b/src/rpc/rawtransaction_util.cpp --- a/src/rpc/rawtransaction_util.cpp +++ b/src/rpc/rawtransaction_util.cpp @@ -157,12 +157,9 @@ vErrorsRet.push_back(entry); } -UniValue SignTransaction(CMutableTransaction &mtx, - const UniValue &prevTxsUnival, - FillableSigningProvider *keystore, - std::map &coins, - bool is_temp_keystore, const UniValue &hashType) { - // Add previous txouts given in the RPC call: +void ParsePrevouts(const UniValue &prevTxsUnival, + FillableSigningProvider *keystore, + std::map &coins) { if (!prevTxsUnival.isNull()) { UniValue prevTxs = prevTxsUnival.get_array(); for (size_t idx = 0; idx < prevTxs.size(); ++idx) { @@ -232,7 +229,7 @@ // If redeemScript and private keys were given, add redeemScript to // the keystore so it can be signed - if (is_temp_keystore && scriptPubKey.IsPayToScriptHash()) { + if (keystore && scriptPubKey.IsPayToScriptHash()) { RPCTypeCheckObj( prevOut, { {"redeemScript", UniValueType(UniValue::VSTR)}, @@ -246,7 +243,12 @@ } } } +} +UniValue SignTransaction(CMutableTransaction &mtx, + const SigningProvider *keystore, + std::map &coins, + const UniValue &hashType) { SigHashType sigHashType = ParseSighashString(hashType); if (!sigHashType.hasForkId()) { throw JSONRPCError(RPC_INVALID_PARAMETER, diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3816,8 +3816,10 @@ } pwallet->chain().findCoins(coins); - return SignTransaction(mtx, request.params[1], pwallet, coins, false, - request.params[2]); + // Parse the prevtxs array + ParsePrevouts(request.params[1], nullptr, coins); + + return SignTransaction(mtx, pwallet, coins, request.params[2]); } UniValue rescanblockchain(const Config &config, const JSONRPCRequest &request) {