Changeset View
Changeset View
Standalone View
Standalone View
src/qt/walletmodel.cpp
Show First 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
WalletModel::~WalletModel() { | WalletModel::~WalletModel() { | ||||
unsubscribeFromCoreSignals(); | unsubscribeFromCoreSignals(); | ||||
} | } | ||||
CAmount WalletModel::getBalance(const CCoinControl *coinControl) const { | CAmount WalletModel::getBalance(const CCoinControl *coinControl) const { | ||||
if (coinControl) { | if (coinControl) { | ||||
Amount nBalance = 0; | Amount nBalance(0); | ||||
std::vector<COutput> vCoins; | std::vector<COutput> vCoins; | ||||
wallet->AvailableCoins(vCoins, true, coinControl); | wallet->AvailableCoins(vCoins, true, coinControl); | ||||
for (const COutput &out : vCoins) { | for (const COutput &out : vCoins) { | ||||
if (out.fSpendable) nBalance += out.tx->tx->vout[out.i].nValue; | if (out.fSpendable) nBalance += out.tx->tx->vout[out.i].nValue; | ||||
} | } | ||||
return nBalance.GetSatoshis(); | return nBalance.GetSatoshis(); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 132 Lines • ▼ Show 20 Lines | for (const SendCoinsRecipient &rcp : recipients) { | ||||
for (int i = 0; i < details.outputs_size(); i++) { | for (int i = 0; i < details.outputs_size(); i++) { | ||||
const payments::Output &out = details.outputs(i); | const payments::Output &out = details.outputs(i); | ||||
if (out.amount() <= 0) continue; | if (out.amount() <= 0) continue; | ||||
subtotal += out.amount(); | subtotal += out.amount(); | ||||
const uint8_t *scriptStr = (const uint8_t *)out.script().data(); | const uint8_t *scriptStr = (const uint8_t *)out.script().data(); | ||||
CScript scriptPubKey(scriptStr, | CScript scriptPubKey(scriptStr, | ||||
scriptStr + out.script().size()); | scriptStr + out.script().size()); | ||||
CAmount nAmount = out.amount(); | CAmount nAmount = out.amount(); | ||||
CRecipient recipient = {scriptPubKey, nAmount, | CRecipient recipient = {scriptPubKey, Amount(nAmount), | ||||
rcp.fSubtractFeeFromAmount}; | rcp.fSubtractFeeFromAmount}; | ||||
vecSend.push_back(recipient); | vecSend.push_back(recipient); | ||||
} | } | ||||
if (subtotal <= 0) { | if (subtotal <= 0) { | ||||
return InvalidAmount; | return InvalidAmount; | ||||
} | } | ||||
total += subtotal; | total += subtotal; | ||||
} else { // User-entered bitcoin address / amount: | } else { // User-entered bitcoin address / amount: | ||||
if (!validateAddress(rcp.address)) { | if (!validateAddress(rcp.address)) { | ||||
return InvalidAddress; | return InvalidAddress; | ||||
} | } | ||||
if (rcp.amount <= 0) { | if (rcp.amount <= 0) { | ||||
return InvalidAmount; | return InvalidAmount; | ||||
} | } | ||||
setAddress.insert(rcp.address); | setAddress.insert(rcp.address); | ||||
++nAddresses; | ++nAddresses; | ||||
CScript scriptPubKey = GetScriptForDestination( | CScript scriptPubKey = GetScriptForDestination( | ||||
DecodeDestination(rcp.address.toStdString())); | DecodeDestination(rcp.address.toStdString())); | ||||
CRecipient recipient = {scriptPubKey, rcp.amount, | CRecipient recipient = {scriptPubKey, Amount(rcp.amount), | ||||
rcp.fSubtractFeeFromAmount}; | rcp.fSubtractFeeFromAmount}; | ||||
vecSend.push_back(recipient); | vecSend.push_back(recipient); | ||||
total += rcp.amount; | total += rcp.amount; | ||||
} | } | ||||
} | } | ||||
if (setAddress.size() != nAddresses) { | if (setAddress.size() != nAddresses) { | ||||
return DuplicateAddress; | return DuplicateAddress; | ||||
} | } | ||||
CAmount nBalance = getBalance(coinControl); | CAmount nBalance = getBalance(coinControl); | ||||
if (total > nBalance) { | if (total > nBalance) { | ||||
return AmountExceedsBalance; | return AmountExceedsBalance; | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, wallet->cs_wallet); | LOCK2(cs_main, wallet->cs_wallet); | ||||
transaction.newPossibleKeyChange(wallet); | transaction.newPossibleKeyChange(wallet); | ||||
Amount nFeeRequired = 0; | Amount nFeeRequired(0); | ||||
int nChangePosRet = -1; | int nChangePosRet = -1; | ||||
std::string strFailReason; | std::string strFailReason; | ||||
CWalletTx *newTx = transaction.getTransaction(); | CWalletTx *newTx = transaction.getTransaction(); | ||||
CReserveKey *keyChange = transaction.getPossibleKeyChange(); | CReserveKey *keyChange = transaction.getPossibleKeyChange(); | ||||
bool fCreated = wallet->CreateTransaction(vecSend, *newTx, *keyChange, | bool fCreated = wallet->CreateTransaction(vecSend, *newTx, *keyChange, | ||||
nFeeRequired, nChangePosRet, | nFeeRequired, nChangePosRet, | ||||
strFailReason, coinControl); | strFailReason, coinControl); | ||||
▲ Show 20 Lines • Show All 422 Lines • Show Last 20 Lines |