diff options
| author | Karl-Johan Alm <[email protected]> | 2018-07-19 11:43:03 +0900 |
|---|---|---|
| committer | Karl-Johan Alm <[email protected]> | 2018-07-24 15:05:37 +0900 |
| commit | 87ebce25d66952f5ce565bb5130dcf5e24049872 (patch) | |
| tree | 5f14a8fcaacc353277f7624f9d33674f532e04ce /src/wallet/wallet.cpp | |
| parent | Add -avoidpartialspends and m_avoid_partial_spends (diff) | |
| download | discoin-87ebce25d66952f5ce565bb5130dcf5e24049872.tar.xz discoin-87ebce25d66952f5ce565bb5130dcf5e24049872.zip | |
wallet: Add output grouping
Diffstat (limited to 'src/wallet/wallet.cpp')
| -rw-r--r-- | src/wallet/wallet.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index aeed43011..03c829357 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4438,3 +4438,29 @@ void CWallet::LearnAllRelatedScripts(const CPubKey& key) LearnRelatedScripts(key, OutputType::P2SH_SEGWIT); } +std::vector<OutputGroup> CWallet::GroupOutputs(const std::vector<COutput>& outputs, bool single_coin) const { + std::vector<OutputGroup> groups; + std::map<CTxDestination, OutputGroup> gmap; + CTxDestination dst; + for (const auto& output : outputs) { + if (output.fSpendable) { + CInputCoin input_coin = output.GetInputCoin(); + + size_t ancestors, descendants; + mempool.GetTransactionAncestry(output.tx->GetHash(), ancestors, descendants); + if (!single_coin && ExtractDestination(output.tx->tx->vout[output.i].scriptPubKey, dst)) { + if (gmap.count(dst) == 10) { + groups.push_back(gmap[dst]); + gmap.erase(dst); + } + gmap[dst].Insert(input_coin, output.nDepth, output.tx->IsFromMe(ISMINE_ALL), ancestors, descendants); + } else { + groups.emplace_back(input_coin, output.nDepth, output.tx->IsFromMe(ISMINE_ALL), ancestors, descendants); + } + } + } + if (!single_coin) { + for (const auto& it : gmap) groups.push_back(it.second); + } + return groups; +} |