private CoinstakeContext BuildNewCoinstakeContext() { var scriptPubKey = new Script(); var coinStakeContext = new CoinstakeContext() { CoinstakeTx = new Transaction() { Outputs = { new TxOut(Money.Zero, new Script()), new TxOut(Money.Zero, scriptPubKey) } } }; return(coinStakeContext); }
private (long coinstakeInputValue, Transaction transaction) GetCoinstakeTransaction(List <Money> amounts, CoinstakeContext coinStakeContext, bool expectToSplit) { long amountStaked = amounts.Sum(u => u.Satoshi); this.posMinting.ShouldSplitStake( stakedUtxosCount: amounts.Count, amountStaked: amountStaked, coinValue: amounts.Last(), chainHeight: ChainHeight).Should().Be(expectToSplit); var reward = 1.2M * Money.COIN; var coinstakeInputValue = amounts.Last().Satoshi + (long)reward; var transaction = this.posMinting.PrepareCoinStakeTransactions( currentChainHeight: ChainHeight, coinstakeContext: coinStakeContext, coinstakeOutputValue: coinstakeInputValue, utxosCount: amounts.Count, amountStaked: amountStaked); return(coinstakeInputValue, transaction); }
public override Transaction PrepareCoinStakeTransactions(int currentChainHeight, CoinstakeContext coinstakeContext, long coinstakeOutputValue, int utxosCount, long amountStaked, long reward) { long cirrusReward = reward * StraxCoinviewRule.CirrusRewardPercentage / 100; coinstakeOutputValue -= cirrusReward; // Populate the initial coinstake with the modified overall reward amount, the outputs will be split as necessary base.PrepareCoinStakeTransactions(currentChainHeight, coinstakeContext, coinstakeOutputValue, utxosCount, amountStaked, reward); // Now add the remaining reward into an additional output on the coinstake var cirrusRewardOutput = new TxOut(cirrusReward, StraxCoinstakeRule.CirrusRewardScript); coinstakeContext.CoinstakeTx.Outputs.Add(cirrusRewardOutput); return(coinstakeContext.CoinstakeTx); }