Merge bitcoin/bitcoin#22337: wallet: Use bilingual_str for errors
92993aa5cfChange SignTransaction's input_errors to use bilingual_str (Andrew Chow)171366e89bUse bilingual_str for address fetching functions (Andrew Chow)9571c69b51Add bilingual_str::clear() (Andrew Chow) Pull request description: In a couple of places in the wallet, errors are `std::string`. In order for these errors to be translated, change them to use `bilingual_str`. ACKs for top commit: hebasto: re-ACK92993aa5cf, only rebased since my [previous](https://github.com/bitcoin/bitcoin/pull/22337#pullrequestreview-694542729) review, verified with klementtan: Code review ACK92993aa5cfmeshcollider: Code review ACK92993aa5cfTree-SHA512: 5400e419dd87db8c49b67ed0964de2d44b58010a566ca246f2f0760ed9ef6a9b6f6df7a6adcb211b315b74c727bfe8c7d07eb5690b5922fa5828ceef4c83461f
This commit is contained in:
17 files changed
+74
-60
No files matched your search
@@ -18,6 +18,7 @@
|
|||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
#include <util/rbf.h>
|
#include <util/rbf.h>
|
||||||
#include <util/strencodings.h>
|
#include <util/strencodings.h>
|
||||||
|
#include <util/translation.h>
|
||||||
|
|
||||||
CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniValue& outputs_in, const UniValue& locktime, bool rbf)
|
CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniValue& outputs_in, const UniValue& locktime, bool rbf)
|
||||||
{
|
{
|
||||||
@@ -280,22 +281,22 @@ void SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore,
|
|||||||
int nHashType = ParseSighashString(hashType);
|
int nHashType = ParseSighashString(hashType);
|
||||||
|
|
||||||
// Script verification errors
|
// Script verification errors
|
||||||
std::map<int, std::string> input_errors;
|
std::map<int, bilingual_str> input_errors;
|
||||||
|
|
||||||
bool complete = SignTransaction(mtx, keystore, coins, nHashType, input_errors);
|
bool complete = SignTransaction(mtx, keystore, coins, nHashType, input_errors);
|
||||||
SignTransactionResultToJSON(mtx, complete, coins, input_errors, result);
|
SignTransactionResultToJSON(mtx, complete, coins, input_errors, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, std::string>& input_errors, UniValue& result)
|
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, bilingual_str>& input_errors, UniValue& result)
|
||||||
{
|
{
|
||||||
// Make errors UniValue
|
// Make errors UniValue
|
||||||
UniValue vErrors(UniValue::VARR);
|
UniValue vErrors(UniValue::VARR);
|
||||||
for (const auto& err_pair : input_errors) {
|
for (const auto& err_pair : input_errors) {
|
||||||
if (err_pair.second == "Missing amount") {
|
if (err_pair.second.original == "Missing amount") {
|
||||||
// This particular error needs to be an exception for some reason
|
// This particular error needs to be an exception for some reason
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, strprintf("Missing amount for %s", coins.at(mtx.vin.at(err_pair.first).prevout).out.ToString()));
|
throw JSONRPCError(RPC_TYPE_ERROR, strprintf("Missing amount for %s", coins.at(mtx.vin.at(err_pair.first).prevout).out.ToString()));
|
||||||
}
|
}
|
||||||
TxInErrorToJSON(mtx.vin.at(err_pair.first), vErrors, err_pair.second);
|
TxInErrorToJSON(mtx.vin.at(err_pair.first), vErrors, err_pair.second.original);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.pushKV("hex", EncodeHexTx(CTransaction(mtx)));
|
result.pushKV("hex", EncodeHexTx(CTransaction(mtx)));
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
struct bilingual_str;
|
||||||
class FillableSigningProvider;
|
class FillableSigningProvider;
|
||||||
class UniValue;
|
class UniValue;
|
||||||
struct CMutableTransaction;
|
struct CMutableTransaction;
|
||||||
@@ -25,7 +26,7 @@ class SigningProvider;
|
|||||||
* @param result JSON object where signed transaction results accumulate
|
* @param result JSON object where signed transaction results accumulate
|
||||||
*/
|
*/
|
||||||
void SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map<COutPoint, Coin>& coins, const UniValue& hashType, UniValue& result);
|
void SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map<COutPoint, Coin>& coins, const UniValue& hashType, UniValue& result);
|
||||||
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, std::string>& input_errors, UniValue& result);
|
void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const std::map<COutPoint, Coin>& coins, const std::map<int, bilingual_str>& input_errors, UniValue& result);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a prevtxs UniValue array and get the map of coins from it
|
* Parse a prevtxs UniValue array and get the map of coins from it
|
||||||
|
|||||||
+7
-6
@@ -11,6 +11,7 @@
|
|||||||
#include <script/signingprovider.h>
|
#include <script/signingprovider.h>
|
||||||
#include <script/standard.h>
|
#include <script/standard.h>
|
||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
|
#include <util/translation.h>
|
||||||
#include <util/vector.h>
|
#include <util/vector.h>
|
||||||
|
|
||||||
typedef std::vector<unsigned char> valtype;
|
typedef std::vector<unsigned char> valtype;
|
||||||
@@ -629,7 +630,7 @@ bool IsSegWitOutput(const SigningProvider& provider, const CScript& script)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map<COutPoint, Coin>& coins, int nHashType, std::map<int, std::string>& input_errors)
|
bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore, const std::map<COutPoint, Coin>& coins, int nHashType, std::map<int, bilingual_str>& input_errors)
|
||||||
{
|
{
|
||||||
bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE);
|
bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE);
|
||||||
|
|
||||||
@@ -661,7 +662,7 @@ bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore,
|
|||||||
CTxIn& txin = mtx.vin[i];
|
CTxIn& txin = mtx.vin[i];
|
||||||
auto coin = coins.find(txin.prevout);
|
auto coin = coins.find(txin.prevout);
|
||||||
if (coin == coins.end() || coin->second.IsSpent()) {
|
if (coin == coins.end() || coin->second.IsSpent()) {
|
||||||
input_errors[i] = "Input not found or already spent";
|
input_errors[i] = _("Input not found or already spent");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const CScript& prevPubKey = coin->second.out.scriptPubKey;
|
const CScript& prevPubKey = coin->second.out.scriptPubKey;
|
||||||
@@ -677,7 +678,7 @@ bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore,
|
|||||||
|
|
||||||
// amount must be specified for valid segwit signature
|
// amount must be specified for valid segwit signature
|
||||||
if (amount == MAX_MONEY && !txin.scriptWitness.IsNull()) {
|
if (amount == MAX_MONEY && !txin.scriptWitness.IsNull()) {
|
||||||
input_errors[i] = "Missing amount";
|
input_errors[i] = _("Missing amount");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,12 +686,12 @@ bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* keystore,
|
|||||||
if (!VerifyScript(txin.scriptSig, prevPubKey, &txin.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount, txdata, MissingDataBehavior::FAIL), &serror)) {
|
if (!VerifyScript(txin.scriptSig, prevPubKey, &txin.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount, txdata, MissingDataBehavior::FAIL), &serror)) {
|
||||||
if (serror == SCRIPT_ERR_INVALID_STACK_OPERATION) {
|
if (serror == SCRIPT_ERR_INVALID_STACK_OPERATION) {
|
||||||
// Unable to sign input and verification failed (possible attempt to partially sign).
|
// Unable to sign input and verification failed (possible attempt to partially sign).
|
||||||
input_errors[i] = "Unable to sign input, invalid stack size (possibly missing key)";
|
input_errors[i] = Untranslated("Unable to sign input, invalid stack size (possibly missing key)");
|
||||||
} else if (serror == SCRIPT_ERR_SIG_NULLFAIL) {
|
} else if (serror == SCRIPT_ERR_SIG_NULLFAIL) {
|
||||||
// Verification failed (possibly due to insufficient signatures).
|
// Verification failed (possibly due to insufficient signatures).
|
||||||
input_errors[i] = "CHECK(MULTI)SIG failing with non-zero signature (possibly need more signatures)";
|
input_errors[i] = Untranslated("CHECK(MULTI)SIG failing with non-zero signature (possibly need more signatures)");
|
||||||
} else {
|
} else {
|
||||||
input_errors[i] = ScriptErrorString(serror);
|
input_errors[i] = Untranslated(ScriptErrorString(serror));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// If this input succeeds, make sure there is no error set for it
|
// If this input succeeds, make sure there is no error set for it
|
||||||
|
|||||||
+2
-1
@@ -21,6 +21,7 @@ class CScript;
|
|||||||
class CTransaction;
|
class CTransaction;
|
||||||
class SigningProvider;
|
class SigningProvider;
|
||||||
|
|
||||||
|
struct bilingual_str;
|
||||||
struct CMutableTransaction;
|
struct CMutableTransaction;
|
||||||
|
|
||||||
/** Interface for signature creators. */
|
/** Interface for signature creators. */
|
||||||
@@ -178,6 +179,6 @@ bool IsSolvable(const SigningProvider& provider, const CScript& script);
|
|||||||
bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
|
bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
|
||||||
|
|
||||||
/** Sign the CMutableTransaction */
|
/** Sign the CMutableTransaction */
|
||||||
bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors);
|
bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors);
|
||||||
|
|
||||||
#endif // BITCOIN_SCRIPT_SIGN_H
|
#endif // BITCOIN_SCRIPT_SIGN_H
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <test/fuzz/FuzzedDataProvider.h>
|
#include <test/fuzz/FuzzedDataProvider.h>
|
||||||
#include <test/fuzz/fuzz.h>
|
#include <test/fuzz/fuzz.h>
|
||||||
#include <test/fuzz/util.h>
|
#include <test/fuzz/util.h>
|
||||||
|
#include <util/translation.h>
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@@ -135,7 +136,7 @@ FUZZ_TARGET_INIT(script_sign, initialize_script_sign)
|
|||||||
}
|
}
|
||||||
coins[*outpoint] = *coin;
|
coins[*outpoint] = *coin;
|
||||||
}
|
}
|
||||||
std::map<int, std::string> input_errors;
|
std::map<int, bilingual_str> input_errors;
|
||||||
(void)SignTransaction(sign_transaction_tx_to, &provider, coins, fuzzed_data_provider.ConsumeIntegral<int>(), input_errors);
|
(void)SignTransaction(sign_transaction_tx_to, &provider, coins, fuzzed_data_provider.ConsumeIntegral<int>(), input_errors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ CMutableTransaction TestChain100Setup::CreateValidMempoolTransaction(CTransactio
|
|||||||
input_coins.insert({outpoint_to_spend, utxo_to_spend});
|
input_coins.insert({outpoint_to_spend, utxo_to_spend});
|
||||||
// - Default signature hashing type
|
// - Default signature hashing type
|
||||||
int nHashType = SIGHASH_ALL;
|
int nHashType = SIGHASH_ALL;
|
||||||
std::map<int, std::string> input_errors;
|
std::map<int, bilingual_str> input_errors;
|
||||||
assert(SignTransaction(mempool_txn, &keystore, input_coins, nHashType, input_errors));
|
assert(SignTransaction(mempool_txn, &keystore, input_coins, nHashType, input_errors));
|
||||||
|
|
||||||
// If submit=true, add transaction to the mempool.
|
// If submit=true, add transaction to the mempool.
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <outputtype.h>
|
#include <outputtype.h>
|
||||||
#include <script/standard.h>
|
#include <script/standard.h>
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
|
#include <util/translation.h>
|
||||||
#include <wallet/wallet.h>
|
#include <wallet/wallet.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ std::string getnewaddress(CWallet& w)
|
|||||||
{
|
{
|
||||||
constexpr auto output_type = OutputType::BECH32;
|
constexpr auto output_type = OutputType::BECH32;
|
||||||
CTxDestination dest;
|
CTxDestination dest;
|
||||||
std::string error;
|
bilingual_str error;
|
||||||
if (!w.GetNewDestination(output_type, "", dest, error)) assert(false);
|
if (!w.GetNewDestination(output_type, "", dest, error)) assert(false);
|
||||||
|
|
||||||
return EncodeDestination(dest);
|
return EncodeDestination(dest);
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ struct bilingual_str {
|
|||||||
{
|
{
|
||||||
return original.empty();
|
return original.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
original.clear();
|
||||||
|
translated.clear();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bilingual_str operator+(bilingual_str lhs, const bilingual_str& rhs)
|
inline bilingual_str operator+(bilingual_str lhs, const bilingual_str& rhs)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include <uint256.h>
|
#include <uint256.h>
|
||||||
#include <util/check.h>
|
#include <util/check.h>
|
||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
|
#include <util/translation.h>
|
||||||
#include <util/ui_change_type.h>
|
#include <util/ui_change_type.h>
|
||||||
#include <wallet/context.h>
|
#include <wallet/context.h>
|
||||||
#include <wallet/feebumper.h>
|
#include <wallet/feebumper.h>
|
||||||
@@ -130,7 +131,7 @@ public:
|
|||||||
bool getNewDestination(const OutputType type, const std::string label, CTxDestination& dest) override
|
bool getNewDestination(const OutputType type, const std::string label, CTxDestination& dest) override
|
||||||
{
|
{
|
||||||
LOCK(m_wallet->cs_wallet);
|
LOCK(m_wallet->cs_wallet);
|
||||||
std::string error;
|
bilingual_str error;
|
||||||
return m_wallet->GetNewDestination(type, label, dest, error);
|
return m_wallet->GetNewDestination(type, label, dest, error);
|
||||||
}
|
}
|
||||||
bool getPubKey(const CScript& script, const CKeyID& address, CPubKey& pub_key) override
|
bool getPubKey(const CScript& script, const CKeyID& address, CPubKey& pub_key) override
|
||||||
|
|||||||
@@ -276,9 +276,9 @@ static RPCHelpMan getnewaddress()
|
|||||||
}
|
}
|
||||||
|
|
||||||
CTxDestination dest;
|
CTxDestination dest;
|
||||||
std::string error;
|
bilingual_str error;
|
||||||
if (!pwallet->GetNewDestination(output_type, label, dest, error)) {
|
if (!pwallet->GetNewDestination(output_type, label, dest, error)) {
|
||||||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, error);
|
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, error.original);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EncodeDestination(dest);
|
return EncodeDestination(dest);
|
||||||
@@ -324,9 +324,9 @@ static RPCHelpMan getrawchangeaddress()
|
|||||||
}
|
}
|
||||||
|
|
||||||
CTxDestination dest;
|
CTxDestination dest;
|
||||||
std::string error;
|
bilingual_str error;
|
||||||
if (!pwallet->GetNewChangeDestination(output_type, dest, error)) {
|
if (!pwallet->GetNewChangeDestination(output_type, dest, error)) {
|
||||||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, error);
|
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, error.original);
|
||||||
}
|
}
|
||||||
return EncodeDestination(dest);
|
return EncodeDestination(dest);
|
||||||
},
|
},
|
||||||
@@ -3392,7 +3392,7 @@ RPCHelpMan signrawtransactionwithwallet()
|
|||||||
int nHashType = ParseSighashString(request.params[2]);
|
int nHashType = ParseSighashString(request.params[2]);
|
||||||
|
|
||||||
// Script verification errors
|
// Script verification errors
|
||||||
std::map<int, std::string> input_errors;
|
std::map<int, bilingual_str> input_errors;
|
||||||
|
|
||||||
bool complete = pwallet->SignTransaction(mtx, coins, nHashType, input_errors);
|
bool complete = pwallet->SignTransaction(mtx, coins, nHashType, input_errors);
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
|
|||||||
@@ -20,10 +20,10 @@
|
|||||||
//! Value for the first BIP 32 hardened derivation. Can be used as a bit mask and as a value. See BIP 32 for more details.
|
//! Value for the first BIP 32 hardened derivation. Can be used as a bit mask and as a value. See BIP 32 for more details.
|
||||||
const uint32_t BIP32_HARDENED_KEY_LIMIT = 0x80000000;
|
const uint32_t BIP32_HARDENED_KEY_LIMIT = 0x80000000;
|
||||||
|
|
||||||
bool LegacyScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error)
|
bool LegacyScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error)
|
||||||
{
|
{
|
||||||
if (LEGACY_OUTPUT_TYPES.count(type) == 0) {
|
if (LEGACY_OUTPUT_TYPES.count(type) == 0) {
|
||||||
error = _("Error: Legacy wallets only support the \"legacy\", \"p2sh-segwit\", and \"bech32\" address types").translated;
|
error = _("Error: Legacy wallets only support the \"legacy\", \"p2sh-segwit\", and \"bech32\" address types");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(type != OutputType::BECH32M);
|
assert(type != OutputType::BECH32M);
|
||||||
@@ -34,7 +34,7 @@ bool LegacyScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestinat
|
|||||||
// Generate a new key that is added to wallet
|
// Generate a new key that is added to wallet
|
||||||
CPubKey new_key;
|
CPubKey new_key;
|
||||||
if (!GetKeyFromPool(new_key, type)) {
|
if (!GetKeyFromPool(new_key, type)) {
|
||||||
error = _("Error: Keypool ran out, please call keypoolrefill first").translated;
|
error = _("Error: Keypool ran out, please call keypoolrefill first");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
LearnRelatedScripts(new_key, type);
|
LearnRelatedScripts(new_key, type);
|
||||||
@@ -295,22 +295,22 @@ bool LegacyScriptPubKeyMan::Encrypt(const CKeyingMaterial& master_key, WalletBat
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LegacyScriptPubKeyMan::GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error)
|
bool LegacyScriptPubKeyMan::GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error)
|
||||||
{
|
{
|
||||||
if (LEGACY_OUTPUT_TYPES.count(type) == 0) {
|
if (LEGACY_OUTPUT_TYPES.count(type) == 0) {
|
||||||
error = _("Error: Legacy wallets only support the \"legacy\", \"p2sh-segwit\", and \"bech32\" address types").translated;
|
error = _("Error: Legacy wallets only support the \"legacy\", \"p2sh-segwit\", and \"bech32\" address types");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(type != OutputType::BECH32M);
|
assert(type != OutputType::BECH32M);
|
||||||
|
|
||||||
LOCK(cs_KeyStore);
|
LOCK(cs_KeyStore);
|
||||||
if (!CanGetAddresses(internal)) {
|
if (!CanGetAddresses(internal)) {
|
||||||
error = _("Error: Keypool ran out, please call keypoolrefill first").translated;
|
error = _("Error: Keypool ran out, please call keypoolrefill first");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ReserveKeyFromKeyPool(index, keypool, internal)) {
|
if (!ReserveKeyFromKeyPool(index, keypool, internal)) {
|
||||||
error = _("Error: Keypool ran out, please call keypoolrefill first").translated;
|
error = _("Error: Keypool ran out, please call keypoolrefill first");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
address = GetDestinationForKey(keypool.vchPubKey, type);
|
address = GetDestinationForKey(keypool.vchPubKey, type);
|
||||||
@@ -592,7 +592,7 @@ bool LegacyScriptPubKeyMan::CanProvide(const CScript& script, SignatureData& sig
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LegacyScriptPubKeyMan::SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const
|
bool LegacyScriptPubKeyMan::SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const
|
||||||
{
|
{
|
||||||
return ::SignTransaction(tx, this, coins, sighash, input_errors);
|
return ::SignTransaction(tx, this, coins, sighash, input_errors);
|
||||||
}
|
}
|
||||||
@@ -1613,11 +1613,11 @@ std::set<CKeyID> LegacyScriptPubKeyMan::GetKeys() const
|
|||||||
return set_address;
|
return set_address;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DescriptorScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error)
|
bool DescriptorScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error)
|
||||||
{
|
{
|
||||||
// Returns true if this descriptor supports getting new addresses. Conditions where we may be unable to fetch them (e.g. locked) are caught later
|
// Returns true if this descriptor supports getting new addresses. Conditions where we may be unable to fetch them (e.g. locked) are caught later
|
||||||
if (!CanGetAddresses()) {
|
if (!CanGetAddresses()) {
|
||||||
error = "No addresses available";
|
error = _("No addresses available");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@@ -1636,12 +1636,12 @@ bool DescriptorScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDest
|
|||||||
std::vector<CScript> scripts_temp;
|
std::vector<CScript> scripts_temp;
|
||||||
if (m_wallet_descriptor.range_end <= m_max_cached_index && !TopUp(1)) {
|
if (m_wallet_descriptor.range_end <= m_max_cached_index && !TopUp(1)) {
|
||||||
// We can't generate anymore keys
|
// We can't generate anymore keys
|
||||||
error = "Error: Keypool ran out, please call keypoolrefill first";
|
error = _("Error: Keypool ran out, please call keypoolrefill first");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!m_wallet_descriptor.descriptor->ExpandFromCache(m_wallet_descriptor.next_index, m_wallet_descriptor.cache, scripts_temp, out_keys)) {
|
if (!m_wallet_descriptor.descriptor->ExpandFromCache(m_wallet_descriptor.next_index, m_wallet_descriptor.cache, scripts_temp, out_keys)) {
|
||||||
// We can't generate anymore keys
|
// We can't generate anymore keys
|
||||||
error = "Error: Keypool ran out, please call keypoolrefill first";
|
error = _("Error: Keypool ran out, please call keypoolrefill first");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1721,7 +1721,7 @@ bool DescriptorScriptPubKeyMan::Encrypt(const CKeyingMaterial& master_key, Walle
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DescriptorScriptPubKeyMan::GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error)
|
bool DescriptorScriptPubKeyMan::GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error)
|
||||||
{
|
{
|
||||||
LOCK(cs_desc_man);
|
LOCK(cs_desc_man);
|
||||||
bool result = GetNewDestination(type, address, error);
|
bool result = GetNewDestination(type, address, error);
|
||||||
@@ -2046,7 +2046,7 @@ bool DescriptorScriptPubKeyMan::CanProvide(const CScript& script, SignatureData&
|
|||||||
return IsMine(script);
|
return IsMine(script);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DescriptorScriptPubKeyMan::SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const
|
bool DescriptorScriptPubKeyMan::SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const
|
||||||
{
|
{
|
||||||
std::unique_ptr<FlatSigningProvider> keys = std::make_unique<FlatSigningProvider>();
|
std::unique_ptr<FlatSigningProvider> keys = std::make_unique<FlatSigningProvider>();
|
||||||
for (const auto& coin_pair : coins) {
|
for (const auto& coin_pair : coins) {
|
||||||
|
|||||||
@@ -174,14 +174,14 @@ protected:
|
|||||||
public:
|
public:
|
||||||
explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
|
explicit ScriptPubKeyMan(WalletStorage& storage) : m_storage(storage) {}
|
||||||
virtual ~ScriptPubKeyMan() {};
|
virtual ~ScriptPubKeyMan() {};
|
||||||
virtual bool GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error) { return false; }
|
virtual bool GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error) { return false; }
|
||||||
virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
|
virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
|
||||||
|
|
||||||
//! Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the keys handled by it.
|
//! Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the keys handled by it.
|
||||||
virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) { return false; }
|
virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) { return false; }
|
||||||
virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
|
virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
|
||||||
|
|
||||||
virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error) { return false; }
|
virtual bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error) { return false; }
|
||||||
virtual void KeepDestination(int64_t index, const OutputType& type) {}
|
virtual void KeepDestination(int64_t index, const OutputType& type) {}
|
||||||
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
|
virtual void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) {}
|
||||||
|
|
||||||
@@ -230,7 +230,7 @@ public:
|
|||||||
virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
|
virtual bool CanProvide(const CScript& script, SignatureData& sigdata) { return false; }
|
||||||
|
|
||||||
/** Creates new signatures and adds them to the transaction. Returns whether all inputs were signed */
|
/** Creates new signatures and adds them to the transaction. Returns whether all inputs were signed */
|
||||||
virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const { return false; }
|
virtual bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const { return false; }
|
||||||
/** Sign a message with the given script */
|
/** Sign a message with the given script */
|
||||||
virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
|
virtual SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const { return SigningResult::SIGNING_FAILED; };
|
||||||
/** Adds script and derivation path information to a PSBT, and optionally signs it. */
|
/** Adds script and derivation path information to a PSBT, and optionally signs it. */
|
||||||
@@ -355,13 +355,13 @@ private:
|
|||||||
public:
|
public:
|
||||||
using ScriptPubKeyMan::ScriptPubKeyMan;
|
using ScriptPubKeyMan::ScriptPubKeyMan;
|
||||||
|
|
||||||
bool GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error) override;
|
bool GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error) override;
|
||||||
isminetype IsMine(const CScript& script) const override;
|
isminetype IsMine(const CScript& script) const override;
|
||||||
|
|
||||||
bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
|
bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
|
||||||
bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
|
bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
|
||||||
|
|
||||||
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error) override;
|
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error) override;
|
||||||
void KeepDestination(int64_t index, const OutputType& type) override;
|
void KeepDestination(int64_t index, const OutputType& type) override;
|
||||||
void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
|
void ReturnDestination(int64_t index, bool internal, const CTxDestination&) override;
|
||||||
|
|
||||||
@@ -396,7 +396,7 @@ public:
|
|||||||
|
|
||||||
bool CanProvide(const CScript& script, SignatureData& sigdata) override;
|
bool CanProvide(const CScript& script, SignatureData& sigdata) override;
|
||||||
|
|
||||||
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const override;
|
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
|
||||||
SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
|
SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
|
||||||
TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
|
TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
|
||||||
|
|
||||||
@@ -559,13 +559,13 @@ public:
|
|||||||
|
|
||||||
mutable RecursiveMutex cs_desc_man;
|
mutable RecursiveMutex cs_desc_man;
|
||||||
|
|
||||||
bool GetNewDestination(const OutputType type, CTxDestination& dest, std::string& error) override;
|
bool GetNewDestination(const OutputType type, CTxDestination& dest, bilingual_str& error) override;
|
||||||
isminetype IsMine(const CScript& script) const override;
|
isminetype IsMine(const CScript& script) const override;
|
||||||
|
|
||||||
bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
|
bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
|
||||||
bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
|
bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
|
||||||
|
|
||||||
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, std::string& error) override;
|
bool GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool, bilingual_str& error) override;
|
||||||
void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
|
void ReturnDestination(int64_t index, bool internal, const CTxDestination& addr) override;
|
||||||
|
|
||||||
// Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
|
// Tops up the descriptor cache and m_map_script_pub_keys. The cache is stored in the wallet file
|
||||||
@@ -601,7 +601,7 @@ public:
|
|||||||
|
|
||||||
bool CanProvide(const CScript& script, SignatureData& sigdata) override;
|
bool CanProvide(const CScript& script, SignatureData& sigdata) override;
|
||||||
|
|
||||||
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const override;
|
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const override;
|
||||||
SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
|
SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const override;
|
||||||
TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
|
TransactionError FillPSBT(PartiallySignedTransaction& psbt, const PrecomputedTransactionData& txdata, int sighash_type = 1 /* SIGHASH_ALL */, bool sign = true, bool bip32derivs = false, int* n_signed = nullptr) const override;
|
||||||
|
|
||||||
|
|||||||
@@ -618,9 +618,9 @@ bool CWallet::CreateTransactionInternal(
|
|||||||
// Reserve a new key pair from key pool. If it fails, provide a dummy
|
// Reserve a new key pair from key pool. If it fails, provide a dummy
|
||||||
// destination in case we don't need change.
|
// destination in case we don't need change.
|
||||||
CTxDestination dest;
|
CTxDestination dest;
|
||||||
std::string dest_err;
|
bilingual_str dest_err;
|
||||||
if (!reservedest.GetReservedDestination(dest, true, dest_err)) {
|
if (!reservedest.GetReservedDestination(dest, true, dest_err)) {
|
||||||
error = strprintf(_("Transaction needs a change address, but we can't generate it. %s"), dest_err);
|
error = _("Transaction needs a change address, but we can't generate it.") + Untranslated(" ") + dest_err;
|
||||||
}
|
}
|
||||||
scriptChange = GetScriptForDestination(dest);
|
scriptChange = GetScriptForDestination(dest);
|
||||||
// A valid destination implies a change script (and
|
// A valid destination implies a change script (and
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <primitives/transaction.h>
|
#include <primitives/transaction.h>
|
||||||
#include <random.h>
|
#include <random.h>
|
||||||
#include <test/util/setup_common.h>
|
#include <test/util/setup_common.h>
|
||||||
|
#include <util/translation.h>
|
||||||
#include <wallet/coincontrol.h>
|
#include <wallet/coincontrol.h>
|
||||||
#include <wallet/coinselection.h>
|
#include <wallet/coinselection.h>
|
||||||
#include <wallet/test/wallet_test_fixture.h>
|
#include <wallet/test/wallet_test_fixture.h>
|
||||||
@@ -66,7 +67,7 @@ static void add_coin(CWallet& wallet, const CAmount& nValue, int nAge = 6*24, bo
|
|||||||
tx.vout[nInput].nValue = nValue;
|
tx.vout[nInput].nValue = nValue;
|
||||||
if (spendable) {
|
if (spendable) {
|
||||||
CTxDestination dest;
|
CTxDestination dest;
|
||||||
std::string error;
|
bilingual_str error;
|
||||||
const bool destination_ok = wallet.GetNewDestination(OutputType::BECH32, "", dest, error);
|
const bool destination_ok = wallet.GetNewDestination(OutputType::BECH32, "", dest, error);
|
||||||
assert(destination_ok);
|
assert(destination_ok);
|
||||||
tx.vout[nInput].scriptPubKey = GetScriptForDestination(dest);
|
tx.vout[nInput].scriptPubKey = GetScriptForDestination(dest);
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ static CMutableTransaction TestSimpleSpend(const CTransaction& from, uint32_t in
|
|||||||
keystore.AddKey(key);
|
keystore.AddKey(key);
|
||||||
std::map<COutPoint, Coin> coins;
|
std::map<COutPoint, Coin> coins;
|
||||||
coins[mtx.vin[0].prevout].out = from.vout[index];
|
coins[mtx.vin[0].prevout].out = from.vout[index];
|
||||||
std::map<int, std::string> input_errors;
|
std::map<int, bilingual_str> input_errors;
|
||||||
BOOST_CHECK(SignTransaction(mtx, &keystore, coins, SIGHASH_ALL, input_errors));
|
BOOST_CHECK(SignTransaction(mtx, &keystore, coins, SIGHASH_ALL, input_errors));
|
||||||
return mtx;
|
return mtx;
|
||||||
}
|
}
|
||||||
@@ -589,7 +589,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_disableprivkeys, TestChain100Setup)
|
|||||||
wallet->SetWalletFlag(WALLET_FLAG_DISABLE_PRIVATE_KEYS);
|
wallet->SetWalletFlag(WALLET_FLAG_DISABLE_PRIVATE_KEYS);
|
||||||
BOOST_CHECK(!wallet->TopUpKeyPool(1000));
|
BOOST_CHECK(!wallet->TopUpKeyPool(1000));
|
||||||
CTxDestination dest;
|
CTxDestination dest;
|
||||||
std::string error;
|
bilingual_str error;
|
||||||
BOOST_CHECK(!wallet->GetNewDestination(OutputType::BECH32, "", dest, error));
|
BOOST_CHECK(!wallet->GetNewDestination(OutputType::BECH32, "", dest, error));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1829,11 +1829,11 @@ bool CWallet::SignTransaction(CMutableTransaction& tx) const
|
|||||||
const CWalletTx& wtx = mi->second;
|
const CWalletTx& wtx = mi->second;
|
||||||
coins[input.prevout] = Coin(wtx.tx->vout[input.prevout.n], wtx.m_confirm.block_height, wtx.IsCoinBase());
|
coins[input.prevout] = Coin(wtx.tx->vout[input.prevout.n], wtx.m_confirm.block_height, wtx.IsCoinBase());
|
||||||
}
|
}
|
||||||
std::map<int, std::string> input_errors;
|
std::map<int, bilingual_str> input_errors;
|
||||||
return SignTransaction(tx, coins, SIGHASH_DEFAULT, input_errors);
|
return SignTransaction(tx, coins, SIGHASH_DEFAULT, input_errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const
|
bool CWallet::SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const
|
||||||
{
|
{
|
||||||
// Try to sign with all ScriptPubKeyMans
|
// Try to sign with all ScriptPubKeyMans
|
||||||
for (ScriptPubKeyMan* spk_man : GetAllScriptPubKeyMans()) {
|
for (ScriptPubKeyMan* spk_man : GetAllScriptPubKeyMans()) {
|
||||||
@@ -2135,7 +2135,7 @@ bool CWallet::TopUpKeyPool(unsigned int kpSize)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::GetNewDestination(const OutputType type, const std::string label, CTxDestination& dest, std::string& error)
|
bool CWallet::GetNewDestination(const OutputType type, const std::string label, CTxDestination& dest, bilingual_str& error)
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
error.clear();
|
error.clear();
|
||||||
@@ -2145,7 +2145,7 @@ bool CWallet::GetNewDestination(const OutputType type, const std::string label,
|
|||||||
spk_man->TopUp();
|
spk_man->TopUp();
|
||||||
result = spk_man->GetNewDestination(type, dest, error);
|
result = spk_man->GetNewDestination(type, dest, error);
|
||||||
} else {
|
} else {
|
||||||
error = strprintf(_("Error: No %s addresses available."), FormatOutputType(type)).translated;
|
error = strprintf(_("Error: No %s addresses available."), FormatOutputType(type));
|
||||||
}
|
}
|
||||||
if (result) {
|
if (result) {
|
||||||
SetAddressBook(dest, label, "receive");
|
SetAddressBook(dest, label, "receive");
|
||||||
@@ -2154,7 +2154,7 @@ bool CWallet::GetNewDestination(const OutputType type, const std::string label,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::GetNewChangeDestination(const OutputType type, CTxDestination& dest, std::string& error)
|
bool CWallet::GetNewChangeDestination(const OutputType type, CTxDestination& dest, bilingual_str& error)
|
||||||
{
|
{
|
||||||
LOCK(cs_wallet);
|
LOCK(cs_wallet);
|
||||||
error.clear();
|
error.clear();
|
||||||
@@ -2207,11 +2207,11 @@ std::set<CTxDestination> CWallet::GetLabelAddresses(const std::string& label) co
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReserveDestination::GetReservedDestination(CTxDestination& dest, bool internal, std::string& error)
|
bool ReserveDestination::GetReservedDestination(CTxDestination& dest, bool internal, bilingual_str& error)
|
||||||
{
|
{
|
||||||
m_spk_man = pwallet->GetScriptPubKeyMan(type, internal);
|
m_spk_man = pwallet->GetScriptPubKeyMan(type, internal);
|
||||||
if (!m_spk_man) {
|
if (!m_spk_man) {
|
||||||
error = strprintf(_("Error: No %s addresses available."), FormatOutputType(type)).translated;
|
error = strprintf(_("Error: No %s addresses available."), FormatOutputType(type));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -183,7 +183,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Reserve an address
|
//! Reserve an address
|
||||||
bool GetReservedDestination(CTxDestination& pubkey, bool internal, std::string& error);
|
bool GetReservedDestination(CTxDestination& pubkey, bool internal, bilingual_str& error);
|
||||||
//! Return reserved address
|
//! Return reserved address
|
||||||
void ReturnDestination();
|
void ReturnDestination();
|
||||||
//! Keep the address. Do not return it's key to the keypool when this object goes out of scope
|
//! Keep the address. Do not return it's key to the keypool when this object goes out of scope
|
||||||
@@ -563,7 +563,7 @@ public:
|
|||||||
/** Fetch the inputs and sign with SIGHASH_ALL. */
|
/** Fetch the inputs and sign with SIGHASH_ALL. */
|
||||||
bool SignTransaction(CMutableTransaction& tx) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
bool SignTransaction(CMutableTransaction& tx) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
/** Sign the tx given the input coins and sighash. */
|
/** Sign the tx given the input coins and sighash. */
|
||||||
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, std::string>& input_errors) const;
|
bool SignTransaction(CMutableTransaction& tx, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors) const;
|
||||||
SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const;
|
SigningResult SignMessage(const std::string& message, const PKHash& pkhash, std::string& str_sig) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -665,8 +665,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
void MarkDestinationsDirty(const std::set<CTxDestination>& destinations) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void MarkDestinationsDirty(const std::set<CTxDestination>& destinations) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|
||||||
bool GetNewDestination(const OutputType type, const std::string label, CTxDestination& dest, std::string& error);
|
bool GetNewDestination(const OutputType type, const std::string label, CTxDestination& dest, bilingual_str& error);
|
||||||
bool GetNewChangeDestination(const OutputType type, CTxDestination& dest, std::string& error);
|
bool GetNewChangeDestination(const OutputType type, CTxDestination& dest, bilingual_str& error);
|
||||||
|
|
||||||
isminetype IsMine(const CTxDestination& dest) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
isminetype IsMine(const CTxDestination& dest) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
isminetype IsMine(const CScript& script) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
isminetype IsMine(const CScript& script) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
|
|||||||
Reference in new issue
Block a user