diff --git a/BTCPayServer/BTCPayNetwork.cs b/BTCPayServer/BTCPayNetwork.cs index 1337c8e7f..a42480334 100644 --- a/BTCPayServer/BTCPayNetwork.cs +++ b/BTCPayServer/BTCPayNetwork.cs @@ -23,5 +23,7 @@ namespace BTCPayServer return CryptoCode == "BTC"; } } + + public string CryptoImagePath { get; set; } } } diff --git a/BTCPayServer/BTCPayNetworkProvider.cs b/BTCPayServer/BTCPayNetworkProvider.cs index 6b4f0a27c..fe6c37456 100644 --- a/BTCPayServer/BTCPayNetworkProvider.cs +++ b/BTCPayServer/BTCPayNetworkProvider.cs @@ -31,7 +31,8 @@ namespace BTCPayServer BlockExplorerLink = "https://www.smartbit.com.au/tx/{0}", NBitcoinNetwork = Network.Main, UriScheme = "bitcoin", - DefaultRateProvider = btcRate + DefaultRateProvider = btcRate, + CryptoImagePath = "imlegacy/bitcoin-symbol.svg" }); Add(new BTCPayNetwork() { @@ -39,7 +40,8 @@ namespace BTCPayServer BlockExplorerLink = "https://live.blockcypher.com/ltc/tx/{0}/", NBitcoinNetwork = NBXplorer.Altcoins.Litecoin.Networks.Mainnet, UriScheme = "litecoin", - DefaultRateProvider = ltcRate + DefaultRateProvider = ltcRate, + CryptoImagePath = "imlegacy/litecoin-symbol.svg" }); } @@ -51,7 +53,8 @@ namespace BTCPayServer BlockExplorerLink = "https://testnet.smartbit.com.au/tx/{0}", NBitcoinNetwork = Network.TestNet, UriScheme = "bitcoin", - DefaultRateProvider = btcRate + DefaultRateProvider = btcRate, + CryptoImagePath = "imlegacy/bitcoin-symbol.svg" }); Add(new BTCPayNetwork() { @@ -59,7 +62,8 @@ namespace BTCPayServer BlockExplorerLink = "http://explorer.litecointools.com/tx/{0}", NBitcoinNetwork = NBXplorer.Altcoins.Litecoin.Networks.Testnet, UriScheme = "litecoin", - DefaultRateProvider = ltcRate + DefaultRateProvider = ltcRate, + CryptoImagePath = "imlegacy/litecoin-symbol.svg" }); } @@ -71,7 +75,8 @@ namespace BTCPayServer BlockExplorerLink = "https://testnet.smartbit.com.au/tx/{0}", NBitcoinNetwork = Network.RegTest, UriScheme = "bitcoin", - DefaultRateProvider = btcRate + DefaultRateProvider = btcRate, + CryptoImagePath = "imlegacy/bitcoin-symbol.svg" }); Add(new BTCPayNetwork() { @@ -79,7 +84,8 @@ namespace BTCPayServer BlockExplorerLink = "http://explorer.litecointools.com/tx/{0}", NBitcoinNetwork = NBXplorer.Altcoins.Litecoin.Networks.Regtest, UriScheme = "litecoin", - DefaultRateProvider = ltcRate + DefaultRateProvider = ltcRate, + CryptoImagePath = "imlegacy/litecoin-symbol.svg" }); } } diff --git a/BTCPayServer/Controllers/InvoiceController.UI.cs b/BTCPayServer/Controllers/InvoiceController.UI.cs index 8e8815ecb..830b14edc 100644 --- a/BTCPayServer/Controllers/InvoiceController.UI.cs +++ b/BTCPayServer/Controllers/InvoiceController.UI.cs @@ -97,13 +97,12 @@ namespace BTCPayServer.Controllers [HttpGet] [Route("i/{invoiceId}")] + [Route("i/{invoiceId}/{cryptoCode}")] [Route("invoice")] [AcceptMediaTypeConstraint("application/bitcoin-paymentrequest", false)] [XFrameOptionsAttribute(null)] public async Task Checkout(string invoiceId, string id = null, string cryptoCode = null) { - if (cryptoCode == null) - cryptoCode = "BTC"; //Keep compatibility with Bitpay invoiceId = invoiceId ?? id; id = invoiceId; @@ -118,21 +117,24 @@ namespace BTCPayServer.Controllers private async Task GetInvoiceModel(string invoiceId, string cryptoCode) { - if (cryptoCode == null) - throw new ArgumentNullException(nameof(cryptoCode)); var invoice = await _InvoiceRepository.GetInvoice(null, invoiceId); + + var store = await _StoreRepository.FindStore(invoice.StoreId); + if (cryptoCode == null) + cryptoCode = store.GetDefaultCrypto(); var network = _NetworkProvider.GetNetwork(cryptoCode); if (invoice == null || network == null || !invoice.Support(network)) return null; - var cryptoData = invoice.GetCryptoData(network); - var store = await _StoreRepository.FindStore(invoice.StoreId); + var dto = invoice.EntityToDTO(_NetworkProvider); var cryptoInfo = dto.CryptoInfo.First(o => o.CryptoCode == network.CryptoCode); + var currency = invoice.ProductInformation.Currency; var accounting = cryptoData.Calculate(); var model = new PaymentModel() { + CryptoCode = network.CryptoCode, ServerUrl = HttpContext.Request.GetAbsoluteRoot(), OrderId = invoice.OrderId, InvoiceId = invoice.Id, @@ -151,7 +153,8 @@ namespace BTCPayServer.Controllers InvoiceBitcoinUrl = cryptoInfo.PaymentUrls.BIP21, TxCount = accounting.TxCount, BtcPaid = accounting.Paid.ToString(), - Status = invoice.Status + Status = invoice.Status, + CryptoImage = "/" + Url.Content(network.CryptoImagePath) }; var expiration = TimeSpan.FromSeconds(model.ExpirationSeconds); @@ -182,10 +185,9 @@ namespace BTCPayServer.Controllers [HttpGet] [Route("i/{invoiceId}/status")] + [Route("i/{invoiceId}/{cryptoCode}/status")] public async Task GetStatus(string invoiceId, string cryptoCode) { - if (cryptoCode == null) - cryptoCode = "BTC"; var model = await GetInvoiceModel(invoiceId, cryptoCode); if (model == null) return NotFound(); diff --git a/BTCPayServer/Controllers/StoresController.cs b/BTCPayServer/Controllers/StoresController.cs index 68cf1024f..e53c5e3bd 100644 --- a/BTCPayServer/Controllers/StoresController.cs +++ b/BTCPayServer/Controllers/StoresController.cs @@ -153,6 +153,7 @@ namespace BTCPayServer.Controllers var vm = new StoreViewModel(); vm.Id = store.Id; vm.StoreName = store.StoreName; + vm.SetCryptoCurrencies(_ExplorerProvider, store.GetDefaultCrypto()); vm.StoreWebsite = store.StoreWebsite; vm.NetworkFee = !storeBlob.NetworkFeeDisabled; vm.SpeedPolicy = store.SpeedPolicy; @@ -286,6 +287,13 @@ namespace BTCPayServer.Controllers store.StoreWebsite = model.StoreWebsite; } + if (store.GetDefaultCrypto() != model.DefaultCryptoCurrency) + { + needUpdate = true; + store.SetDefaultCrypto(model.DefaultCryptoCurrency); + } + model.SetCryptoCurrencies(_ExplorerProvider, model.DefaultCryptoCurrency); + var blob = store.GetStoreBlob(); blob.NetworkFeeDisabled = !model.NetworkFee; blob.MonitoringExpiration = model.MonitoringExpiration; diff --git a/BTCPayServer/Data/StoreData.cs b/BTCPayServer/Data/StoreData.cs index c8c5fa00d..47cf2f798 100644 --- a/BTCPayServer/Data/StoreData.cs +++ b/BTCPayServer/Data/StoreData.cs @@ -141,6 +141,19 @@ namespace BTCPayServer.Data get; set; } + [Obsolete("Use GetDefaultCrypto instead")] + public string DefaultCrypto { get; set; } + +#pragma warning disable CS0618 + public string GetDefaultCrypto() + { + return DefaultCrypto ?? "BTC"; + } + public void SetDefaultCrypto(string defaultCryptoCurrency) + { + DefaultCrypto = defaultCryptoCurrency; + } +#pragma warning restore CS0618 static Network Dummy = Network.Main; diff --git a/BTCPayServer/Migrations/20180109021122_defaultcrypto.Designer.cs b/BTCPayServer/Migrations/20180109021122_defaultcrypto.Designer.cs new file mode 100644 index 000000000..8fa8d1cd3 --- /dev/null +++ b/BTCPayServer/Migrations/20180109021122_defaultcrypto.Designer.cs @@ -0,0 +1,485 @@ +// +using BTCPayServer.Data; +using BTCPayServer.Services.Invoices; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.Internal; +using System; + +namespace BTCPayServer.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20180109021122_defaultcrypto")] + partial class defaultcrypto + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.0.1-rtm-125"); + + modelBuilder.Entity("BTCPayServer.Data.AddressInvoiceData", b => + { + b.Property("Address") + .ValueGeneratedOnAdd(); + + b.Property("CreatedTime"); + + b.Property("InvoiceDataId"); + + b.HasKey("Address"); + + b.HasIndex("InvoiceDataId"); + + b.ToTable("AddressInvoices"); + }); + + modelBuilder.Entity("BTCPayServer.Data.HistoricalAddressInvoiceData", b => + { + b.Property("InvoiceDataId"); + + b.Property("Address"); + + b.Property("Assigned"); + + b.Property("CryptoCode"); + + b.Property("UnAssigned"); + + b.HasKey("InvoiceDataId", "Address"); + + b.ToTable("HistoricalAddressInvoices"); + }); + + modelBuilder.Entity("BTCPayServer.Data.InvoiceData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Blob"); + + b.Property("Created"); + + b.Property("CustomerEmail"); + + b.Property("ExceptionStatus"); + + b.Property("ItemCode"); + + b.Property("OrderId"); + + b.Property("Status"); + + b.Property("StoreDataId"); + + b.HasKey("Id"); + + b.HasIndex("StoreDataId"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("BTCPayServer.Data.PairedSINData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Facade"); + + b.Property("Label"); + + b.Property("PairingTime"); + + b.Property("SIN"); + + b.Property("StoreDataId"); + + b.HasKey("Id"); + + b.HasIndex("SIN"); + + b.HasIndex("StoreDataId"); + + b.ToTable("PairedSINData"); + }); + + modelBuilder.Entity("BTCPayServer.Data.PairingCodeData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DateCreated"); + + b.Property("Expiration"); + + b.Property("Facade"); + + b.Property("Label"); + + b.Property("SIN"); + + b.Property("StoreDataId"); + + b.Property("TokenValue"); + + b.HasKey("Id"); + + b.ToTable("PairingCodes"); + }); + + modelBuilder.Entity("BTCPayServer.Data.PaymentData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Accounted"); + + b.Property("Blob"); + + b.Property("InvoiceDataId"); + + b.HasKey("Id"); + + b.HasIndex("InvoiceDataId"); + + b.ToTable("Payments"); + }); + + modelBuilder.Entity("BTCPayServer.Data.PendingInvoiceData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.HasKey("Id"); + + b.ToTable("PendingInvoices"); + }); + + modelBuilder.Entity("BTCPayServer.Data.RefundAddressesData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Blob"); + + b.Property("InvoiceDataId"); + + b.HasKey("Id"); + + b.HasIndex("InvoiceDataId"); + + b.ToTable("RefundAddresses"); + }); + + modelBuilder.Entity("BTCPayServer.Data.SettingData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Value"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + + modelBuilder.Entity("BTCPayServer.Data.StoreData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DefaultCrypto"); + + b.Property("DerivationStrategies"); + + b.Property("DerivationStrategy"); + + b.Property("SpeedPolicy"); + + b.Property("StoreBlob"); + + b.Property("StoreCertificate"); + + b.Property("StoreName"); + + b.Property("StoreWebsite"); + + b.HasKey("Id"); + + b.ToTable("Stores"); + }); + + modelBuilder.Entity("BTCPayServer.Data.UserStore", b => + { + b.Property("ApplicationUserId"); + + b.Property("StoreDataId"); + + b.Property("Role"); + + b.HasKey("ApplicationUserId", "StoreDataId"); + + b.HasIndex("StoreDataId"); + + b.ToTable("UserStore"); + }); + + modelBuilder.Entity("BTCPayServer.Models.ApplicationUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("RequiresEmailConfirmation"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("BTCPayServer.Data.AddressInvoiceData", b => + { + b.HasOne("BTCPayServer.Data.InvoiceData", "InvoiceData") + .WithMany("AddressInvoices") + .HasForeignKey("InvoiceDataId"); + }); + + modelBuilder.Entity("BTCPayServer.Data.HistoricalAddressInvoiceData", b => + { + b.HasOne("BTCPayServer.Data.InvoiceData") + .WithMany("HistoricalAddressInvoices") + .HasForeignKey("InvoiceDataId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("BTCPayServer.Data.InvoiceData", b => + { + b.HasOne("BTCPayServer.Data.StoreData", "StoreData") + .WithMany() + .HasForeignKey("StoreDataId"); + }); + + modelBuilder.Entity("BTCPayServer.Data.PaymentData", b => + { + b.HasOne("BTCPayServer.Data.InvoiceData", "InvoiceData") + .WithMany("Payments") + .HasForeignKey("InvoiceDataId"); + }); + + modelBuilder.Entity("BTCPayServer.Data.RefundAddressesData", b => + { + b.HasOne("BTCPayServer.Data.InvoiceData", "InvoiceData") + .WithMany("RefundAddresses") + .HasForeignKey("InvoiceDataId"); + }); + + modelBuilder.Entity("BTCPayServer.Data.UserStore", b => + { + b.HasOne("BTCPayServer.Models.ApplicationUser", "ApplicationUser") + .WithMany("UserStores") + .HasForeignKey("ApplicationUserId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("BTCPayServer.Data.StoreData", "StoreData") + .WithMany("UserStores") + .HasForeignKey("StoreDataId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("BTCPayServer.Models.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("BTCPayServer.Models.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("BTCPayServer.Models.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("BTCPayServer.Models.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/BTCPayServer/Migrations/20180109021122_defaultcrypto.cs b/BTCPayServer/Migrations/20180109021122_defaultcrypto.cs new file mode 100644 index 000000000..7bf4da66f --- /dev/null +++ b/BTCPayServer/Migrations/20180109021122_defaultcrypto.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using System; +using System.Collections.Generic; + +namespace BTCPayServer.Migrations +{ + public partial class defaultcrypto : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "DefaultCrypto", + table: "Stores", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "DefaultCrypto", + table: "Stores"); + } + } +} diff --git a/BTCPayServer/Migrations/ApplicationDbContextModelSnapshot.cs b/BTCPayServer/Migrations/ApplicationDbContextModelSnapshot.cs index 182698abe..54db9e768 100644 --- a/BTCPayServer/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/BTCPayServer/Migrations/ApplicationDbContextModelSnapshot.cs @@ -190,6 +190,8 @@ namespace BTCPayServer.Migrations b.Property("Id") .ValueGeneratedOnAdd(); + b.Property("DefaultCrypto"); + b.Property("DerivationStrategies"); b.Property("DerivationStrategy"); diff --git a/BTCPayServer/Models/InvoicingModels/PaymentModel.cs b/BTCPayServer/Models/InvoicingModels/PaymentModel.cs index 5e5e55a5e..0db08f484 100644 --- a/BTCPayServer/Models/InvoicingModels/PaymentModel.cs +++ b/BTCPayServer/Models/InvoicingModels/PaymentModel.cs @@ -7,6 +7,7 @@ namespace BTCPayServer.Models.InvoicingModels { public class PaymentModel { + public string CryptoCode { get; set; } public string ServerUrl { get; set; } public string InvoiceId { get; set; } public string BtcAddress { get; set; } @@ -31,5 +32,6 @@ namespace BTCPayServer.Models.InvoicingModels public string StoreEmail { get; set; } public string OrderId { get; set; } + public string CryptoImage { get; set; } } } diff --git a/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs b/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs index 0f7fdfba1..30ee88c24 100644 --- a/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs +++ b/BTCPayServer/Models/StoreViewModels/StoreViewModel.cs @@ -16,9 +16,14 @@ namespace BTCPayServer.Models.StoreViewModels public string Crypto { get; set; } public string Value { get; set; } } + class Format + { + public string Name { get; set; } + public string Value { get; set; } + } public StoreViewModel() { - + } public string Id { get; set; } @@ -66,5 +71,17 @@ namespace BTCPayServer.Models.StoreViewModels { get; set; } + public SelectList CryptoCurrencies { get; set; } + + [Display(Name = "Default crypto currency on checkout")] + public string DefaultCryptoCurrency { get; set; } + + public void SetCryptoCurrencies(ExplorerClientProvider explorerProvider, string defaultCrypto) + { + var choices = explorerProvider.GetAll().Select(o => new Format() { Name = o.Item1.CryptoCode, Value = o.Item1.CryptoCode }).ToArray(); + var chosen = choices.FirstOrDefault(f => f.Name == defaultCrypto) ?? choices.FirstOrDefault(); + CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen); + DefaultCryptoCurrency = chosen.Name; + } } } diff --git a/BTCPayServer/Views/Invoice/Checkout.cshtml b/BTCPayServer/Views/Invoice/Checkout.cshtml index 03533acde..50643732b 100644 --- a/BTCPayServer/Views/Invoice/Checkout.cshtml +++ b/BTCPayServer/Views/Invoice/Checkout.cshtml @@ -106,11 +106,11 @@
- {{ srvModel.btcDue }} BTC + {{ srvModel.btcDue }} {{ srvModel.cryptoCode }}
- 1 BTC = {{ srvModel.rate }} + 1 {{ srvModel.cryptoCode }} = {{ srvModel.rate }}
@@ -124,23 +124,23 @@
Payment Amount
-
{{srvModel.btcAmount}} BTC
+
{{srvModel.btcAmount}} {{ srvModel.cryptoCode }}
Network Cost
-
{{srvModel.txCount }} transaction x {{ srvModel.txFees}} BTC
+
{{srvModel.txCount }} transaction x {{ srvModel.txFees}} {{ srvModel.cryptoCode }}
Already Paid
-
-{{srvModel.btcPaid }} BTC
+
-{{srvModel.btcPaid }} {{ srvModel.cryptoCode }}
Due
-
{{srvModel.btcDue}} BTC
+
{{srvModel.btcDue}} {{ srvModel.cryptoCode }}
@@ -311,7 +311,7 @@
@@ -336,14 +336,14 @@
- To complete your payment, please send {{ srvModel.btcDue }} BTC to the address below. + To complete your payment, please send {{ srvModel.btcDue }} {{ srvModel.cryptoCode }} to the address below.
Amount
- {{srvModel.btcDue}} BTC + {{srvModel.btcDue}} {{ srvModel.cryptoCode }}
Copied
@@ -360,7 +360,7 @@
{{srvModel.btcAddress}}
diff --git a/BTCPayServer/Views/Stores/UpdateStore.cshtml b/BTCPayServer/Views/Stores/UpdateStore.cshtml index d0ece8112..219847fa5 100644 --- a/BTCPayServer/Views/Stores/UpdateStore.cshtml +++ b/BTCPayServer/Views/Stores/UpdateStore.cshtml @@ -35,6 +35,10 @@
+
+ + +
@@ -69,12 +73,12 @@ @foreach(var scheme in Model.DerivationSchemes) - { - - @scheme.Crypto - @scheme.Value - - } + { + + @scheme.Crypto + @scheme.Value + + }
diff --git a/BTCPayServer/wwwroot/imlegacy/litecoin-symbol.svg b/BTCPayServer/wwwroot/imlegacy/litecoin-symbol.svg new file mode 100644 index 000000000..2c5275fc1 --- /dev/null +++ b/BTCPayServer/wwwroot/imlegacy/litecoin-symbol.svg @@ -0,0 +1 @@ +Litecoin diff --git a/BTCPayServer/wwwroot/js/core.js b/BTCPayServer/wwwroot/js/core.js index a20cae7df..22b37b7b9 100644 --- a/BTCPayServer/wwwroot/js/core.js +++ b/BTCPayServer/wwwroot/js/core.js @@ -192,7 +192,7 @@ function onDataCallback(jsonData) { } function fetchStatus() { - var path = srvModel.serverUrl + "/i/" + srvModel.invoiceId + "/status"; + var path = srvModel.serverUrl + "/i/" + srvModel.invoiceId + "/" + srvModel.cryptoCode + "/status"; $.ajax({ url: path, type: "GET" @@ -215,7 +215,7 @@ if (supportsWebSockets) { }; } catch (e) { - console.error("Error while connecting to websocket for invoice notifictions"); + console.error("Error while connecting to websocket for invoice notifications"); } }