aboutsummaryrefslogtreecommitdiff
path: root/src/wallet
diff options
context:
space:
mode:
authorjosibake <josibake@protonmail.com>2022-07-29 10:01:25 +0200
committerjosibake <josibake@protonmail.com>2022-08-10 15:19:18 +0200
commit3f27a2adce12c6b0e7b43ba7c024331657bcf335 (patch)
tree3250e5e00118b849c23c76fd8677b5943420c6ae /src/wallet
parentf5649db9d5e984ba7f376ccfd5b0a627f5c42402 (diff)
downloadbitcoin-3f27a2adce12c6b0e7b43ba7c024331657bcf335.tar.xz
refactor: add new helper methods
add Shuffle, Erase, and Add to CoinsResult struct add a helper function for mapping TxoutType to OutputType Co-authored-by: furszy <matiasfurszyfer@protonmail.com>
Diffstat (limited to 'src/wallet')
-rw-r--r--src/wallet/spend.cpp41
-rw-r--r--src/wallet/spend.h4
2 files changed, 45 insertions, 0 deletions
diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp
index b359d3e19b..e9516d480d 100644
--- a/src/wallet/spend.cpp
+++ b/src/wallet/spend.cpp
@@ -105,6 +105,47 @@ void CoinsResult::clear()
other.clear();
}
+void CoinsResult::Erase(std::set<COutPoint>& preset_coins)
+{
+ for (auto& it : coins) {
+ auto& vec = it.second;
+ auto i = std::find_if(vec.begin(), vec.end(), [&](const COutput &c) { return preset_coins.count(c.outpoint);});
+ if (i != vec.end()) {
+ vec.erase(i);
+ break;
+ }
+ }
+}
+
+void CoinsResult::Shuffle(FastRandomContext& rng_fast)
+{
+ for (auto& it : coins) {
+ ::Shuffle(it.second.begin(), it.second.end(), rng_fast);
+ }
+}
+
+void CoinsResult::Add(OutputType type, const COutput& out)
+{
+ coins[type].emplace_back(out);
+}
+
+static OutputType GetOutputType(TxoutType type, bool is_from_p2sh)
+{
+ switch (type) {
+ case TxoutType::WITNESS_V1_TAPROOT:
+ return OutputType::BECH32M;
+ case TxoutType::WITNESS_V0_KEYHASH:
+ case TxoutType::WITNESS_V0_SCRIPTHASH:
+ if (is_from_p2sh) return OutputType::P2SH_SEGWIT;
+ else return OutputType::BECH32;
+ case TxoutType::SCRIPTHASH:
+ case TxoutType::PUBKEYHASH:
+ return OutputType::LEGACY;
+ default:
+ return OutputType::UNKNOWN;
+ }
+}
+
CoinsResult AvailableCoins(const CWallet& wallet,
const CCoinControl* coinControl,
std::optional<CFeeRate> feerate,
diff --git a/src/wallet/spend.h b/src/wallet/spend.h
index fdb5113ba4..dea5e7c65f 100644
--- a/src/wallet/spend.h
+++ b/src/wallet/spend.h
@@ -38,6 +38,7 @@ TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* walle
* the CoinsResult struct as if it was a vector
*/
struct CoinsResult {
+ std::map<OutputType, std::vector<COutput>> coins;
/** Vectors for each OutputType */
std::vector<COutput> legacy;
std::vector<COutput> P2SH_segwit;
@@ -54,6 +55,9 @@ struct CoinsResult {
* i.e., methods can work with individual OutputType vectors or on the entire object */
uint64_t size() const;
void clear();
+ void Erase(std::set<COutPoint>& preset_coins);
+ void Shuffle(FastRandomContext& rng_fast);
+ void Add(OutputType type, const COutput& out);
/** Sum of all available coins */
CAmount total_amount{0};