Skip to content

Commit 87bda47

Browse files
committed
Set up contract-failed event.
1 parent 44dfa39 commit 87bda47

22 files changed

+327
-55
lines changed

Framework/Utils/RollingAverage.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace Utils
2+
{
3+
public static class RollingAverage
4+
{
5+
/// <param name="currentAverage">Value of average before new value is added.</param>
6+
/// <param name="newNumberOfValues">Number of values in average after new value is added.</param>
7+
/// <param name="newValue">New value to be added.</param>
8+
/// <returns>New average value.</returns>
9+
/// <exception cref="Exception">newNumberOfValues must be 1 or greater.</exception>
10+
public static float GetNewAverage(float currentAverage, int newNumberOfValues, float newValue)
11+
{
12+
if (newNumberOfValues < 1) throw new Exception("Should be at least 1 value.");
13+
14+
float n = newNumberOfValues;
15+
var originalValue = currentAverage;
16+
var originalValueWeight = ((n - 1.0f) / n);
17+
var newValueWeight = (1.0f / n);
18+
return (originalValue * originalValueWeight) + (newValue * newValueWeight);
19+
}
20+
}
21+
}

ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainEvents.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ private ChainEvents(
1010
Request[] requests,
1111
RequestFulfilledEventDTO[] fulfilled,
1212
RequestCancelledEventDTO[] cancelled,
13+
RequestFailedEventDTO[] failed,
1314
SlotFilledEventDTO[] slotFilled,
1415
SlotFreedEventDTO[] slotFreed
1516
)
@@ -18,6 +19,7 @@ SlotFreedEventDTO[] slotFreed
1819
Requests = requests;
1920
Fulfilled = fulfilled;
2021
Cancelled = cancelled;
22+
Failed = failed;
2123
SlotFilled = slotFilled;
2224
SlotFreed = slotFreed;
2325
}
@@ -26,6 +28,7 @@ SlotFreedEventDTO[] slotFreed
2628
public Request[] Requests { get; }
2729
public RequestFulfilledEventDTO[] Fulfilled { get; }
2830
public RequestCancelledEventDTO[] Cancelled { get; }
31+
public RequestFailedEventDTO[] Failed { get; }
2932
public SlotFilledEventDTO[] SlotFilled { get; }
3033
public SlotFreedEventDTO[] SlotFreed { get; }
3134

@@ -37,6 +40,7 @@ public IHasBlock[] All
3740
all.AddRange(Requests);
3841
all.AddRange(Fulfilled);
3942
all.AddRange(Cancelled);
43+
all.AddRange(Failed);
4044
all.AddRange(SlotFilled);
4145
all.AddRange(SlotFreed);
4246
return all.ToArray();
@@ -60,6 +64,7 @@ public static ChainEvents FromContractEvents(ICodexContractsEvents events)
6064
events.GetStorageRequests(),
6165
events.GetRequestFulfilledEvents(),
6266
events.GetRequestCancelledEvents(),
67+
events.GetRequestFailedEvents(),
6368
events.GetSlotFilledEvents(),
6469
events.GetSlotFreedEvents()
6570
);

ProjectPlugins/CodexContractsPlugin/ChainMonitor/ChainState.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public interface IChainStateChangeHandler
1313
void OnRequestFinished(RequestEvent requestEvent);
1414
void OnRequestFulfilled(RequestEvent requestEvent);
1515
void OnRequestCancelled(RequestEvent requestEvent);
16+
void OnRequestFailed(RequestEvent requestEvent);
1617
void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex);
1718
void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex);
1819
}
@@ -41,15 +42,12 @@ public ChainState(ILog log, ICodexContracts contracts, IChainStateChangeHandler
4142
this.log = new LogPrefixer(log, "(ChainState) ");
4243
this.contracts = contracts;
4344
handler = changeHandler;
44-
StartUtc = startUtc;
4545
TotalSpan = new TimeRange(startUtc, startUtc);
4646
}
4747

4848
public TimeRange TotalSpan { get; private set; }
4949
public IChainStateRequest[] Requests => requests.ToArray();
5050

51-
public DateTime StartUtc { get; }
52-
5351
public void Update()
5452
{
5553
Update(DateTime.UtcNow);
@@ -124,6 +122,14 @@ private void ApplyEvent(RequestCancelledEventDTO @event)
124122
handler.OnRequestCancelled(new RequestEvent(@event.Block, r));
125123
}
126124

125+
private void ApplyEvent(RequestFailedEventDTO @event)
126+
{
127+
var r = FindRequest(@event.RequestId);
128+
if (r == null) return;
129+
r.UpdateState(@event.Block.BlockNumber, RequestState.Failed);
130+
handler.OnRequestFailed(new RequestEvent(@event.Block, r));
131+
}
132+
127133
private void ApplyEvent(SlotFilledEventDTO @event)
128134
{
129135
var r = FindRequest(@event.RequestId);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using GethPlugin;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Numerics;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
9+
namespace CodexContractsPlugin.ChainMonitor
10+
{
11+
public class ChainStateChangeHandlerMux : IChainStateChangeHandler
12+
{
13+
public ChainStateChangeHandlerMux(params IChainStateChangeHandler[] handlers)
14+
{
15+
Handlers = handlers.ToList();
16+
}
17+
18+
public List<IChainStateChangeHandler> Handlers { get; } = new List<IChainStateChangeHandler>();
19+
20+
public void OnNewRequest(RequestEvent requestEvent)
21+
{
22+
foreach (var handler in Handlers) handler.OnNewRequest(requestEvent);
23+
}
24+
25+
public void OnRequestCancelled(RequestEvent requestEvent)
26+
{
27+
foreach (var handler in Handlers) handler.OnRequestCancelled(requestEvent);
28+
}
29+
30+
public void OnRequestFailed(RequestEvent requestEvent)
31+
{
32+
foreach (var handler in Handlers) handler.OnRequestFailed(requestEvent);
33+
}
34+
35+
public void OnRequestFinished(RequestEvent requestEvent)
36+
{
37+
foreach (var handler in Handlers) handler.OnRequestFinished(requestEvent);
38+
}
39+
40+
public void OnRequestFulfilled(RequestEvent requestEvent)
41+
{
42+
foreach (var handler in Handlers) handler.OnRequestFulfilled(requestEvent);
43+
}
44+
45+
public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
46+
{
47+
foreach (var handler in Handlers) handler.OnSlotFilled(requestEvent, host, slotIndex);
48+
}
49+
50+
public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
51+
{
52+
foreach (var handler in Handlers) handler.OnSlotFreed(requestEvent, slotIndex);
53+
}
54+
}
55+
}

ProjectPlugins/CodexContractsPlugin/ChainMonitor/DoNothingChainEventHandler.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ public void OnRequestCancelled(RequestEvent requestEvent)
1313
{
1414
}
1515

16+
public void OnRequestFailed(RequestEvent requestEvent)
17+
{
18+
}
19+
1620
public void OnRequestFinished(RequestEvent requestEvent)
1721
{
1822
}

ProjectPlugins/CodexContractsPlugin/CodexContractsEvents.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public interface ICodexContractsEvents
1313
Request[] GetStorageRequests();
1414
RequestFulfilledEventDTO[] GetRequestFulfilledEvents();
1515
RequestCancelledEventDTO[] GetRequestCancelledEvents();
16+
RequestFailedEventDTO[] GetRequestFailedEvents();
1617
SlotFilledEventDTO[] GetSlotFilledEvents();
1718
SlotFreedEventDTO[] GetSlotFreedEvents();
1819
}
@@ -71,6 +72,17 @@ public RequestCancelledEventDTO[] GetRequestCancelledEvents()
7172
}).ToArray();
7273
}
7374

75+
public RequestFailedEventDTO[] GetRequestFailedEvents()
76+
{
77+
var events = gethNode.GetEvents<RequestFailedEventDTO>(deployment.MarketplaceAddress, BlockInterval);
78+
return events.Select(e =>
79+
{
80+
var result = e.Event;
81+
result.Block = GetBlock(e.Log.BlockNumber.ToUlong());
82+
return result;
83+
}).ToArray();
84+
}
85+
7486
public SlotFilledEventDTO[] GetSlotFilledEvents()
7587
{
7688
var events = gethNode.GetEvents<SlotFilledEventDTO>(deployment.MarketplaceAddress, BlockInterval);

ProjectPlugins/CodexContractsPlugin/Marketplace/Customizations.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ public partial class RequestCancelledEventDTO : IHasBlock
4040
public BlockTimeEntry Block { get; set; }
4141
}
4242

43+
public partial class RequestFailedEventDTO : IHasBlock
44+
{
45+
[JsonIgnore]
46+
public BlockTimeEntry Block { get; set; }
47+
}
48+
4349
public partial class SlotFilledEventDTO : IHasBlock
4450
{
4551
[JsonIgnore]

Tests/FrameworkTests/Utils/TimeTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,16 @@ public void Timespan()
2121
TimeSpan.FromSeconds(28)
2222
));
2323
}
24+
25+
[Test]
26+
public void Averaging()
27+
{
28+
var first = RollingAverage.GetNewAverage(0.0f, 1, 1.0f);
29+
Assert.That(first, Is.EqualTo(1.0f));
30+
31+
var fifth = RollingAverage.GetNewAverage(5.0f, 5, 0.0f);
32+
var expected = new[] { 5.0f, 5.0f, 5.0f, 5.0f, 0.0f }.Average();
33+
Assert.That(fifth, Is.EqualTo(expected));
34+
}
2435
}
2536
}

Tools/MarketInsights/AppState.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace MarketInsights
2+
{
3+
public class AppState
4+
{
5+
public AppState(Configuration config)
6+
{
7+
Config = config;
8+
}
9+
10+
public MarketOverview MarketOverview { get; set; } = new ();
11+
public Configuration Config { get; }
12+
}
13+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using CodexContractsPlugin.ChainMonitor;
2+
using GethPlugin;
3+
using System.Numerics;
4+
using Utils;
5+
6+
namespace MarketInsights
7+
{
8+
public class AverageHistory
9+
{
10+
public readonly List<MarketTimeSegment> contributions = new List<MarketTimeSegment>();
11+
12+
}
13+
14+
public class ContributionBuilder : IChainStateChangeHandler
15+
{
16+
private readonly MarketTimeSegment segment = new MarketTimeSegment();
17+
18+
public void OnNewRequest(RequestEvent requestEvent)
19+
{
20+
AddRequestToAverage(segment.Submitted, requestEvent);
21+
}
22+
23+
public void OnRequestCancelled(RequestEvent requestEvent)
24+
{
25+
AddRequestToAverage(segment.Expired, requestEvent);
26+
}
27+
28+
public void OnRequestFailed(RequestEvent requestEvent)
29+
{
30+
AddRequestToAverage(segment.Failed, requestEvent);
31+
}
32+
33+
public void OnRequestFinished(RequestEvent requestEvent)
34+
{
35+
AddRequestToAverage(segment.Finished, requestEvent);
36+
}
37+
38+
public void OnRequestFulfilled(RequestEvent requestEvent)
39+
{
40+
AddRequestToAverage(segment.Started, requestEvent);
41+
}
42+
43+
public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
44+
{
45+
}
46+
47+
public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
48+
{
49+
}
50+
51+
private void AddRequestToAverage(ContractAverages average, RequestEvent requestEvent)
52+
{
53+
average.Number++;
54+
average.Price = GetNewAverage(average.Price, average.Number, requestEvent.Request.Request.Ask.Reward);
55+
average.Size = GetNewAverage(average.Size, average.Number, requestEvent.Request.Request.Ask.SlotSize);
56+
average.Duration = GetNewAverage(average.Duration, average.Number, requestEvent.Request.Request.Ask.Duration);
57+
average.Collateral = GetNewAverage(average.Collateral, average.Number, requestEvent.Request.Request.Ask.Collateral);
58+
average.ProofProbability = GetNewAverage(average.ProofProbability, average.Number, requestEvent.Request.Request.Ask.ProofProbability);
59+
}
60+
61+
private float GetNewAverage(float currentAverage, int newNumberOfValues, BigInteger newValue)
62+
{
63+
return GetNewAverage(currentAverage, newNumberOfValues, (float)newValue);
64+
}
65+
66+
private float GetNewAverage(float currentAverage, int newNumberOfValues, float newValue)
67+
{
68+
return RollingAverage.GetNewAverage(currentAverage, newNumberOfValues, newValue);
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)