/ Tools / TraceContract / Program.cs
Program.cs
  1  using BlockchainUtils;
  2  using CodexContractsPlugin;
  3  using CodexContractsPlugin.Marketplace;
  4  using Core;
  5  using GethPlugin;
  6  using Logging;
  7  using Utils;
  8  
  9  namespace TraceContract
 10  {
 11      public class Program
 12      {
 13          public static void Main(string[] args)
 14          {
 15              ProjectPlugin.Load<GethPlugin.GethPlugin>();
 16              ProjectPlugin.Load<CodexContractsPlugin.CodexContractsPlugin>();
 17  
 18              var p = new Program();
 19              p.Run();
 20          }
 21  
 22          private readonly ILog log = new ConsoleLog();
 23          private readonly Input input = new();
 24          private readonly Config config = new();
 25          private readonly Output output;
 26  
 27          public Program()
 28          {
 29              output = new(log, input, config);
 30          }
 31  
 32          private void Run()
 33          {
 34              try
 35              {
 36                  TracePurchase();
 37              }
 38              catch (Exception exc)
 39              {
 40                  log.Error(exc.ToString());
 41              }
 42          }
 43  
 44          private void TracePurchase()
 45          { 
 46              Log("Setting up...");
 47              var entryPoint = new EntryPoint(log, new KubernetesWorkflow.Configuration(null, TimeSpan.FromMinutes(1.0), TimeSpan.FromSeconds(10.0), "_Unused!_"), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
 48              entryPoint.Announce();
 49              var ci = entryPoint.CreateInterface();
 50              var geth = ConnectGethNode();
 51              var contracts = ConnectCodexContracts(ci, geth);
 52  
 53              var chainTracer = new ChainTracer(log, geth, contracts, input, output);
 54              var requestTimeRange = chainTracer.TraceChainTimeline();
 55  
 56              Log("Downloading storage nodes logs for the request timerange...");
 57              DownloadStorageNodeLogs(requestTimeRange, entryPoint.Tools);
 58  
 59              output.ShowOutputFiles(log);
 60  
 61              entryPoint.Decommission(false, false, false);
 62              Log("Done");
 63          }
 64  
 65          private IGethNode ConnectGethNode()
 66          {
 67              var account = EthAccountGenerator.GenerateNew();
 68              var blockCache = new BlockCache();
 69              return new CustomGethNode(log, blockCache, config.RpcEndpoint, config.GethPort, account.PrivateKey);
 70          }
 71  
 72          private ICodexContracts ConnectCodexContracts(CoreInterface ci, IGethNode geth)
 73          {
 74              var deployment = new CodexContractsDeployment(
 75                  config: new MarketplaceConfig(),
 76                  marketplaceAddress: config.MarketplaceAddress,
 77                  abi: config.Abi,
 78                  tokenAddress: config.TokenAddress
 79              );
 80              return ci.WrapCodexContractsDeployment(geth, deployment);
 81          }
 82  
 83          private void DownloadStorageNodeLogs(TimeRange requestTimeRange, IPluginTools tools)
 84          {
 85              var start = requestTimeRange.From - config.LogStartBeforeStorageContractStarts;
 86  
 87              foreach (var node in config.StorageNodesKubernetesPodNames)
 88              {
 89                  Log($"Downloading logs from '{node}'...");
 90  
 91                  var targetFile = output.CreateNodeLogTargetFile(node);
 92                  var downloader = new ElasticSearchLogDownloader(log, tools, config);
 93                  downloader.Download(targetFile, node, start, requestTimeRange.To);
 94              }
 95          }
 96  
 97          private void Log(string msg)
 98          {
 99              log.Log(msg);
100          }
101      }
102  }