Example #1
0
        public async Task HandleSubscription <T>(
            IStreamingClient client,
            RpcStreamingSubscriptionObservableHandler <T> subscription,
            Func <Task> subscribeFunc,
            Action <T> onNext,
            Func <Task> subscribeResponseFunc,
            CancellationToken cancellationToken)
        {
            subscription.GetSubscriptionDataResponsesAsObservable().Subscribe(onNext);
            var subscribed = false;

            subscription.GetSubscribeResponseAsObservable().Subscribe(async id =>
            {
                subscribed = true;
                subscribeResponseFunc?.Invoke();
                await _messagingService.SendLogMessage($"Subscribed ID: {id}");
            });

            subscription.GetUnsubscribeResponseAsObservable().Subscribe(async r =>
            {
                subscribed = false;
                await _messagingService.SendLogMessage($"Unsubscribed result: {r}");
            });

            await client.StartAsync();

            await subscribeFunc();

            SpinWait.SpinUntil(() => subscribed && cancellationToken.IsCancellationRequested);
            await subscription.UnsubscribeAsync();

            SpinWait.SpinUntil(() => !subscribed);
        }
Example #2
0
        public async Task <T> SendQuery <T>(Dictionary <string, string> variableTypes = null, Dictionary <string, object> filters = null, Dictionary <string, HashSet <string> > exclusions = null, object variables = null, string operationName = null, CancellationToken cancellationToken = default)
        {
            using var graphQLClient = new GraphQLHttpClient(_batBotOptions.UniswapSubgraphUrl, new SystemTextJsonSerializer());
            await _messagingService.SendLogMessage($"⚡ Sending Graph query '{typeof(T).GetCustomAttribute<DescriptionAttribute>()?.Description}' with variables '{variables}'");

            return((await graphQLClient.SendQueryAsync <T>(new GraphQLRequest(BuildQuery(typeof(T), variableTypes, filters, exclusions), variables, operationName), cancellationToken)).Data);
        }
Example #3
0
 public async Task Protect(Func <Task> action)
 {
     try
     {
         await _policyCircuitBreaker.ExecuteAsync(action);
     }
     catch (BrokenCircuitException e)
     {
         await _messagingService.SendLogMessage($"Exception: '{e.Message}'.");
     }
     catch (RpcResponseException e)
     {
         await _messagingService.SendLogMessage($"Exception: '{e.Message}'.");
     }
     catch (RpcClientUnknownException e)
     {
         await _messagingService.SendLogMessage($"Exception: '{e.Message}'.");
     }
 }
Example #4
0
        public async Task Subscribe(CancellationToken cancellationToken)
        {
            // http://docs.nethereum.com/en/latest/nethereum-subscriptions-streaming/
            using var streamingClient = new StreamingWebSocketClient(_batBotOptions.BlockchainEndpointWssUrl);
            var subscription = new EthNewPendingTransactionObservableSubscription(streamingClient);

            await _ethereumService.HandleSubscription(streamingClient, subscription, async() => await subscription.SubscribeAsync(), async th =>
            {
                await _messagingService.SendLogMessage($"Pending Transaction Hash: {th}");

                // Don't process transactions (discard) when one is being processed for front running.
                if (_backoffService.BackOff())
                {
                    return;
                }

                await _backoffService.Protect(async() => await _transactionProcessorService.Process(await _ethereumService.GetSwap(th), cancellationToken));
            }, null, cancellationToken);
        }