btcpayserver/BTCPayServer/Services/Wallets/BTCPayWallet.cs

62 lines
1.7 KiB
C#
Raw Normal View History

using NBitcoin;
2017-09-13 15:47:34 +09:00
using NBXplorer;
using NBXplorer.DerivationStrategy;
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Data;
2017-09-13 15:47:34 +09:00
namespace BTCPayServer.Services.Wallets
2017-09-13 15:47:34 +09:00
{
public class BTCPayWallet
{
2017-09-13 15:47:34 +09:00
private ExplorerClient _Client;
private Serializer _Serializer;
ApplicationDbContextFactory _DBFactory;
2017-09-13 15:47:34 +09:00
public BTCPayWallet(ExplorerClient client, ApplicationDbContextFactory factory)
2017-09-13 15:47:34 +09:00
{
if(client == null)
throw new ArgumentNullException(nameof(client));
if(factory == null)
throw new ArgumentNullException(nameof(factory));
2017-09-13 15:47:34 +09:00
_Client = client;
_DBFactory = factory;
2017-09-13 15:47:34 +09:00
_Serializer = new NBXplorer.Serializer(_Client.Network);
}
public async Task<BitcoinAddress> ReserveAddressAsync(DerivationStrategyBase derivationStrategy)
2017-09-13 15:47:34 +09:00
{
var pathInfo = await _Client.GetUnusedAsync(derivationStrategy, DerivationFeature.Deposit, 0, true).ConfigureAwait(false);
return pathInfo.ScriptPubKey.GetDestinationAddress(_Client.Network);
}
public async Task TrackAsync(DerivationStrategyBase derivationStrategy)
{
await _Client.TrackAsync(derivationStrategy);
2017-09-13 15:47:34 +09:00
}
private byte[] ToBytes<T>(T obj)
{
return ZipUtils.Zip(_Serializer.ToString(obj));
}
public Task BroadcastTransactionsAsync(List<Transaction> transactions)
{
var tasks = transactions.Select(t => _Client.BroadcastAsync(t)).ToArray();
return Task.WhenAll(tasks);
}
public async Task<Money> GetBalance(DerivationStrategyBase derivationStrategy)
{
var result = await _Client.SyncAsync(derivationStrategy, null, true);
return result.Confirmed.UTXOs.Select(u => u.Output.Value)
.Concat(result.Unconfirmed.UTXOs.Select(u => u.Output.Value))
.Sum();
}
2017-09-13 15:47:34 +09:00
}
}