private static Dictionary <string, object> GetFields(LnrpcChannel metric)
 {
     return(new Dictionary <string, object>
     {
         { nameof(metric.Active).ToLowerInvariant(), metric.Active.ToInt() },
         { nameof(metric.Capacity).ToLowerInvariant(), metric.Capacity.ToLong() },
         { nameof(metric.Local_balance).ToLowerInvariant(), metric.Local_balance.ToLong() },
         { nameof(metric.Remote_balance).ToLowerInvariant(), metric.Remote_balance.ToLong() },
         { nameof(metric.Unsettled_balance).ToLowerInvariant(), metric.Unsettled_balance.ToLong() },
         { nameof(metric.Total_satoshis_received).ToLowerInvariant(), metric.Total_satoshis_received.ToLong() },
         { nameof(metric.Total_satoshis_sent).ToLowerInvariant(), metric.Total_satoshis_sent.ToLong() },
         { nameof(metric.Commit_fee).ToLowerInvariant(), metric.Commit_fee.ToLong() },
         { nameof(metric.Commit_weight).ToLowerInvariant(), metric.Commit_weight.ToLong() },
         { nameof(metric.Fee_per_kw).ToLowerInvariant(), metric.Fee_per_kw.ToLong() },
         { nameof(metric.Num_updates).ToLowerInvariant(), metric.Num_updates.ToLong() }
     });
 }
Exemple #2
0
        public async Task <LnrpcChannel> EnsureLightningChannelAsync()
        {
            var merchantInfo = await WaitLNSynched();

            var merchantNodeAddress = new LnrpcLightningAddress
            {
                Pubkey = merchantInfo.NodeId,
                Host   = "merchant_lnd:9735"
            };

            while (true)
            {
                // if channel is pending generate blocks until confirmed
                var pendingResponse = await CustomerLnd.PendingChannelsAsync();

                if (pendingResponse.Pending_open_channels?
                    .Any(a => a.Channel?.Remote_node_pub == merchantNodeAddress.Pubkey) == true)
                {
                    ExplorerNode.Generate(1);
                    await WaitLNSynched();

                    continue;
                }

                // check if channel is established
                var chanResponse = await CustomerLnd.ListChannelsAsync(null, null, null, null);

                LnrpcChannel channelToMerchant = null;
                if (chanResponse != null && chanResponse.Channels != null)
                {
                    channelToMerchant = chanResponse.Channels
                                        .Where(a => a.Remote_pubkey == merchantNodeAddress.Pubkey)
                                        .FirstOrDefault();
                }

                if (channelToMerchant == null)
                {
                    // create new channel
                    var isConnected = await CustomerLnd.ListPeersAsync();

                    if (isConnected.Peers == null ||
                        !isConnected.Peers.Any(a => a.Pub_key == merchantInfo.NodeId))
                    {
                        var connectResp = await CustomerLnd.ConnectPeerAsync(new LnrpcConnectPeerRequest
                        {
                            Addr = merchantNodeAddress
                        });
                    }

                    var addressResponse = await CustomerLnd.NewWitnessAddressAsync();

                    var address = BitcoinAddress.Create(addressResponse.Address, Network.RegTest);
                    await ExplorerNode.SendToAddressAsync(address, Money.Coins(0.2m));

                    ExplorerNode.Generate(1);
                    await WaitLNSynched();

                    var channelReq = new LnrpcOpenChannelRequest
                    {
                        Local_funding_amount = 16777215.ToString(CultureInfo.InvariantCulture),
                        Node_pubkey_string   = merchantInfo.NodeId
                    };
                    var channelResp = await CustomerLnd.OpenChannelSyncAsync(channelReq);
                }
                else
                {
                    // channel exists, return it
                    ExplorerNode.Generate(1);
                    await WaitLNSynched();

                    return(channelToMerchant);
                }
            }
        }