#include "wallet.h"
#include "base58.h"
-#include "main.h"
using namespace std;
vector<KernelRecord> KernelRecord::decomposeOutput(const CWallet *wallet, const CWalletTx &wtx)
{
vector<KernelRecord> parts;
- int64 nTime = wtx.GetTxTime();
+ int64_t nTime = wtx.GetTxTime();
uint256 hash = wtx.GetHash();
std::map<std::string, std::string> mapValue = wtx.mapValue;
- int64 nDayWeight = (min((GetAdjustedTime() - nTime), (int64)(nStakeMaxAge+nStakeMinAge)) - nStakeMinAge); // DayWeight * 86400, ÷òîáû áûë
- // ïðàâèëüíûé ðàñ÷¸ò CoinAge
+ int64_t nDayWeight = (min((GetAdjustedTime() - nTime), (int64_t)(nStakeMaxAge+nStakeMinAge)) - nStakeMinAge); // DayWeight * 86400, чтобы был
+ // правильный расчёт CoinAge
if (showTransaction(wtx))
{
- for (int nOut = 0; nOut < wtx.vout.size(); nOut++)
+ for (unsigned int nOut = 0; nOut < wtx.vout.size(); nOut++)
{
CTxOut txOut = wtx.vout[nOut];
if( wallet->IsMine(txOut) ) {
CTxDestination address;
std::string addrStr;
- uint64 coinAge = max( (txOut.nValue * nDayWeight) / (COIN * 86400), (int64)0);
+ uint64_t coinAge = max( (txOut.nValue * nDayWeight) / (COIN * nOneDay), (int64_t)0);
if (ExtractDestination(txOut.scriptPubKey, address))
{
return hash.ToString() + strprintf("-%03d", idx);
}
-int64 KernelRecord::getAge() const
+int64_t KernelRecord::getAge() const
{
- return (GetAdjustedTime() - nTime) / 86400;
+ return (GetAdjustedTime() - nTime) / nOneDay;
+}
+
+uint64_t KernelRecord::getCoinDay() const
+{
+ int64_t nWeight = GetAdjustedTime() - nTime - nStakeMinAge;
+ if( nWeight < 0)
+ return 0;
+ nWeight = min(nWeight, (int64_t)nStakeMaxAge);
+ uint64_t coinAge = (nValue * nWeight ) / (COIN * nOneDay);
+ return coinAge;
+}
+
+int64_t KernelRecord::getPoSReward(int nBits, int minutes)
+{
+ int64_t PoSReward;
+ int64_t nWeight = GetAdjustedTime() - nTime + minutes * 60;
+ if( nWeight < nStakeMinAge)
+ return 0;
+ uint64_t coinAge = (nValue * nWeight ) / (COIN * nOneDay);
+ PoSReward = GetProofOfStakeReward(coinAge, nBits, GetAdjustedTime() + minutes * 60);
+ return PoSReward;
}
double KernelRecord::getProbToMintStake(double difficulty, int timeOffset) const
{
- double maxTarget = pow(static_cast<double>(2), 224);
- double target = maxTarget / difficulty;
- int dayWeight = (min((GetAdjustedTime() - nTime) + timeOffset, (int64)(nStakeMinAge+nStakeMaxAge)) - nStakeMinAge) / 86400;
- uint64 coinAge = max(nValue * dayWeight / COIN, (int64)0);
- return target * coinAge / pow(static_cast<double>(2), 256);
+ //double maxTarget = pow(static_cast<double>(2), 224);
+ //double target = maxTarget / difficulty;
+ //int dayWeight = (min((GetAdjustedTime() - nTime) + timeOffset, (int64_t)(nStakeMinAge+nStakeMaxAge)) - nStakeMinAge) / 86400;
+ //uint64_t coinAge = max(nValue * dayWeight / COIN, (int64_t)0);
+ //return target * coinAge / pow(static_cast<double>(2), 256);
+ int64_t Weight = (min((GetAdjustedTime() - nTime) + timeOffset, (int64_t)(nStakeMinAge+nStakeMaxAge)) - nStakeMinAge);
+ uint64_t coinAge = max(nValue * Weight / (COIN * nOneDay), (int64_t)0);
+ return coinAge / (pow(static_cast<double>(2),32) * difficulty);
}
double KernelRecord::getProbToMintWithinNMinutes(double difficulty, int minutes)
// Probabilities for the first d days
for(i = 0; i < d; i++)
{
- timeOffset = i * 86400;
- p = pow(1 - getProbToMintStake(difficulty, timeOffset), 86400);
+ timeOffset = i * nOneDay;
+ p = pow(1 - getProbToMintStake(difficulty, timeOffset), nOneDay);
prob *= p;
}
// Probability for the m minutes of the last day
- timeOffset = d * 86400;
+ timeOffset = d * nOneDay;
p = pow(1 - getProbToMintStake(difficulty, timeOffset), 60 * m);
prob *= p;