/ Tools / TraceContract / ChainRequestTracker.cs
ChainRequestTracker.cs
  1  using System.Numerics;
  2  using BlockchainUtils;
  3  using CodexContractsPlugin.ChainMonitor;
  4  using Nethereum.Hex.HexConvertors.Extensions;
  5  using Utils;
  6  
  7  namespace TraceContract
  8  {
  9      public class ChainRequestTracker : IChainStateChangeHandler
 10      {
 11          private readonly string requestId;
 12          private readonly Output output;
 13  
 14          public ChainRequestTracker(Output output, string requestId)
 15          {
 16              this.requestId = requestId.ToLowerInvariant();
 17              this.output = output;
 18          }
 19  
 20          public bool IsFinished { get; private set; } = false;
 21          public DateTime FinishUtc { get; private set; } = DateTime.MinValue;
 22  
 23          public void OnError(string msg)
 24          {
 25          }
 26  
 27          public void OnNewRequest(RequestEvent requestEvent)
 28          {
 29              if (IsMyRequest(requestEvent)) output.LogRequestCreated(requestEvent);
 30          }
 31  
 32          public void OnProofSubmitted(BlockTimeEntry block, string id)
 33          {
 34          }
 35  
 36          public void OnRequestCancelled(RequestEvent requestEvent)
 37          {
 38              if (IsMyRequest(requestEvent))
 39              {
 40                  IsFinished = true;
 41                  FinishUtc = requestEvent.Block.Utc;
 42                  output.LogRequestCancelled(requestEvent);
 43              }
 44          }
 45  
 46          public void OnRequestFailed(RequestEvent requestEvent)
 47          {
 48              if (IsMyRequest(requestEvent))
 49              {
 50                  IsFinished = true;
 51                  FinishUtc = requestEvent.Block.Utc;
 52                  output.LogRequestFailed(requestEvent);
 53              }
 54          }
 55  
 56          public void OnRequestFinished(RequestEvent requestEvent)
 57          {
 58              if (IsMyRequest(requestEvent))
 59              {
 60                  IsFinished = true;
 61                  FinishUtc = requestEvent.Block.Utc;
 62                  output.LogRequestFinished(requestEvent);
 63              }
 64          }
 65  
 66          public void OnRequestFulfilled(RequestEvent requestEvent)
 67          {
 68              if (IsMyRequest(requestEvent))
 69              {
 70                  output.LogRequestStarted(requestEvent);
 71              }
 72          }
 73  
 74          public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex, bool isRepair)
 75          {
 76              if (IsMyRequest(requestEvent))
 77              {
 78                  output.LogSlotFilled(requestEvent, host, slotIndex, isRepair);
 79              }
 80          }
 81  
 82          public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
 83          {
 84              if (IsMyRequest(requestEvent))
 85              {
 86                  output.LogSlotFreed(requestEvent, slotIndex);
 87              }
 88          }
 89  
 90          public void OnSlotReservationsFull(RequestEvent requestEvent, BigInteger slotIndex)
 91          {
 92              if (IsMyRequest(requestEvent))
 93              {
 94                  output.LogSlotReservationsFull(requestEvent, slotIndex);
 95              }
 96          }
 97  
 98          private bool IsMyRequest(RequestEvent requestEvent)
 99          {
100              return requestId == requestEvent.Request.RequestId.ToHex().ToLowerInvariant();
101          }
102      }
103  
104  }