public IEnumerable <T> GetSupportedPaymentMethod <T>(PaymentMethodId paymentMethodId, BTCPayNetworkProvider networks) where T : ISupportedPaymentMethod { return (GetSupportedPaymentMethod(networks) .Where(p => paymentMethodId == null || p.PaymentId == paymentMethodId) .OfType <T>()); }
public static List <PaymentMethodCriteria> GetPaymentMethodCriteria(this StoreData storeData, BTCPayNetworkProvider networkProvider, StoreBlob storeBlob = null) { #pragma warning disable 612 storeBlob ??= storeData.GetStoreBlob(); return(storeData.GetEnabledPaymentIds(networkProvider).Select(paymentMethodId => { var matchedFromBlob = #pragma warning disable CS0618 // Type or member is obsolete storeBlob.PaymentMethodCriteria?.SingleOrDefault(criteria => criteria.PaymentMethod == paymentMethodId && criteria.Value != null); #pragma warning restore CS0618 // Type or member is obsolete if (matchedFromBlob is null && paymentMethodId.PaymentType == LightningPaymentType.Instance && storeBlob.LightningMaxValue != null) { return new PaymentMethodCriteria() { Above = false, PaymentMethod = paymentMethodId, Value = storeBlob.LightningMaxValue }; } if (matchedFromBlob is null && paymentMethodId.PaymentType == BitcoinPaymentType.Instance && storeBlob.OnChainMinValue != null) { return new PaymentMethodCriteria() { Above = true, PaymentMethod = paymentMethodId, Value = storeBlob.OnChainMinValue }; } return new PaymentMethodCriteria() { PaymentMethod = paymentMethodId, Above = matchedFromBlob?.Above ?? true, Value = matchedFromBlob?.Value }; }).ToList()); #pragma warning restore 612 }
public void LoadArgs(IConfiguration conf) { NetworkType = DefaultConfiguration.GetNetworkType(conf); var defaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType); DataDir = conf.GetOrDefault <string>("datadir", defaultSettings.DefaultDataDirectory); Logs.Configuration.LogInformation("Network: " + NetworkType.ToString()); var supportedChains = conf.GetOrDefault <string>("chains", "btc") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToUpperInvariant()); NetworkProvider = new BTCPayNetworkProvider(NetworkType).Filter(supportedChains.ToArray()); foreach (var chain in supportedChains) { if (NetworkProvider.GetNetwork(chain) == null) { throw new ConfigException($"Invalid chains \"{chain}\""); } } var validChains = new List <string>(); foreach (var net in NetworkProvider.GetAll()) { NBXplorerConnectionSetting setting = new NBXplorerConnectionSetting(); setting.CryptoCode = net.CryptoCode; setting.ExplorerUri = conf.GetOrDefault <Uri>($"{net.CryptoCode}.explorer.url", net.NBXplorerNetwork.DefaultSettings.DefaultUrl); setting.CookieFile = conf.GetOrDefault <string>($"{net.CryptoCode}.explorer.cookiefile", net.NBXplorerNetwork.DefaultSettings.DefaultCookieFile); NBXplorerConnectionSettings.Add(setting); { var lightning = conf.GetOrDefault <string>($"{net.CryptoCode}.lightning", string.Empty); if (lightning.Length != 0) { if (!LightningConnectionString.TryParse(lightning, true, out var connectionString, out var error)) { throw new ConfigException($"Invalid setting {net.CryptoCode}.lightning, " + Environment.NewLine + $"If you have a lightning server use: 'type=clightning;server=/root/.lightning/lightning-rpc', " + Environment.NewLine + $"If you have a lightning charge server: 'type=charge;server=https://charge.example.com;api-token=yourapitoken'" + Environment.NewLine + $"If you have a lnd server: 'type=lnd-rest;server=https://lnd:[email protected];macaroon=abf239...;certthumbprint=2abdf302...'" + Environment.NewLine + $" lnd server: 'type=lnd-rest;server=https://lnd:[email protected];macaroonfilepath=/root/.lnd/admin.macaroon;certthumbprint=2abdf302...'" + Environment.NewLine + error); } if (connectionString.IsLegacy) { Logs.Configuration.LogWarning($"Setting {net.CryptoCode}.lightning will work but use an deprecated format, please replace it by '{connectionString.ToString()}'"); } InternalLightningByCryptoCode.Add(net.CryptoCode, connectionString); } } void externalLnd <T>(string code, string lndType) { var lightning = conf.GetOrDefault <string>(code, string.Empty); if (lightning.Length != 0) { if (!LightningConnectionString.TryParse(lightning, false, out var connectionString, out var error)) { throw new ConfigException($"Invalid setting {code}, " + Environment.NewLine + $"lnd server: 'type={lndType};server=https://lnd.example.com;macaroon=abf239...;certthumbprint=2abdf302...'" + Environment.NewLine + $"lnd server: 'type={lndType};server=https://lnd.example.com;macaroonfilepath=/root/.lnd/admin.macaroon;certthumbprint=2abdf302...'" + Environment.NewLine + error); } var instanceType = typeof(T); ExternalServicesByCryptoCode.Add(net.CryptoCode, (ExternalService)Activator.CreateInstance(instanceType, connectionString)); } }; externalLnd <ExternalLndGrpc>($"{net.CryptoCode}.external.lnd.grpc", "lnd-grpc"); externalLnd <ExternalLndRest>($"{net.CryptoCode}.external.lnd.rest", "lnd-rest"); } Logs.Configuration.LogInformation("Supported chains: " + String.Join(',', supportedChains.ToArray())); var services = conf.GetOrDefault <string>("externalservices", null); if (services != null) { foreach (var service in services.Split(new[] { ';', ',' }) .Select(p => p.Split(':')) .Where(p => p.Length == 2) .Select(p => (Name: p[0], Link: p[1]))) { ExternalServices.AddOrReplace(service.Name, service.Link); } } PostgresConnectionString = conf.GetOrDefault <string>("postgres", null); MySQLConnectionString = conf.GetOrDefault <string>("mysql", null); BundleJsCss = conf.GetOrDefault <bool>("bundlejscss", true); ExternalUrl = conf.GetOrDefault <Uri>("externalurl", null); var sshSettings = ParseSSHConfiguration(conf); if ((!string.IsNullOrEmpty(sshSettings.Password) || !string.IsNullOrEmpty(sshSettings.KeyFile)) && !string.IsNullOrEmpty(sshSettings.Server)) { int waitTime = 0; while (!string.IsNullOrEmpty(sshSettings.KeyFile) && !File.Exists(sshSettings.KeyFile)) { if (waitTime++ < 5) { System.Threading.Thread.Sleep(1000); } else { throw new ConfigException($"sshkeyfile does not exist"); } } if (sshSettings.Port > ushort.MaxValue || sshSettings.Port < ushort.MinValue) { throw new ConfigException($"ssh port is invalid"); } if (!string.IsNullOrEmpty(sshSettings.Password) && !string.IsNullOrEmpty(sshSettings.KeyFile)) { throw new ConfigException($"sshpassword or sshkeyfile should be provided, but not both"); } try { sshSettings.CreateConnectionInfo(); } catch { throw new ConfigException($"sshkeyfilepassword is invalid"); } SSHSettings = sshSettings; } var fingerPrints = conf.GetOrDefault <string>("sshtrustedfingerprints", ""); if (!string.IsNullOrEmpty(fingerPrints)) { foreach (var fingerprint in fingerPrints.Split(';', StringSplitOptions.RemoveEmptyEntries)) { if (!SSHFingerprint.TryParse(fingerprint, out var f)) { throw new ConfigException($"Invalid ssh fingerprint format {fingerprint}"); } TrustedFingerprints.Add(f); } } RootPath = conf.GetOrDefault <string>("rootpath", "/"); if (!RootPath.StartsWith("/", StringComparison.InvariantCultureIgnoreCase)) { RootPath = "/" + RootPath; } var old = conf.GetOrDefault <Uri>("internallightningnode", null); if (old != null) { throw new ConfigException($"internallightningnode should not be used anymore, use btclightning instead"); } LogFile = GetDebugLog(conf); if (!string.IsNullOrEmpty(LogFile)) { Logs.Configuration.LogInformation("LogFile: " + LogFile); Logs.Configuration.LogInformation("Log Level: " + GetDebugLogLevel(conf)); } }
public EthereumSyncSummaryProvider(EthereumService ethereumService, BTCPayNetworkProvider btcPayNetworkProvider) { _ethereumService = ethereumService; _btcPayNetworkProvider = btcPayNetworkProvider; }
public static IEnumerable <OnChainPaymentMethodData> GetOnChainPaymentMethods(StoreData store, BTCPayNetworkProvider networkProvider, bool?enabled) { var blob = store.GetStoreBlob(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); return(store.GetSupportedPaymentMethods(networkProvider) .Where((method) => method.PaymentId.PaymentType == PaymentTypes.BTCLike) .OfType <DerivationSchemeSettings>() .Select(strategy => new OnChainPaymentMethodData(strategy.PaymentId.CryptoCode, strategy.AccountDerivation.ToString(), !excludedPaymentMethods.Match(strategy.PaymentId), strategy.Label, strategy.GetSigningAccountKeySettings().GetRootedKeyPath())) .Where((result) => enabled is null || enabled == result.Enabled) .ToList()); }
public PaymentMethod GetPaymentMethod(PaymentMethodId paymentMethodId, BTCPayNetworkProvider networkProvider) { GetPaymentMethods(networkProvider).TryGetValue(paymentMethodId, out var data); return(data); }
// private void initializeEnvironment() { NetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_BTCRPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("BTC").NBitcoinNetwork); }
public InvoiceExport(BTCPayNetworkProvider networks) { Networks = networks; }
public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks) { return(GetEnabledPaymentMethods(storeData, networks).Select(method => method.PaymentId).ToArray()); }
public TorServices(BTCPayServer.BTCPayNetworkProvider networks, BTCPayServerOptions options) { _networks = networks; _Options = options; }
public TorServices(BTCPayNetworkProvider btcPayNetworkProvider, IOptions <BTCPayServerOptions> options, Logs logs) : base(logs) { _btcPayNetworkProvider = btcPayNetworkProvider; _options = options; }
#pragma warning disable CS0618 public string GetDefaultCrypto(BTCPayNetworkProvider networkProvider = null) { return(DefaultCrypto ?? (networkProvider == null ? "BTC" : GetSupportedPaymentMethods(networkProvider).Select(p => p.PaymentId.CryptoCode).FirstOrDefault() ?? "BTC")); }
public GreenfieldStorePaymentMethodsController(BTCPayNetworkProvider btcPayNetworkProvider, IAuthorizationService authorizationService) { _btcPayNetworkProvider = btcPayNetworkProvider; _authorizationService = authorizationService; }
public static async Task ActivateInvoicePaymentMethod(this InvoiceRepository invoiceRepository, EventAggregator eventAggregator, BTCPayNetworkProvider btcPayNetworkProvider, PaymentMethodHandlerDictionary paymentMethodHandlerDictionary, StoreData store, InvoiceEntity invoice, PaymentMethodId paymentMethodId) { var eligibleMethodToActivate = invoice.GetPaymentMethod(paymentMethodId); if (!eligibleMethodToActivate.GetPaymentMethodDetails().Activated) { var payHandler = paymentMethodHandlerDictionary[paymentMethodId]; var supportPayMethod = invoice.GetSupportedPaymentMethod() .Single(method => method.PaymentId == paymentMethodId); var paymentMethod = invoice.GetPaymentMethod(paymentMethodId); var network = btcPayNetworkProvider.GetNetwork(paymentMethodId.CryptoCode); var prepare = payHandler.PreparePayment(supportPayMethod, store, network); InvoiceLogs logs = new InvoiceLogs(); try { logs.Write($"{paymentMethodId}: Activating", InvoiceEventData.EventSeverity.Info); var newDetails = await payHandler.CreatePaymentMethodDetails(logs, supportPayMethod, paymentMethod, store, network, prepare); eligibleMethodToActivate.SetPaymentMethodDetails(newDetails); await invoiceRepository.UpdateInvoicePaymentMethod(invoice.Id, eligibleMethodToActivate); eventAggregator.Publish(new InvoicePaymentMethodActivated(paymentMethodId, invoice)); } catch (PaymentMethodUnavailableException ex) { logs.Write($"{paymentMethodId}: Payment method unavailable ({ex.Message})", InvoiceEventData.EventSeverity.Error); } catch (Exception ex) { logs.Write($"{paymentMethodId}: Unexpected exception ({ex})", InvoiceEventData.EventSeverity.Error); } await invoiceRepository.AddInvoiceLogs(invoice.Id, logs); eventAggregator.Publish(new InvoiceNeedUpdateEvent(invoice.Id)); } }
public IEnumerable <T> GetSupportedPaymentMethod <T>(BTCPayNetworkProvider networks) where T : ISupportedPaymentMethod { return(GetSupportedPaymentMethod <T>(null, networks)); }
public EthereumLikePaymentMethodHandler(BTCPayNetworkProvider networkProvider, EthereumService ethereumService) { _networkProvider = networkProvider; _ethereumService = ethereumService; }
public InvoiceResponse EntityToDTO(BTCPayNetworkProvider networkProvider) { ServerUrl = ServerUrl ?? ""; InvoiceResponse dto = new InvoiceResponse { Id = Id, StoreId = StoreId, OrderId = OrderId, PosData = PosData, CurrentTime = DateTimeOffset.UtcNow, InvoiceTime = InvoiceTime, ExpirationTime = ExpirationTime, #pragma warning disable CS0618 // Type or member is obsolete Status = StatusString, ExceptionStatus = ExceptionStatus == InvoiceExceptionStatus.None ? new JValue(false) : new JValue(ExceptionStatusString), #pragma warning restore CS0618 // Type or member is obsolete Currency = ProductInformation.Currency, Flags = new Flags() { Refundable = Refundable }, PaymentSubtotals = new Dictionary <string, long>(), PaymentTotals = new Dictionary <string, long>(), SupportedTransactionCurrencies = new Dictionary <string, InvoiceSupportedTransactionCurrency>(), Addresses = new Dictionary <string, string>(), PaymentCodes = new Dictionary <string, InvoicePaymentUrls>(), ExchangeRates = new Dictionary <string, Dictionary <string, decimal> >() }; dto.Url = ServerUrl.WithTrailingSlash() + $"invoice?id=" + Id; dto.CryptoInfo = new List <NBitpayClient.InvoiceCryptoInfo>(); dto.MinerFees = new Dictionary <string, MinerFeeInfo>(); foreach (var info in this.GetPaymentMethods(networkProvider)) { var accounting = info.Calculate(); var cryptoInfo = new NBitpayClient.InvoiceCryptoInfo(); var subtotalPrice = accounting.TotalDue - accounting.NetworkFee; var cryptoCode = info.GetId().CryptoCode; var address = info.GetPaymentMethodDetails()?.GetPaymentDestination(); var exrates = new Dictionary <string, decimal> { { ProductInformation.Currency, cryptoInfo.Rate } }; cryptoInfo.CryptoCode = cryptoCode; cryptoInfo.PaymentType = info.GetId().PaymentType.ToString(); cryptoInfo.Rate = info.Rate; cryptoInfo.Price = subtotalPrice.ToString(); cryptoInfo.Due = accounting.Due.ToString(); cryptoInfo.Paid = accounting.Paid.ToString(); cryptoInfo.TotalDue = accounting.TotalDue.ToString(); cryptoInfo.NetworkFee = accounting.NetworkFee.ToString(); cryptoInfo.TxCount = accounting.TxCount; cryptoInfo.CryptoPaid = accounting.CryptoPaid.ToString(); cryptoInfo.Address = address; cryptoInfo.ExRates = exrates; var paymentId = info.GetId(); var scheme = info.Network.UriScheme; cryptoInfo.Url = ServerUrl.WithTrailingSlash() + $"i/{paymentId}/{Id}"; if (paymentId.PaymentType == PaymentTypes.BTCLike) { var minerInfo = new MinerFeeInfo(); minerInfo.TotalFee = accounting.NetworkFee.Satoshi; minerInfo.SatoshiPerBytes = ((BitcoinLikeOnChainPaymentMethod)info.GetPaymentMethodDetails()).FeeRate.GetFee(1).Satoshi; dto.MinerFees.TryAdd(paymentId.CryptoCode, minerInfo); var cryptoSuffix = cryptoInfo.CryptoCode == "BTC" ? "" : "/" + cryptoInfo.CryptoCode; cryptoInfo.PaymentUrls = new NBitpayClient.InvoicePaymentUrls() { BIP21 = $"{scheme}:{cryptoInfo.Address}?amount={cryptoInfo.Due}", }; } if (paymentId.PaymentType == PaymentTypes.LightningLike) { cryptoInfo.PaymentUrls = new NBitpayClient.InvoicePaymentUrls() { BOLT11 = $"lightning:{cryptoInfo.Address}" }; } #pragma warning disable CS0618 if (info.CryptoCode == "BTC" && paymentId.PaymentType == PaymentTypes.BTCLike) { dto.BTCPrice = cryptoInfo.Price; dto.Rate = cryptoInfo.Rate; dto.ExRates = cryptoInfo.ExRates; dto.BitcoinAddress = cryptoInfo.Address; dto.BTCPaid = cryptoInfo.Paid; dto.BTCDue = cryptoInfo.Due; dto.PaymentUrls = cryptoInfo.PaymentUrls; } #pragma warning restore CS0618 dto.CryptoInfo.Add(cryptoInfo); dto.PaymentCodes.Add(paymentId.ToString(), cryptoInfo.PaymentUrls); dto.PaymentSubtotals.Add(paymentId.ToString(), subtotalPrice.Satoshi); dto.PaymentTotals.Add(paymentId.ToString(), accounting.TotalDue.Satoshi); dto.SupportedTransactionCurrencies.TryAdd(cryptoCode, new InvoiceSupportedTransactionCurrency() { Enabled = true }); dto.Addresses.Add(paymentId.ToString(), address); dto.ExchangeRates.TryAdd(cryptoCode, exrates); } //dto.AmountPaid dto.MinerFees & dto.TransactionCurrency are not supported by btcpayserver as we have multi currency payment support per invoice Populate(ProductInformation, dto); dto.Buyer = new JObject(); dto.Buyer.Add(new JProperty("name", BuyerInformation.BuyerName)); dto.Buyer.Add(new JProperty("address1", BuyerInformation.BuyerAddress1)); dto.Buyer.Add(new JProperty("address2", BuyerInformation.BuyerAddress2)); dto.Buyer.Add(new JProperty("locality", BuyerInformation.BuyerCity)); dto.Buyer.Add(new JProperty("region", BuyerInformation.BuyerState)); dto.Buyer.Add(new JProperty("postalCode", BuyerInformation.BuyerZip)); dto.Buyer.Add(new JProperty("country", BuyerInformation.BuyerCountry)); dto.Buyer.Add(new JProperty("phone", BuyerInformation.BuyerPhone)); dto.Buyer.Add(new JProperty("email", string.IsNullOrWhiteSpace(BuyerInformation.BuyerEmail) ? RefundMail : BuyerInformation.BuyerEmail)); dto.Token = Encoders.Base58.EncodeData(RandomUtils.GetBytes(16)); //No idea what it is useful for dto.Guid = Guid.NewGuid().ToString(); return(dto); }
public void LoadArgs(IConfiguration conf) { NetworkType = DefaultConfiguration.GetNetworkType(conf); DataDir = conf.GetDataDir(NetworkType); Logs.Configuration.LogInformation("Network: " + NetworkType.ToString()); if (conf.GetOrDefault <bool>("launchsettings", false) && NetworkType != NetworkType.Regtest) { throw new ConfigException($"You need to run BTCPayServer with the run.sh or run.ps1 script"); } var supportedChains = conf.GetOrDefault <string>("chains", "btc") .Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(t => t.ToUpperInvariant()).ToHashSet(); var networkProvider = new BTCPayNetworkProvider(NetworkType); var filtered = networkProvider.Filter(supportedChains.ToArray()); var elementsBased = filtered.GetAll().OfType <ElementsBTCPayNetwork>(); var parentChains = elementsBased.Select(network => network.NetworkbitcoinCode.ToUpperInvariant()).Distinct(); var allSubChains = networkProvider.GetAll().OfType <ElementsBTCPayNetwork>() .Where(network => parentChains.Contains(network.NetworkbitcoinCode)).Select(network => network.bitcoinCode.ToUpperInvariant()); supportedChains.AddRange(allSubChains); NetworkProvider = networkProvider.Filter(supportedChains.ToArray()); foreach (var chain in supportedChains) { if (NetworkProvider.GetNetwork <BTCPayNetworkBase>(chain) == null) { throw new ConfigException($"Invalid chains \"{chain}\""); } } var validChains = new List <string>(); foreach (var net in NetworkProvider.GetAll().OfType <BTCPayNetwork>()) { NBXplorerConnectionSetting setting = new NBXplorerConnectionSetting(); setting.bitcoinCode = net.bitcoinCode; setting.ExplorerUri = conf.GetOrDefault <Uri>($"{net.bitcoinCode}.explorer.url", net.NBXplorerNetwork.DefaultSettings.DefaultUrl); setting.CookieFile = conf.GetOrDefault <string>($"{net.bitcoinCode}.explorer.cookiefile", net.NBXplorerNetwork.DefaultSettings.DefaultCookieFile); NBXplorerConnectionSettings.Add(setting); { var lightning = conf.GetOrDefault <string>($"{net.bitcoinCode}.lightning", string.Empty); if (lightning.Length != 0) { if (!LightningConnectionString.TryParse(lightning, true, out var connectionString, out var error)) { Logs.Configuration.LogWarning($"Invalid setting {net.bitcoinCode}.lightning, " + Environment.NewLine + $"If you have a c-lightning server use: 'type=clightning;server=/root/.lightning/lightning-rpc', " + Environment.NewLine + $"If you have a lightning charge server: 'type=charge;server=https://charge.example.com;api-token=yourapitoken'" + Environment.NewLine + $"If you have a lnd server: 'type=lnd-rest;server=https://lnd:[email protected];macaroon=abf239...;certthumbprint=2abdf302...'" + Environment.NewLine + $" lnd server: 'type=lnd-rest;server=https://lnd:[email protected];macaroonfilepath=/root/.lnd/admin.macaroon;certthumbprint=2abdf302...'" + Environment.NewLine + $"If you have an eclair server: 'type=eclair;server=http://eclair.com:4570;password=eclairpassword;bitcoin-host=bitcoind:37393;bitcoin-auth=bitcoinrpcuser:bitcoinrpcpassword" + Environment.NewLine + $" eclair server: 'type=eclair;server=http://eclair.com:4570;password=eclairpassword;bitcoin-host=bitcoind:37393" + Environment.NewLine + $"Error: {error}" + Environment.NewLine + "This service will not be exposed through BTCPay Server"); } else { if (connectionString.IsLegacy) { Logs.Configuration.LogWarning($"Setting {net.bitcoinCode}.lightning is a deprecated format, it will work now, but please replace it for future versions with '{connectionString.ToString()}'"); } InternalLightningBybitcoinCode.Add(net.bitcoinCode, connectionString); } } } ExternalServices.Load(net.bitcoinCode, conf); }
public PaymentMethod GetPaymentMethod(BTCPayNetwork network, PaymentTypes paymentType, BTCPayNetworkProvider networkProvider) { return(GetPaymentMethod(new PaymentMethodId(network.CryptoCode, paymentType), networkProvider)); }
public static IEnumerable <ISupportedPaymentMethod> GetSupportedPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks) { if (storeData == null) { throw new ArgumentNullException(nameof(storeData)); } #pragma warning disable CS0618 bool btcReturned = false; // Legacy stuff which should go away if (!string.IsNullOrEmpty(storeData.DerivationStrategy)) { btcReturned = true; yield return(DerivationSchemeSettings.Parse(storeData.DerivationStrategy, networks.BTC)); } if (!string.IsNullOrEmpty(storeData.DerivationStrategies)) { JObject strategies = JObject.Parse(storeData.DerivationStrategies); foreach (var strat in strategies.Properties()) { if (!PaymentMethodId.TryParse(strat.Name, out var paymentMethodId)) { continue; } var network = networks.GetNetwork <BTCPayNetworkBase>(paymentMethodId.CryptoCode); if (network != null) { if (network == networks.BTC && paymentMethodId.PaymentType == PaymentTypes.BTCLike && btcReturned) { continue; } if (strat.Value.Type == JTokenType.Null) { continue; } yield return (paymentMethodId.PaymentType.DeserializeSupportedPaymentMethod(network, strat.Value)); } } } #pragma warning restore CS0618 }
public GreenFieldStoresController(StoreRepository storeRepository, UserManager <ApplicationUser> userManager, BTCPayNetworkProvider btcPayNetworkProvider) { _storeRepository = storeRepository; _userManager = userManager; _btcPayNetworkProvider = btcPayNetworkProvider; }
public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks) { var excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods(); var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks).Select(p => p.PaymentId) .Where(a => !excludeFilter.Match(a)) .OrderByDescending(a => a.CryptoCode == "BTC") .ThenBy(a => a.CryptoCode) .ThenBy(a => a.PaymentType == PaymentTypes.LightningLike ? 1 : 0) .ToArray(); return(paymentMethodIds); }
public GreenfieldInvoiceController(UIInvoiceController invoiceController, InvoiceRepository invoiceRepository, LinkGenerator linkGenerator, LanguageService languageService, BTCPayNetworkProvider btcPayNetworkProvider, EventAggregator eventAggregator, PaymentMethodHandlerDictionary paymentMethodHandlerDictionary) { _invoiceController = invoiceController; _invoiceRepository = invoiceRepository; _linkGenerator = linkGenerator; _btcPayNetworkProvider = btcPayNetworkProvider; _eventAggregator = eventAggregator; _paymentMethodHandlerDictionary = paymentMethodHandlerDictionary; LanguageService = languageService; }
public InvoiceResponse EntityToDTO(BTCPayNetworkProvider networkProvider) { ServerUrl = ServerUrl ?? ""; InvoiceResponse dto = new InvoiceResponse { Id = Id, OrderId = OrderId, PosData = PosData, CurrentTime = DateTimeOffset.UtcNow, InvoiceTime = InvoiceTime, ExpirationTime = ExpirationTime, Status = Status, Currency = ProductInformation.Currency, Flags = new Flags() { Refundable = Refundable } }; dto.CryptoInfo = new List <InvoiceCryptoInfo>(); foreach (var info in this.GetCryptoData().Values) { var accounting = info.Calculate(); var cryptoInfo = new InvoiceCryptoInfo(); cryptoInfo.CryptoCode = info.CryptoCode; cryptoInfo.Rate = info.Rate; cryptoInfo.Price = Money.Coins(ProductInformation.Price / cryptoInfo.Rate).ToString(); cryptoInfo.Due = accounting.Due.ToString(); cryptoInfo.Paid = accounting.Paid.ToString(); cryptoInfo.TotalDue = accounting.TotalDue.ToString(); cryptoInfo.NetworkFee = accounting.NetworkFee.ToString(); cryptoInfo.TxCount = accounting.TxCount; cryptoInfo.CryptoPaid = accounting.CryptoPaid; cryptoInfo.Address = info.DepositAddress; cryptoInfo.ExRates = new Dictionary <string, double> { { ProductInformation.Currency, (double)cryptoInfo.Rate } }; var scheme = networkProvider.GetNetwork(info.CryptoCode)?.UriScheme ?? "BTC"; var cryptoSuffix = cryptoInfo.CryptoCode == "BTC" ? "" : "/" + cryptoInfo.CryptoCode; cryptoInfo.Url = ServerUrl.WithTrailingSlash() + $"invoice{cryptoSuffix}?id=" + Id; cryptoInfo.PaymentUrls = new InvoicePaymentUrls() { BIP72 = $"{scheme}:{cryptoInfo.Address}?amount={cryptoInfo.Due}&r={ServerUrl.WithTrailingSlash() + ($"i/{Id}{cryptoSuffix}")}", BIP72b = $"{scheme}:?r={ServerUrl.WithTrailingSlash() + ($"i/{Id}{cryptoSuffix}")}", BIP73 = ServerUrl.WithTrailingSlash() + ($"i/{Id}{cryptoSuffix}"), BIP21 = $"{scheme}:{cryptoInfo.Address}?amount={cryptoInfo.Due}", }; #pragma warning disable CS0618 if (info.CryptoCode == "BTC") { dto.Url = cryptoInfo.Url; dto.BTCPrice = cryptoInfo.Price; dto.Rate = cryptoInfo.Rate; dto.ExRates = cryptoInfo.ExRates; dto.BitcoinAddress = cryptoInfo.Address; dto.BTCPaid = cryptoInfo.Paid; dto.BTCDue = cryptoInfo.Due; dto.PaymentUrls = cryptoInfo.PaymentUrls; } #pragma warning restore CS0618 dto.CryptoInfo.Add(cryptoInfo); } Populate(ProductInformation, dto); Populate(BuyerInformation, dto); dto.Token = Encoders.Base58.EncodeData(RandomUtils.GetBytes(16)); //No idea what it is useful for dto.Guid = Guid.NewGuid().ToString(); dto.ExceptionStatus = ExceptionStatus == null ? new JValue(false) : new JValue(ExceptionStatus); return(dto); }