aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2013-04-25 17:31:22 -0400
committerGavin Andresen <gavinandresen@gmail.com>2013-05-03 10:54:31 -0400
commit1f00f4e9c9b4b643da22bb5d9f94d66683fa1a15 (patch)
tree4ab3e19ea52f1f9267d75577c875cfbf2a41bc8c /src
parent8de9bb53af32f7f6b09c06f831f2c0a7b4e95303 (diff)
downloadbitcoin-1f00f4e9c9b4b643da22bb5d9f94d66683fa1a15.tar.xz
CreateTransaction: return strFailReason on failure
Diffstat (limited to 'src')
-rw-r--r--src/qt/walletmodel.cpp5
-rw-r--r--src/rpcwallet.cpp9
-rw-r--r--src/wallet.cpp34
-rw-r--r--src/wallet.h6
4 files changed, 37 insertions, 17 deletions
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 20535a451d..fb3ffc5c91 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -181,7 +181,8 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
CWalletTx wtx;
CReserveKey keyChange(wallet);
int64 nFeeRequired = 0;
- bool fCreated = wallet->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired);
+ std::string strFailReason;
+ bool fCreated = wallet->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired, strFailReason);
if(!fCreated)
{
@@ -189,6 +190,8 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
{
return SendCoinsReturn(AmountWithFeeExceedsBalance, nFeeRequired);
}
+ emit message(tr("Send Coins"), QString::fromStdString(strFailReason),
+ CClientUIInterface::MSG_ERROR);
return TransactionCreationFailed;
}
if(!uiInterface.ThreadSafeAskFee(nFeeRequired))
diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp
index 9a899f9238..5fd400c6bb 100644
--- a/src/rpcwallet.cpp
+++ b/src/rpcwallet.cpp
@@ -694,13 +694,10 @@ Value sendmany(const Array& params, bool fHelp)
// Send
CReserveKey keyChange(pwalletMain);
int64 nFeeRequired = 0;
- bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired);
+ string strFailReason;
+ bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired, strFailReason);
if (!fCreated)
- {
- if (totalAmount + nFeeRequired > pwalletMain->GetBalance())
- throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds");
- throw JSONRPCError(RPC_WALLET_ERROR, "Transaction creation failed");
- }
+ throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strFailReason);
if (!pwalletMain->CommitTransaction(wtx, keyChange))
throw JSONRPCError(RPC_WALLET_ERROR, "Transaction commit failed");
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 1554b15768..65d2c3b68e 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -1134,17 +1134,24 @@ bool CWallet::SelectCoins(int64 nTargetValue, set<pair<const CWalletTx*,unsigned
-bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet)
+bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend,
+ CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet, std::string& strFailReason)
{
int64 nValue = 0;
BOOST_FOREACH (const PAIRTYPE(CScript, int64)& s, vecSend)
{
if (nValue < 0)
+ {
+ strFailReason = _("Transaction amounts must be positive");
return false;
+ }
nValue += s.second;
}
if (vecSend.empty() || nValue < 0)
+ {
+ strFailReason = _("Transaction amounts must be positive");
return false;
+ }
wtxNew.BindWallet(this);
@@ -1165,7 +1172,10 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
{
CTxOut txout(s.second, s.first);
if (txout.IsDust())
+ {
+ strFailReason = _("Transaction amount too small");
return false;
+ }
wtxNew.vout.push_back(txout);
}
@@ -1173,7 +1183,10 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
set<pair<const CWalletTx*,unsigned int> > setCoins;
int64 nValueIn = 0;
if (!SelectCoins(nTotalValue, setCoins, nValueIn))
+ {
+ strFailReason = _("Insufficient funds");
return false;
+ }
BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins)
{
int64 nCredit = pcoin.first->vout[pcoin.second].nValue;
@@ -1240,12 +1253,18 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
int nIn = 0;
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
if (!SignSignature(*this, *coin.first, wtxNew, nIn++))
+ {
+ strFailReason = _("Signing transaction failed");
return false;
+ }
// Limit size
unsigned int nBytes = ::GetSerializeSize(*(CTransaction*)&wtxNew, SER_NETWORK, PROTOCOL_VERSION);
if (nBytes >= MAX_STANDARD_TX_SIZE)
+ {
+ strFailReason = _("Transaction too large");
return false;
+ }
dPriority /= nBytes;
// Check that enough fee is included
@@ -1269,11 +1288,12 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
return true;
}
-bool CWallet::CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet)
+bool CWallet::CreateTransaction(CScript scriptPubKey, int64 nValue,
+ CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet, std::string& strFailReason)
{
vector< pair<CScript, int64> > vecSend;
vecSend.push_back(make_pair(scriptPubKey, nValue));
- return CreateTransaction(vecSend, wtxNew, reservekey, nFeeRet);
+ return CreateTransaction(vecSend, wtxNew, reservekey, nFeeRet, strFailReason);
}
// Call after CreateTransaction unless you want to abort
@@ -1339,14 +1359,12 @@ string CWallet::SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew,
printf("SendMoney() : %s", strError.c_str());
return strError;
}
- if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired))
+ string strError;
+ if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired, strError))
{
- string strError;
if (nValue + nFeeRequired > GetBalance())
strError = strprintf(_("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!"), FormatMoney(nFeeRequired).c_str());
- else
- strError = _("Error: Transaction creation failed!");
- printf("SendMoney() : %s", strError.c_str());
+ printf("SendMoney() : %s\n", strError.c_str());
return strError;
}
diff --git a/src/wallet.h b/src/wallet.h
index 2e007557b0..d4ce021054 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -178,8 +178,10 @@ public:
int64 GetBalance() const;
int64 GetUnconfirmedBalance() const;
int64 GetImmatureBalance() const;
- bool CreateTransaction(const std::vector<std::pair<CScript, int64> >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet);
- bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet);
+ bool CreateTransaction(const std::vector<std::pair<CScript, int64> >& vecSend,
+ CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet, std::string& strFailReason);
+ bool CreateTransaction(CScript scriptPubKey, int64 nValue,
+ CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet, std::string& strFailReason);
bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey);
std::string SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false);
std::string SendMoneyToDestination(const CTxDestination &address, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false);