if (nBalance <= nBalanceReserve)
return false;
set<pair<const CWalletTx*,unsigned int> > setCoins;
+ vector<const CWalletTx*> vwtxPrev;
int64 nValueIn = 0;
if (!SelectCoins(nBalance - nBalanceReserve, txNew.nTime, setCoins, nValueIn))
return false;
CBigNum bnCoinDay = CBigNum(nValueIn) * (txNew.nTime-pcoin.first->nTime) / COIN / (24 * 60 * 60);
// Calculate hash
CDataStream ss(SER_GETHASH, VERSION);
- ss << nBits << block.nTime << pcoin.first->nTime << txNew.nTime;
+ ss << nBits << block.nTime << (txindex.pos.nTxPos - txindex.pos.nBlockPos) << pcoin.first->nTime << pcoin.second << txNew.nTime;
if (CBigNum(Hash(ss.begin(), ss.end())) <= bnCoinDay * bnTargetPerCoinDay)
{
txNew.vin.push_back(CTxIn(pcoin.first->GetHash(), pcoin.second));
nCredit += pcoin.first->vout[pcoin.second].nValue;
// Only spend one tx for now
+ vwtxPrev.push_back(pcoin.first);
break;
}
}
- if (nCredit > nBalance - nBalanceReserve)
+ if (nCredit == 0 || nCredit > nBalance - nBalanceReserve)
return false;
// Calculate coin age reward
{
uint64 nCoinAge;
CTxDB txdb("r");
if (!txNew.GetCoinAge(txdb, nCoinAge))
- return false;
+ return error("CreateCoinStake : failed to calculate coin age");
nCredit += GetProofOfStakeReward(nCoinAge);
}
// Fill vout
// Sign
int nIn = 0;
- BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
+ BOOST_FOREACH(const CWalletTx* pcoin, vwtxPrev)
{
- if (!SignSignature(*this, *coin.first, txNew, nIn++))
- return false;
- // Only spend one tx for now
- break;
+ if (!SignSignature(*this, *pcoin, txNew, nIn++))
+ return error("CreateCoinStake : failed to sign coinstake");
}
}
return true;