public override IFinalElectionResults RehydrateFinalResults(IDataRehydrator rehydrator, Dictionary <int, TransactionId> transactionIndexesTree) { var version = rehydrator.RehydrateRewind <ComponentVersion <ElectionContextType> >(); IFinalElectionResults result = null; if (version.Type == ElectionContextTypes.Instance.Active) { if (version == (1, 0)) { result = new NeuraliumActiveFinalElectionResults(); } } if (version.Type == ElectionContextTypes.Instance.Passive) { if (version == (1, 0)) { result = new NeuraliumPassiveFinalElectionResults(); } } if (result == null) { throw new ApplicationException("Invalid context type"); } result.Rehydrate(rehydrator, transactionIndexesTree); return(result); }
public override void AllocateTransactionTips(IFinalElectionResults result, Dictionary <AccountId, (IByteArray electionHash, List <TransactionId> transactionIds)> electionResults, Dictionary <TransactionId, Amount> transactionTips)
protected override SynthesizedBlock.SynthesizedElectionResult SynthesizeElectionResult(SynthesizedBlock synthesizedBlock, IFinalElectionResults result, IBlock block, AccountCache accountCache, Dictionary <TransactionId, ITransaction> blockConfirmedTransactions) { SynthesizedBlock.SynthesizedElectionResult synthesizedElectionResult = base.SynthesizeElectionResult(synthesizedBlock, result, block, accountCache, blockConfirmedTransactions); if (synthesizedElectionResult is NeuraliumSynthesizedBlock.NeuraliumSynthesizedElectionResult neuraliumSynthesizedElectionResult && result is INeuraliumFinalElectionResults neuraliumFinalElectionResults) { neuraliumSynthesizedElectionResult.InfrastructureServiceFees = neuraliumFinalElectionResults.InfrastructureServiceFees ?? 0; foreach (AccountId delegateAccount in synthesizedElectionResult.DelegateAccounts) { if (neuraliumFinalElectionResults.DelegateAccounts[delegateAccount] is INeuraliumDelegateResults neuraliumDelegateResults) { neuraliumSynthesizedElectionResult.DelegateBounties.Add(delegateAccount, neuraliumDelegateResults.BountyShare.Value); } } foreach (var electedAccount in synthesizedElectionResult.ElectedAccounts) { if (neuraliumFinalElectionResults.ElectedCandidates[electedAccount.Key] is INeuraliumElectedResults neuraliumElectedResults) { decimal tips = 0; // let's sum up the tips we get! foreach (TransactionId transationId in neuraliumElectedResults.Transactions) { if (blockConfirmedTransactions.ContainsKey(transationId)) { if (blockConfirmedTransactions[transationId] is ITipTransaction tipTransaction) { tips += tipTransaction.Tip; } } } neuraliumSynthesizedElectionResult.ElectedGains.Add(electedAccount.Key, (neuraliumElectedResults.BountyShare, tips)); } } } return(synthesizedElectionResult); }
protected override void PrepareFinalElectionContext(long currentBlockId, AccountId miningAccountId, FinalElectionResultDistillate finalResultDistillateEntry, IFinalElectionResults finalElectionResult, IBlock currentBlock) { base.PrepareFinalElectionContext(currentBlockId, miningAccountId, finalResultDistillateEntry, finalElectionResult, currentBlock); if (finalElectionResult is INeuraliumFinalElectionResults neuraliumSimpleFinalElectionResults && finalResultDistillateEntry is NeuraliumFinalElectionResultDistillate neuraliumFinalElectionContext) { if (neuraliumSimpleFinalElectionResults.ElectedCandidates[miningAccountId] is INeuraliumElectedResults neuraliumElectedResults) { neuraliumFinalElectionContext.BountyShare = neuraliumElectedResults.BountyShare; var tippingTransactions = currentBlock.GetAllConfirmedTransactions().Where(t => neuraliumElectedResults.Transactions.Contains(t.Key)).Select(t => t.Value).OfType <ITipTransaction>().Select(t => t.Tip).ToList(); if (tippingTransactions.Any()) { neuraliumFinalElectionContext.TransactionTips = tippingTransactions.Sum(t => t); } } } }