Files
agrarian/src/stakeinput.h
T
2022-02-03 23:45:47 -08:00

98 lines
3.0 KiB
C++

// Copyright (c) 2017-2018 The PIVX developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef Agrarian_STAKEINPUT_H
#define Agrarian_STAKEINPUT_H
#include "chain.h"
#include "streams.h"
#include "uint256.h"
class CKeyStore;
class CWallet;
class CWalletTx;
class CStakeInput
{
protected:
CBlockIndex* pindexFrom;
public:
virtual ~CStakeInput(){};
virtual CBlockIndex* GetIndexFrom() = 0;
virtual bool CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut = 0) = 0;
virtual bool GetTxFrom(CTransaction& tx) = 0;
virtual CAmount GetValue() = 0;
virtual bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal) = 0;
virtual bool GetModifier(uint64_t& nStakeModifier) = 0;
virtual bool IsZAGR() = 0;
virtual CDataStream GetUniqueness() = 0;
virtual uint256 GetSerialHash() const = 0;
};
// zAGRStake can take two forms
// 1) the stake candidate, which is a zcmint that is attempted to be staked
// 2) a staked zagr, which is a zcspend that has successfully staked
class CZPivStake : public CStakeInput
{
private:
uint32_t nChecksum;
bool fMint;
libzerocoin::CoinDenomination denom;
uint256 hashSerial;
public:
explicit CZPivStake(libzerocoin::CoinDenomination denom, const uint256& hashSerial)
{
this->denom = denom;
this->hashSerial = hashSerial;
this->pindexFrom = nullptr;
fMint = true;
}
explicit CZPivStake(const libzerocoin::CoinSpend& spend);
CBlockIndex* GetIndexFrom() override;
bool GetTxFrom(CTransaction& tx) override;
CAmount GetValue() override;
bool GetModifier(uint64_t& nStakeModifier) override;
CDataStream GetUniqueness() override;
bool CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut = 0) override;
bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal) override;
bool MarkSpent(CWallet* pwallet, const uint256& txid);
bool IsZAGR() override { return true; }
uint256 GetSerialHash() const override { return hashSerial; }
int GetChecksumHeightFromMint();
int GetChecksumHeightFromSpend();
uint32_t GetChecksum();
};
class CPivStake : public CStakeInput
{
private:
CTransaction txFrom;
unsigned int nPosition;
public:
CPivStake()
{
this->pindexFrom = nullptr;
}
bool SetInput(CTransaction txPrev, unsigned int n);
CBlockIndex* GetIndexFrom() override;
bool GetTxFrom(CTransaction& tx) override;
CAmount GetValue() override;
bool GetModifier(uint64_t& nStakeModifier) override;
CDataStream GetUniqueness() override;
bool CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut = 0) override;
bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal) override;
bool IsZAGR() override { return false; }
uint256 GetSerialHash() const override { return uint256(0); }
};
#endif //Agrarian_STAKEINPUT_H