CreateTransaction: return strFailReason on failure
This commit is contained in:
parent
8de9bb53af
commit
1f00f4e9c9
4 changed files with 37 additions and 17 deletions
|
@ -181,7 +181,8 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
|
||||||
CWalletTx wtx;
|
CWalletTx wtx;
|
||||||
CReserveKey keyChange(wallet);
|
CReserveKey keyChange(wallet);
|
||||||
int64 nFeeRequired = 0;
|
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)
|
if(!fCreated)
|
||||||
{
|
{
|
||||||
|
@ -189,6 +190,8 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(const QList<SendCoinsRecipie
|
||||||
{
|
{
|
||||||
return SendCoinsReturn(AmountWithFeeExceedsBalance, nFeeRequired);
|
return SendCoinsReturn(AmountWithFeeExceedsBalance, nFeeRequired);
|
||||||
}
|
}
|
||||||
|
emit message(tr("Send Coins"), QString::fromStdString(strFailReason),
|
||||||
|
CClientUIInterface::MSG_ERROR);
|
||||||
return TransactionCreationFailed;
|
return TransactionCreationFailed;
|
||||||
}
|
}
|
||||||
if(!uiInterface.ThreadSafeAskFee(nFeeRequired))
|
if(!uiInterface.ThreadSafeAskFee(nFeeRequired))
|
||||||
|
|
|
@ -694,13 +694,10 @@ Value sendmany(const Array& params, bool fHelp)
|
||||||
// Send
|
// Send
|
||||||
CReserveKey keyChange(pwalletMain);
|
CReserveKey keyChange(pwalletMain);
|
||||||
int64 nFeeRequired = 0;
|
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 (!fCreated)
|
||||||
{
|
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strFailReason);
|
||||||
if (totalAmount + nFeeRequired > pwalletMain->GetBalance())
|
|
||||||
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds");
|
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Transaction creation failed");
|
|
||||||
}
|
|
||||||
if (!pwalletMain->CommitTransaction(wtx, keyChange))
|
if (!pwalletMain->CommitTransaction(wtx, keyChange))
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Transaction commit failed");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Transaction commit failed");
|
||||||
|
|
||||||
|
|
|
@ -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;
|
int64 nValue = 0;
|
||||||
BOOST_FOREACH (const PAIRTYPE(CScript, int64)& s, vecSend)
|
BOOST_FOREACH (const PAIRTYPE(CScript, int64)& s, vecSend)
|
||||||
{
|
{
|
||||||
if (nValue < 0)
|
if (nValue < 0)
|
||||||
|
{
|
||||||
|
strFailReason = _("Transaction amounts must be positive");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
nValue += s.second;
|
nValue += s.second;
|
||||||
}
|
}
|
||||||
if (vecSend.empty() || nValue < 0)
|
if (vecSend.empty() || nValue < 0)
|
||||||
|
{
|
||||||
|
strFailReason = _("Transaction amounts must be positive");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
wtxNew.BindWallet(this);
|
wtxNew.BindWallet(this);
|
||||||
|
|
||||||
|
@ -1165,7 +1172,10 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
|
||||||
{
|
{
|
||||||
CTxOut txout(s.second, s.first);
|
CTxOut txout(s.second, s.first);
|
||||||
if (txout.IsDust())
|
if (txout.IsDust())
|
||||||
|
{
|
||||||
|
strFailReason = _("Transaction amount too small");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
wtxNew.vout.push_back(txout);
|
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;
|
set<pair<const CWalletTx*,unsigned int> > setCoins;
|
||||||
int64 nValueIn = 0;
|
int64 nValueIn = 0;
|
||||||
if (!SelectCoins(nTotalValue, setCoins, nValueIn))
|
if (!SelectCoins(nTotalValue, setCoins, nValueIn))
|
||||||
|
{
|
||||||
|
strFailReason = _("Insufficient funds");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins)
|
BOOST_FOREACH(PAIRTYPE(const CWalletTx*, unsigned int) pcoin, setCoins)
|
||||||
{
|
{
|
||||||
int64 nCredit = pcoin.first->vout[pcoin.second].nValue;
|
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;
|
int nIn = 0;
|
||||||
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
|
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
|
||||||
if (!SignSignature(*this, *coin.first, wtxNew, nIn++))
|
if (!SignSignature(*this, *coin.first, wtxNew, nIn++))
|
||||||
|
{
|
||||||
|
strFailReason = _("Signing transaction failed");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Limit size
|
// Limit size
|
||||||
unsigned int nBytes = ::GetSerializeSize(*(CTransaction*)&wtxNew, SER_NETWORK, PROTOCOL_VERSION);
|
unsigned int nBytes = ::GetSerializeSize(*(CTransaction*)&wtxNew, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
if (nBytes >= MAX_STANDARD_TX_SIZE)
|
if (nBytes >= MAX_STANDARD_TX_SIZE)
|
||||||
|
{
|
||||||
|
strFailReason = _("Transaction too large");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
dPriority /= nBytes;
|
dPriority /= nBytes;
|
||||||
|
|
||||||
// Check that enough fee is included
|
// Check that enough fee is included
|
||||||
|
@ -1269,11 +1288,12 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
|
||||||
return true;
|
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;
|
vector< pair<CScript, int64> > vecSend;
|
||||||
vecSend.push_back(make_pair(scriptPubKey, nValue));
|
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
|
// 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());
|
printf("SendMoney() : %s", strError.c_str());
|
||||||
return strError;
|
return strError;
|
||||||
}
|
}
|
||||||
if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired))
|
|
||||||
{
|
|
||||||
string strError;
|
string strError;
|
||||||
|
if (!CreateTransaction(scriptPubKey, nValue, wtxNew, reservekey, nFeeRequired, strError))
|
||||||
|
{
|
||||||
if (nValue + nFeeRequired > GetBalance())
|
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());
|
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
|
printf("SendMoney() : %s\n", strError.c_str());
|
||||||
strError = _("Error: Transaction creation failed!");
|
|
||||||
printf("SendMoney() : %s", strError.c_str());
|
|
||||||
return strError;
|
return strError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -178,8 +178,10 @@ public:
|
||||||
int64 GetBalance() const;
|
int64 GetBalance() const;
|
||||||
int64 GetUnconfirmedBalance() const;
|
int64 GetUnconfirmedBalance() const;
|
||||||
int64 GetImmatureBalance() const;
|
int64 GetImmatureBalance() const;
|
||||||
bool CreateTransaction(const std::vector<std::pair<CScript, int64> >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet);
|
bool CreateTransaction(const std::vector<std::pair<CScript, int64> >& vecSend,
|
||||||
bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet);
|
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);
|
bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey);
|
||||||
std::string SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false);
|
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);
|
std::string SendMoneyToDestination(const CTxDestination &address, int64 nValue, CWalletTx& wtxNew, bool fAskFee=false);
|
||||||
|
|
Loading…
Reference in a new issue