wallet:AvailableCoins filter by destination/s feature implemented + connected to sendmany async operation.

This commit is contained in:
furszy 2020-10-31 23:01:52 -03:00
parent 4007e24ed0
commit 359a05d6ae
No known key found for this signature in database
GPG Key ID: 5DD23CCC686AA623
3 changed files with 19 additions and 16 deletions

View File

@ -900,21 +900,9 @@ bool AsyncRPCOperation_sendmany::find_utxos(bool fAcceptCoinbase=false) {
LOCK2(cs_main, pwalletMain->cs_wallet);
pwalletMain->AvailableCoins(vecOutputs, false, NULL, true, fAcceptCoinbase, true, mindepth_);
pwalletMain->AvailableCoins(vecOutputs, false, NULL, true, fAcceptCoinbase, true, mindepth_, &destinations);
for (const COutput& out : vecOutputs) {
if (destinations.size()) {
CTxDestination address;
if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) {
continue;
}
if (!destinations.count(address)) {
continue;
}
}
CScript scriptPubKey = out.tx->vout[out.i].scriptPubKey;
CAmount nValue = out.tx->vout[out.i].nValue;
SendManyInputUTXO utxo(out.tx->GetHash(), out.i, scriptPubKey, nValue, isCoinbase);

View File

@ -3209,7 +3209,14 @@ CAmount CWallet::GetImmatureWatchOnlyBalance() const
return nTotal;
}
void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const CCoinControl *coinControl, bool fIncludeZeroValue, bool fIncludeCoinBase, bool fOnlySpendable, int nMinDepth) const
void CWallet::AvailableCoins(vector<COutput>& vCoins,
bool fOnlyConfirmed,
const CCoinControl *coinControl,
bool fIncludeZeroValue,
bool fIncludeCoinBase,
bool fOnlySpendable,
int nMinDepth,
std::set<CTxDestination>* onlyFilterByDests) const
{
assert(nMinDepth >= 0);
vCoins.clear();
@ -3247,7 +3254,14 @@ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const
if (fOnlySpendable && !isSpendable)
continue;
isminetype mine = IsMine(pcoin->vout[i]);
// Filter by specific destinations if needed
if (onlyFilterByDests && !onlyFilterByDests->empty()) {
CTxDestination address;
if (!ExtractDestination(output.scriptPubKey, address) || onlyFilterByDests->count(address) == 0) {
continue;
}
}
if (!(IsSpent(wtxid, i)) && mine != ISMINE_NO &&
!IsLockedCoin((*it).first, i) && (pcoin->vout[i].nValue > 0 || fIncludeZeroValue) &&
(!coinControl || !coinControl->HasSelected() || coinControl->fAllowOtherInputs || coinControl->IsSelected((*it).first, i)))

View File

@ -1016,7 +1016,8 @@ public:
bool fIncludeZeroValue=false,
bool fIncludeCoinBase=true,
bool fOnlySpendable=false,
int nMinDepth = 0) const;
int nMinDepth = 0,
std::set<CTxDestination>* onlyFilterByDests = nullptr) const;
/**
* Shuffle and select coins until nTargetValue is reached while avoiding