Ejemplo n.º 1
0
        /// <summary> Payout winners and move remainder to jackpot. </summary>
        /// <remarks> superreeen, 23.11.2013. </remarks>
        /// <param name="input"> The input. </param>
        /// <param name="payouts"> The payouts. </param>
        private void PayoutWinnersAndMoveRemainderToJackpot(UnspentInput input, Dictionary <string, decimal> payouts)
        {
            var currentPayouts = payouts.Take(50).ToDictionary(p => p.Key, p => p.Value);
            var currentInputs  = new List <UnspentInput>()
            {
                input
            };

            while (currentPayouts.Count > 0)
            {
                var remainder = currentInputs.Sum(i => i.Amount) - currentPayouts.Sum(p => p.Value);
                foreach (var item in currentPayouts.Keys)
                {
                    payouts.Remove(item);
                }

                currentPayouts.Add(TempAddress, remainder);

                ApplyFee(TempAddress, currentInputs, currentPayouts);

                var targets = GetTargets(currentPayouts);

                if (targets.Count > 0 && currentInputs.Count > 0)
                {
                    var rawTrans       = m_Client.CreateRawTransaction(currentInputs, targets);
                    var signedRawTrans = m_Client.SignRawTransaction(rawTrans);
                    var sentRawTrans   = m_Client.SendRawTransaction(signedRawTrans.Hex);
                    m_Log.InfoFormat("Send payout transaction with TxId {0}.", sentRawTrans);
                }
                currentInputs  = m_Client.ListUnspent(0).Where(u => u.Address.Equals(TempAddress)).ToList();
                currentPayouts = payouts.Take(50).ToDictionary(p => p.Key, p => p.Value);
            }

            currentPayouts = new Dictionary <string, decimal>();
            currentPayouts.Add(JackpotAddress, currentInputs.Sum(i => i.Amount));
            ApplyFee(JackpotAddress, currentInputs, currentPayouts);
            var tars = GetTargets(payouts);

            if (tars.Count > 0 && currentInputs.Count > 0)
            {
                var rawTrans       = m_Client.CreateRawTransaction(currentInputs, tars);
                var signedRawTrans = m_Client.SignRawTransaction(rawTrans);
                var sentRawTrans   = m_Client.SendRawTransaction(signedRawTrans.Hex);
                m_Log.InfoFormat("Send jackpot transaction with TxId {0}.", sentRawTrans);
            }
        }
Ejemplo n.º 2
0
        /// <summary> Process the draw. </summary>
        /// <remarks> superreeen, 10.11.2013. </remarks>
        /// <exception cref="ObjectDisposedException"> Thrown when a supplied object has been disposed. </exception>
        public void ProcessDraw()
        {
            if (m_Disposed)
            {
                throw new ObjectDisposedException("Object already disposed.");
            }

            try
            {
                ulong currentBlockHeight = m_Client.GetBlockCount();
                ulong blockHeight        = (currentBlockHeight / BlockSpaceing) * BlockSpaceing;

                List <UnspentInput> rawInputs = m_Client.ListUnspent().ToList().Where(i => currentBlockHeight - i.Confirmations < blockHeight).ToList();
                List <UnspentInput> inputs    = rawInputs.Where(u => u.Address.Equals(PotAddress)).ToList();
                List <UnspentInput> jinputs   = rawInputs.Where(u => u.Address.Equals(JackpotAddress)).ToList();

                var tickets = Ticket.FromInputs(m_Client, BetAddress, inputs);

                if (tickets.Count > 0)
                {
                    m_Log.Info("Starting Processing of a Draw.");

                    int[] drawnNumbers = Ticket.TicketFromHash(m_Client.GetBlock(m_Client.GetBlockHash(blockHeight)).MerkleRoot);
                    m_Log.InfoFormat("Lucky Number for Block {0}: {1}.", blockHeight, String.Join(",", new List <int>(drawnNumbers).ConvertAll(i => i.ToString()).ToArray()));

                    var pot = Jackpot;

                    Dictionary <string, decimal> payouts = GetPayouts(tickets, drawnNumbers, pot);
                    decimal winnings = payouts.Sum(p => p.Value);

                    UnspentInput tempInput = MergeInputs(inputs.Union(jinputs).ToList());
                    PayoutWinnersAndMoveRemainderToJackpot(tempInput, payouts);

                    m_Log.Info("Finished Processing of a Draw.");
                }
            }
            catch (Exception ex)
            {
                m_Log.Error("Error processing Draw, retrying next block.", ex);
            }
        }