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() } }); }
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); } } }