|
|
@ -65,8 +65,8 @@ const uint256 CMerkleTx::ABANDON_HASH(uint256S("00000000000000000000000000000000 |
|
|
|
|
|
|
|
|
|
|
|
struct CompareValueOnly |
|
|
|
struct CompareValueOnly |
|
|
|
{ |
|
|
|
{ |
|
|
|
bool operator()(const std::pair<CAmount, std::pair<const CWalletTx*, unsigned int> >& t1, |
|
|
|
bool operator()(const std::pair<CAmount, CInputCoin>& t1, |
|
|
|
const std::pair<CAmount, std::pair<const CWalletTx*, unsigned int> >& t2) const |
|
|
|
const std::pair<CAmount, CInputCoin>& t2) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
return t1.first < t2.first; |
|
|
|
return t1.first < t2.first; |
|
|
|
} |
|
|
|
} |
|
|
@ -2032,7 +2032,7 @@ void CWallet::AvailableCoins(std::vector<COutput>& vCoins, bool fOnlySafe, const |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void ApproximateBestSubset(const std::vector<std::pair<CAmount, std::pair<const CWalletTx*,unsigned int> > >& vValue, const CAmount& nTotalLower, const CAmount& nTargetValue, |
|
|
|
static void ApproximateBestSubset(const std::vector<std::pair<CAmount, CInputCoin> >& vValue, const CAmount& nTotalLower, const CAmount& nTargetValue, |
|
|
|
std::vector<char>& vfBest, CAmount& nBest, int iterations = 1000) |
|
|
|
std::vector<char>& vfBest, CAmount& nBest, int iterations = 1000) |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<char> vfIncluded; |
|
|
|
std::vector<char> vfIncluded; |
|
|
@ -2079,16 +2079,16 @@ static void ApproximateBestSubset(const std::vector<std::pair<CAmount, std::pair |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const int nConfMine, const int nConfTheirs, const uint64_t nMaxAncestors, std::vector<COutput> vCoins, |
|
|
|
bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const int nConfMine, const int nConfTheirs, const uint64_t nMaxAncestors, std::vector<COutput> vCoins, |
|
|
|
std::set<std::pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet) const |
|
|
|
std::set<CInputCoin>& setCoinsRet, CAmount& nValueRet) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
setCoinsRet.clear(); |
|
|
|
setCoinsRet.clear(); |
|
|
|
nValueRet = 0; |
|
|
|
nValueRet = 0; |
|
|
|
|
|
|
|
|
|
|
|
// List of values less than target
|
|
|
|
// List of values less than target
|
|
|
|
std::pair<CAmount, std::pair<const CWalletTx*,unsigned int> > coinLowestLarger; |
|
|
|
std::pair<CAmount, CInputCoin> coinLowestLarger; |
|
|
|
coinLowestLarger.first = std::numeric_limits<CAmount>::max(); |
|
|
|
coinLowestLarger.first = std::numeric_limits<CAmount>::max(); |
|
|
|
coinLowestLarger.second.first = NULL; |
|
|
|
coinLowestLarger.second.first = NULL; |
|
|
|
std::vector<std::pair<CAmount, std::pair<const CWalletTx*,unsigned int> > > vValue; |
|
|
|
std::vector<std::pair<CAmount, CInputCoin> > vValue; |
|
|
|
CAmount nTotalLower = 0; |
|
|
|
CAmount nTotalLower = 0; |
|
|
|
|
|
|
|
|
|
|
|
random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt); |
|
|
|
random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt); |
|
|
@ -2109,7 +2109,7 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const int nConfMin |
|
|
|
int i = output.i; |
|
|
|
int i = output.i; |
|
|
|
CAmount n = pcoin->tx->vout[i].nValue; |
|
|
|
CAmount n = pcoin->tx->vout[i].nValue; |
|
|
|
|
|
|
|
|
|
|
|
std::pair<CAmount,std::pair<const CWalletTx*,unsigned int> > coin = std::make_pair(n,std::make_pair(pcoin, i)); |
|
|
|
std::pair<CAmount,CInputCoin> coin = std::make_pair(n,std::make_pair(pcoin, i)); |
|
|
|
|
|
|
|
|
|
|
|
if (n == nTargetValue) |
|
|
|
if (n == nTargetValue) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -2187,7 +2187,7 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const int nConfMin |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool CWallet::SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAmount& nTargetValue, std::set<std::pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet, const CCoinControl* coinControl) const |
|
|
|
bool CWallet::SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAmount& nTargetValue, std::set<CInputCoin>& setCoinsRet, CAmount& nValueRet, const CCoinControl* coinControl) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<COutput> vCoins(vAvailableCoins); |
|
|
|
std::vector<COutput> vCoins(vAvailableCoins); |
|
|
|
|
|
|
|
|
|
|
@ -2205,7 +2205,7 @@ bool CWallet::SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAm |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// calculate value from preset inputs and store them
|
|
|
|
// calculate value from preset inputs and store them
|
|
|
|
std::set<std::pair<const CWalletTx*, uint32_t> > setPresetCoins; |
|
|
|
std::set<CInputCoin> setPresetCoins; |
|
|
|
CAmount nValueFromPresetInputs = 0; |
|
|
|
CAmount nValueFromPresetInputs = 0; |
|
|
|
|
|
|
|
|
|
|
|
std::vector<COutPoint> vPresetInputs; |
|
|
|
std::vector<COutPoint> vPresetInputs; |
|
|
@ -2395,7 +2395,7 @@ bool CWallet::CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletT |
|
|
|
assert(txNew.nLockTime < LOCKTIME_THRESHOLD); |
|
|
|
assert(txNew.nLockTime < LOCKTIME_THRESHOLD); |
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
std::set<std::pair<const CWalletTx*,unsigned int> > setCoins; |
|
|
|
std::set<CInputCoin> setCoins; |
|
|
|
LOCK2(cs_main, cs_wallet); |
|
|
|
LOCK2(cs_main, cs_wallet); |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::vector<COutput> vAvailableCoins; |
|
|
|
std::vector<COutput> vAvailableCoins; |
|
|
|