public override SynthesizedBlock ConvertApiSynthesizedBlock(SynthesizedBlockAPI synthesizedBlockApi)
        {
            SynthesizedBlock synthesizedBlock = base.ConvertApiSynthesizedBlock(synthesizedBlockApi);

            AccountId accountId = synthesizedBlockApi.AccountId != null ? new AccountId(synthesizedBlockApi.AccountId) : new AccountId(synthesizedBlockApi.AccountHash);

            if (synthesizedBlockApi is NeuraliumSynthesizedBlockApi neuraliumSynthesizedBlockApi && synthesizedBlock is NeuraliumSynthesizedBlock neuraliumSynthesizedBlock)
            {
                foreach (NeuraliumSynthesizedBlockApi.NeuraliumSynthesizedElectionResultAPI electionResult in neuraliumSynthesizedBlockApi.FinalElectionResults)
                {
                    NeuraliumSynthesizedBlock.NeuraliumSynthesizedElectionResult neuraliumSynthesizedElectionResult = new NeuraliumSynthesizedBlock.NeuraliumSynthesizedElectionResult();

                    neuraliumSynthesizedElectionResult.BlockId   = synthesizedBlockApi.BlockId;
                    neuraliumSynthesizedElectionResult.Timestamp = synthesizedBlockApi.Timestamp;

                    AccountId delegateAccountId = null;

                    if (!string.IsNullOrWhiteSpace(electionResult.DelegateAccountId))
                    {
                        delegateAccountId = new AccountId(electionResult.DelegateAccountId);
                    }

                    neuraliumSynthesizedElectionResult.ElectedAccounts.Add(accountId, (accountId, delegateAccountId, (Enums.ElectedPeerShareTypes)electionResult.PeerType, electionResult.SelectedTransactions));
                    neuraliumSynthesizedElectionResult.BlockId = synthesizedBlockApi.BlockId - electionResult.Offset;
                    neuraliumSynthesizedElectionResult.ElectedGains.Add(accountId, (electionResult.BountyShare, electionResult.Tips));

                    neuraliumSynthesizedBlock.FinalElectionResults.Add(neuraliumSynthesizedElectionResult);
                }
            }

            return(synthesizedBlock);
        }
        protected override SynthesizedBlock SynthesizeBlock(IBlock block, AccountCache accountCache, Dictionary <TransactionId, ITransaction> blockConfirmedTransactions)
        {
            SynthesizedBlock synthesizedBlock = base.SynthesizeBlock(block, accountCache, blockConfirmedTransactions);

            if (synthesizedBlock is NeuraliumSynthesizedBlock neuraliumSynthesizedBlock && block is INeuraliumBlock neuraliumBlock)
            {
            }

            return(synthesizedBlock);
        }
        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);
        }