wallet: Use std::optional for GetExternalOutput and fixups

This commit is contained in:
Aurèle Oulès 2022-09-12 12:03:07 +02:00
parent becc45b589
commit 1db23da6e1
2 changed files with 16 additions and 17 deletions

View File

@ -13,9 +13,9 @@
#include <script/signingprovider.h> #include <script/signingprovider.h>
#include <script/standard.h> #include <script/standard.h>
#include <optional>
#include <algorithm> #include <algorithm>
#include <map> #include <map>
#include <optional>
#include <set> #include <set>
namespace wallet { namespace wallet {
@ -65,27 +65,27 @@ public:
bool HasSelected() const bool HasSelected() const
{ {
return (m_selected_inputs.size() > 0); return !m_selected_inputs.empty();
} }
bool IsSelected(const COutPoint& output) const bool IsSelected(const COutPoint& output) const
{ {
return (m_selected_inputs.count(output) > 0); return m_selected_inputs.count(output) > 0;
} }
bool IsExternalSelected(const COutPoint& output) const bool IsExternalSelected(const COutPoint& output) const
{ {
return (m_external_txouts.count(output) > 0); return m_external_txouts.count(output) > 0;
} }
bool GetExternalOutput(const COutPoint& outpoint, CTxOut& txout) const std::optional<CTxOut> GetExternalOutput(const COutPoint& outpoint) const
{ {
const auto ext_it = m_external_txouts.find(outpoint); const auto ext_it = m_external_txouts.find(outpoint);
if (ext_it == m_external_txouts.end()) { if (ext_it == m_external_txouts.end()) {
return false; return std::nullopt;
} }
txout = ext_it->second;
return true; return std::make_optional(ext_it->second);
} }
void Select(const COutPoint& output) void Select(const COutPoint& output)

View File

@ -52,9 +52,7 @@ int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet,
TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, const CCoinControl* coin_control) TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, const CCoinControl* coin_control)
{ {
CMutableTransaction txNew(tx); CMutableTransaction txNew(tx);
if (!wallet->DummySignTx(txNew, txouts, coin_control)) { if (!wallet->DummySignTx(txNew, txouts, coin_control)) return TxSize{-1, -1};
return TxSize{-1, -1};
}
CTransaction ctx(txNew); CTransaction ctx(txNew);
int64_t vsize = GetVirtualTransactionSize(ctx); int64_t vsize = GetVirtualTransactionSize(ctx);
int64_t weight = GetTransactionWeight(ctx); int64_t weight = GetTransactionWeight(ctx);
@ -72,11 +70,9 @@ TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *walle
assert(input.prevout.n < mi->second.tx->vout.size()); assert(input.prevout.n < mi->second.tx->vout.size());
txouts.emplace_back(mi->second.tx->vout.at(input.prevout.n)); txouts.emplace_back(mi->second.tx->vout.at(input.prevout.n));
} else if (coin_control) { } else if (coin_control) {
CTxOut txout; const auto& txout{coin_control->GetExternalOutput(input.prevout)};
if (!coin_control->GetExternalOutput(input.prevout, txout)) { if (!txout) return TxSize{-1, -1};
return TxSize{-1, -1}; txouts.emplace_back(*txout);
}
txouts.emplace_back(txout);
} else { } else {
return TxSize{-1, -1}; return TxSize{-1, -1};
} }
@ -178,9 +174,12 @@ util::Result<PreSelectedInputs> FetchSelectedInputs(const CWallet& wallet, const
input_bytes = CalculateMaximumSignedInputSize(txout, &wallet, &coin_control); input_bytes = CalculateMaximumSignedInputSize(txout, &wallet, &coin_control);
} else { } else {
// The input is external. We did not find the tx in mapWallet. // The input is external. We did not find the tx in mapWallet.
if (!coin_control.GetExternalOutput(outpoint, txout)) { const auto out{coin_control.GetExternalOutput(outpoint)};
if (!out) {
return util::Error{strprintf(_("Not found pre-selected input %s"), outpoint.ToString())}; return util::Error{strprintf(_("Not found pre-selected input %s"), outpoint.ToString())};
} }
txout = *out;
} }
if (input_bytes == -1) { if (input_bytes == -1) {