aboutsummaryrefslogtreecommitdiff
path: root/src/wallet.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2013-04-24 18:27:00 -0400
committerGavin Andresen <gavinandresen@gmail.com>2013-05-03 10:52:09 -0400
commit8de9bb53af32f7f6b09c06f831f2c0a7b4e95303 (patch)
treeafb7c68d3fd15203308f38a47a3cc3875d476a2f /src/wallet.cpp
parentb8e1dc2e53b9d19df26a87686dfd435b3b346f9c (diff)
downloadbitcoin-8de9bb53af32f7f6b09c06f831f2c0a7b4e95303.tar.xz
Define dust transaction outputs, and make them non-standard
Diffstat (limited to 'src/wallet.cpp')
-rw-r--r--src/wallet.cpp25
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();