Пример #1
0
        public async Task <NodeInfo> Test(LightningSupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network)
        {
            if (!_Dashboard.IsFullySynched(network.CryptoCode, out var summary))
            {
                throw new Exception($"Full node not available");
            }

            var cts    = new CancellationTokenSource(5000);
            var client = _LightningClientFactory.CreateClient(supportedPaymentMethod, network);
            LightningNodeInformation info = null;

            try
            {
                info = await client.GetInfo(cts.Token);
            }
            catch (OperationCanceledException) when(cts.IsCancellationRequested)
            {
                throw new Exception($"The lightning node did not replied in a timely maner");
            }
            catch (Exception ex)
            {
                throw new Exception($"Error while connecting to the API ({ex.Message})");
            }

            if (info.Address == null)
            {
                throw new Exception($"No lightning node public address has been configured");
            }

            var blocksGap = Math.Abs(info.BlockHeight - summary.Status.ChainHeight);

            if (blocksGap > 10)
            {
                throw new Exception($"The lightning is not synched ({blocksGap} blocks)");
            }

            try
            {
                if (!SkipP2PTest)
                {
                    await TestConnection(info.Address, info.P2PPort, cts.Token);
                }
            }
            catch (Exception ex)
            {
                throw new Exception($"Error while connecting to the lightning node via {info.Address}:{info.P2PPort} ({ex.Message})");
            }
            return(new NodeInfo(info.NodeId, info.Address, info.P2PPort));
        }
        public async Task <NodeInfo> GetNodeInfo(bool preferOnion, LightningSupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network)
        {
            if (!_Dashboard.IsFullySynched(network.CryptoCode, out var summary))
            {
                throw new PaymentMethodUnavailableException($"Full node not available");
            }

            using (var cts = new CancellationTokenSource(LIGHTNING_TIMEOUT))
            {
                var client = _lightningClientFactory.Create(supportedPaymentMethod.GetLightningUrl(), network);
                LightningNodeInformation info = null;
                try
                {
                    info = await client.GetInfo(cts.Token);
                }
                catch (OperationCanceledException) when(cts.IsCancellationRequested)
                {
                    throw new PaymentMethodUnavailableException($"The lightning node did not reply in a timely manner");
                }
                catch (Exception ex)
                {
                    throw new PaymentMethodUnavailableException($"Error while connecting to the API ({ex.Message})");
                }
                var nodeInfo = info.NodeInfoList.FirstOrDefault(i => i.IsTor == preferOnion) ?? info.NodeInfoList.FirstOrDefault();
                if (nodeInfo == null)
                {
                    throw new PaymentMethodUnavailableException($"No lightning node public address has been configured");
                }

                var blocksGap = summary.Status.ChainHeight - info.BlockHeight;
                if (blocksGap > 10)
                {
                    throw new PaymentMethodUnavailableException($"The lightning node is not synched ({blocksGap} blocks left)");
                }

                return(nodeInfo);
            }
        }
        public async Task <NodeInfo> Test(LightningSupportedPaymentMethod supportedPaymentMethod, BTCPayNetwork network)
        {
            if (!_Dashboard.IsFullySynched(network.CryptoCode, out var summary))
            {
                throw new PaymentMethodUnavailableException($"Full node not available");
            }

            using (var cts = new CancellationTokenSource(LIGHTNING_TIMEOUT))
            {
                var client = supportedPaymentMethod.CreateClient(network);
                LightningNodeInformation info = null;
                try
                {
                    info = await client.GetInfo(cts.Token);
                }
                catch (OperationCanceledException) when(cts.IsCancellationRequested)
                {
                    throw new PaymentMethodUnavailableException($"The lightning node did not replied in a timely maner");
                }
                catch (Exception ex)
                {
                    throw new PaymentMethodUnavailableException($"Error while connecting to the API ({ex.Message})");
                }

                if (info.NodeInfo == null)
                {
                    throw new PaymentMethodUnavailableException($"No lightning node public address has been configured");
                }

                var blocksGap = Math.Abs(info.BlockHeight - summary.Status.ChainHeight);
                if (blocksGap > 10)
                {
                    throw new PaymentMethodUnavailableException($"The lightning is not synched ({blocksGap} blocks)");
                }

                return(info.NodeInfo);
            }
        }