diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2013-04-24 18:27:00 -0400 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2013-05-03 10:52:09 -0400 |
commit | 8de9bb53af32f7f6b09c06f831f2c0a7b4e95303 (patch) | |
tree | afb7c68d3fd15203308f38a47a3cc3875d476a2f /src/wallet.cpp | |
parent | b8e1dc2e53b9d19df26a87686dfd435b3b346f9c (diff) |
Define dust transaction outputs, and make them non-standard
Diffstat (limited to 'src/wallet.cpp')
-rw-r--r-- | src/wallet.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/wallet.cpp b/src/wallet.cpp index c7eb4f74e8..1554b15768 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1162,7 +1162,12 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW double dPriority = 0; // vouts to the payees BOOST_FOREACH (const PAIRTYPE(CScript, int64)& s, vecSend) - wtxNew.vout.push_back(CTxOut(s.second, s.first)); + { + CTxOut txout(s.second, s.first); + if (txout.IsDust()) + return false; + wtxNew.vout.push_back(txout); + } // Choose coins to use set<pair<const CWalletTx*,unsigned int> > setCoins; @@ -1208,9 +1213,21 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW CScript scriptChange; scriptChange.SetDestination(vchPubKey.GetID()); - // Insert change txn at random position: - vector<CTxOut>::iterator position = wtxNew.vout.begin()+GetRandInt(wtxNew.vout.size()+1); - wtxNew.vout.insert(position, CTxOut(nChange, scriptChange)); + CTxOut newTxOut(nChange, scriptChange); + + // Never create dust outputs; if we would, just + // add the dust to the fee. + if (newTxOut.IsDust()) + { + nFeeRet += nChange; + reservekey.ReturnKey(); + } + else + { + // Insert change txn at random position: + vector<CTxOut>::iterator position = wtxNew.vout.begin()+GetRandInt(wtxNew.vout.size()+1); + wtxNew.vout.insert(position, newTxOut); + } } else reservekey.ReturnKey(); |