/// <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); } }
/// <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); } }