using CodexContractsPlugin; using CodexContractsPlugin.Marketplace; using Newtonsoft.Json; using Utils; namespace TestNetRewarder { public class ChainState { private readonly HistoricState historicState; public ChainState(HistoricState historicState, ICodexContracts contracts, BlockInterval blockRange) { this.historicState = historicState; NewRequests = contracts.GetStorageRequests(blockRange); historicState.CleanUpOldRequests(); historicState.ProcessNewRequests(NewRequests); historicState.UpdateStorageRequests(contracts); StartedRequests = historicState.StorageRequests.Where(r => r.RecentlyStarted).ToArray(); FinishedRequests = historicState.StorageRequests.Where(r => r.RecentlyFinished).ToArray(); RequestFulfilledEvents = contracts.GetRequestFulfilledEvents(blockRange); RequestCancelledEvents = contracts.GetRequestCancelledEvents(blockRange); SlotFilledEvents = contracts.GetSlotFilledEvents(blockRange); SlotFreedEvents = contracts.GetSlotFreedEvents(blockRange); } public Request[] NewRequests { get; } public StorageRequest[] AllRequests => historicState.StorageRequests; public StorageRequest[] StartedRequests { get; private set; } public StorageRequest[] FinishedRequests { get; private set; } public RequestFulfilledEventDTO[] RequestFulfilledEvents { get; } public RequestCancelledEventDTO[] RequestCancelledEvents { get; } public SlotFilledEventDTO[] SlotFilledEvents { get; } public SlotFreedEventDTO[] SlotFreedEvents { get; } public string[] GenerateOverview() { var entries = new List(); entries.AddRange(NewRequests.Select(ToPair)); entries.AddRange(RequestFulfilledEvents.Select(ToPair)); entries.AddRange(RequestCancelledEvents.Select(ToPair)); entries.AddRange(SlotFilledEvents.Select(ToPair)); entries.AddRange(SlotFreedEvents.Select(ToPair)); entries.Sort(new StringUtcComparer()); return entries.Select(ToLine).ToArray(); } private StringBlockNumberPair ToPair(Request r) { return new StringBlockNumberPair("NewRequest", JsonConvert.SerializeObject(r), r.BlockNumber); } private StringBlockNumberPair ToPair(RequestFulfilledEventDTO r) { return new StringBlockNumberPair("Fulfilled", JsonConvert.SerializeObject(r), r.BlockNumber); } private StringBlockNumberPair ToPair(RequestCancelledEventDTO r) { return new StringBlockNumberPair("Cancelled", JsonConvert.SerializeObject(r), r.BlockNumber); } private StringBlockNumberPair ToPair(SlotFilledEventDTO r) { return new StringBlockNumberPair("SlotFilled", JsonConvert.SerializeObject(r), r.BlockNumber); } private StringBlockNumberPair ToPair(SlotFreedEventDTO r) { return new StringBlockNumberPair("SlotFreed", JsonConvert.SerializeObject(r), r.BlockNumber); } private string ToLine(StringBlockNumberPair pair) { return $"[{pair.Number}]({pair.Name}) {pair.Str}"; } public class StringBlockNumberPair { public StringBlockNumberPair(string name, string str, ulong number) { Name = name; Str = str; Number = number; } public string Name { get; } public string Str { get; } public ulong Number { get; } } public class StringUtcComparer : IComparer { public int Compare(StringBlockNumberPair? x, StringBlockNumberPair? y) { if (x == null && y == null) return 0; if (x == null) return 1; if (y == null) return -1; return x.Number.CompareTo(y.Number); } } } }