80 lines
2.7 KiB
C#
80 lines
2.7 KiB
C#
using CodexContractsPlugin.ChainMonitor;
|
|
using GethPlugin;
|
|
using System.Numerics;
|
|
using Utils;
|
|
|
|
namespace MarketInsights
|
|
{
|
|
public class ContributionBuilder : IChainStateChangeHandler
|
|
{
|
|
private readonly MarketTimeSegment segment = new MarketTimeSegment();
|
|
|
|
public ContributionBuilder(TimeRange timeRange)
|
|
{
|
|
segment = new MarketTimeSegment
|
|
{
|
|
FromUtc = timeRange.From,
|
|
ToUtc = timeRange.To
|
|
};
|
|
}
|
|
|
|
public void OnNewRequest(RequestEvent requestEvent)
|
|
{
|
|
AddRequestToAverage(segment.Submitted, requestEvent);
|
|
}
|
|
|
|
public void OnRequestCancelled(RequestEvent requestEvent)
|
|
{
|
|
AddRequestToAverage(segment.Expired, requestEvent);
|
|
}
|
|
|
|
public void OnRequestFailed(RequestEvent requestEvent)
|
|
{
|
|
AddRequestToAverage(segment.Failed, requestEvent);
|
|
}
|
|
|
|
public void OnRequestFinished(RequestEvent requestEvent)
|
|
{
|
|
AddRequestToAverage(segment.Finished, requestEvent);
|
|
}
|
|
|
|
public void OnRequestFulfilled(RequestEvent requestEvent)
|
|
{
|
|
AddRequestToAverage(segment.Started, requestEvent);
|
|
}
|
|
|
|
public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
|
|
{
|
|
}
|
|
|
|
public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
|
|
{
|
|
}
|
|
|
|
public MarketTimeSegment GetSegment()
|
|
{
|
|
return segment;
|
|
}
|
|
|
|
private void AddRequestToAverage(ContractAverages average, RequestEvent requestEvent)
|
|
{
|
|
average.Number++;
|
|
average.Price = GetNewAverage(average.Price, average.Number, requestEvent.Request.Request.Ask.Reward);
|
|
average.Size = GetNewAverage(average.Size, average.Number, requestEvent.Request.Request.Ask.SlotSize);
|
|
average.Duration = GetNewAverage(average.Duration, average.Number, requestEvent.Request.Request.Ask.Duration);
|
|
average.Collateral = GetNewAverage(average.Collateral, average.Number, requestEvent.Request.Request.Ask.Collateral);
|
|
average.ProofProbability = GetNewAverage(average.ProofProbability, average.Number, requestEvent.Request.Request.Ask.ProofProbability);
|
|
}
|
|
|
|
private float GetNewAverage(float currentAverage, int newNumberOfValues, BigInteger newValue)
|
|
{
|
|
return GetNewAverage(currentAverage, newNumberOfValues, (float)newValue);
|
|
}
|
|
|
|
private float GetNewAverage(float currentAverage, int newNumberOfValues, float newValue)
|
|
{
|
|
return RollingAverage.GetNewAverage(currentAverage, newNumberOfValues, newValue);
|
|
}
|
|
}
|
|
}
|