Skip to content

Commit bd7cecb

Browse files
committed
[Staking] Fix Stake Split Threshold for PIV staking
This reintroduces the calculation on wither or not the wallet should "split" the PIV stake input. Note: zPIV staking never splits, and it shouldn't.
1 parent 5454f3c commit bd7cecb

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

src/stakeinput.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ bool CZPivStake::CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut)
121121
return true;
122122
}
123123

124-
bool CZPivStake::CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout)
124+
bool CZPivStake::CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal)
125125
{
126126
LogPrintf("%s\n", __func__);
127127

@@ -193,7 +193,7 @@ CAmount CPivStake::GetValue()
193193
return txFrom.vout[nPosition].nValue;
194194
}
195195

196-
bool CPivStake::CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout)
196+
bool CPivStake::CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal)
197197
{
198198
vector<valtype> vSolutions;
199199
txnouttype whichType;
@@ -219,6 +219,11 @@ bool CPivStake::CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout)
219219
scriptPubKey = scriptPubKeyKernel;
220220

221221
vout.emplace_back(CTxOut(0, scriptPubKey));
222+
223+
// Calculate if we need to split the output
224+
if (nTotal / 2 > (CAmount)(pwallet->nStakeSplitThreshold * COIN))
225+
vout.emplace_back(CTxOut(0, scriptPubKey));
226+
222227
return true;
223228
}
224229

src/stakeinput.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class CStakeInput
2020
virtual bool CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut = 0) = 0;
2121
virtual bool GetTxFrom(CTransaction& tx) = 0;
2222
virtual CAmount GetValue() = 0;
23-
virtual bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout) = 0;
23+
virtual bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal) = 0;
2424
virtual bool GetModifier(uint64_t& nStakeModifier) = 0;
2525
virtual bool IsZPIV() = 0;
2626
virtual CDataStream GetUniqueness() = 0;
@@ -55,7 +55,7 @@ class CZPivStake : public CStakeInput
5555
bool GetModifier(uint64_t& nStakeModifier) override;
5656
CDataStream GetUniqueness() override;
5757
bool CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut = 0) override;
58-
bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout) override;
58+
bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal) override;
5959
bool MarkSpent(CWallet* pwallet, const uint256& txid);
6060
bool IsZPIV() override { return true; }
6161
int GetChecksumHeightFromMint();
@@ -82,7 +82,7 @@ class CPivStake : public CStakeInput
8282
bool GetModifier(uint64_t& nStakeModifier) override;
8383
CDataStream GetUniqueness() override;
8484
bool CreateTxIn(CWallet* pwallet, CTxIn& txIn, uint256 hashTxOut = 0) override;
85-
bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout) override;
85+
bool CreateTxOuts(CWallet* pwallet, vector<CTxOut>& vout, CAmount nTotal) override;
8686
bool IsZPIV() override { return false; }
8787
};
8888

src/wallet.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2936,18 +2936,20 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int
29362936
// Found a kernel
29372937
LogPrintf("CreateCoinStake : kernel found\n");
29382938
nCredit += stakeInput->GetValue();
2939-
vector<CTxOut> vout;
2940-
if (!stakeInput->CreateTxOuts(this, vout)) {
2941-
LogPrintf("%s : failed to get scriptPubKey\n", __func__);
2942-
continue;
2943-
}
2944-
txNew.vout.insert(txNew.vout.end(), vout.begin(), vout.end());
29452939

29462940
// Calculate reward
29472941
CAmount nReward;
29482942
nReward = GetBlockValue(chainActive.Height() + 1);
29492943
nCredit += nReward;
29502944

2945+
// Create the output transaction(s)
2946+
vector<CTxOut> vout;
2947+
if (!stakeInput->CreateTxOuts(this, vout, nCredit)) {
2948+
LogPrintf("%s : failed to get scriptPubKey\n", __func__);
2949+
continue;
2950+
}
2951+
txNew.vout.insert(txNew.vout.end(), vout.begin(), vout.end());
2952+
29512953
CAmount nMinFee = 0;
29522954
if (!stakeInput->IsZPIV()) {
29532955
// Set output amount

0 commit comments

Comments
 (0)