using NBitpayClient; using System.Linq; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using NBitcoin; namespace BTCPayServer.Services.Rates { public class BitpayRateProviderDescription : RateProviderDescription { public IRateProvider CreateRateProvider(IServiceProvider serviceProvider) { return new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/"))); } } public class BitpayRateProvider : IRateProvider { Bitpay _Bitpay; public BitpayRateProvider(Bitpay bitpay) { if (bitpay == null) throw new ArgumentNullException(nameof(bitpay)); _Bitpay = bitpay; } public async Task GetRateAsync(string currency) { var rates = await _Bitpay.GetRatesAsync().ConfigureAwait(false); var rate = rates.GetRate(currency); if (rate == 0m) throw new RateUnavailableException(currency); return (decimal)rate; } public async Task> GetRatesAsync() { return (await _Bitpay.GetRatesAsync().ConfigureAwait(false)) .AllRates .Select(r => new Rate() { Currency = r.Code, Value = r.Value }) .ToList(); } } }