Compare commits

..

6 Commits

86 changed files with 166 additions and 793 deletions

View File

@ -1,6 +1,5 @@
using System;
using System.Threading.Tasks;
using BTCPayServer.Client.Models;
using BTCPayServer.Payments;
using BTCPayServer.Tests.Logging;
using BTCPayServer.Views.Stores;
@ -28,7 +27,6 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser();
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.AddDerivationScheme();
s.GoToStore(StoreNavPages.CheckoutAppearance);
s.Driver.FindElement(By.Id("RequiresRefundEmail")).Click();
@ -74,7 +72,6 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser();
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.AddDerivationScheme();
// Now create an invoice that requires a refund email
@ -127,7 +124,6 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser();
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.AddDerivationScheme();
var invoiceId = s.CreateInvoice();
@ -158,12 +154,12 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser(true);
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.AddLightningNode();
s.AddDerivationScheme();
var invoiceId = s.CreateInvoice(defaultPaymentMethod: "BTC_LightningLike");
s.GoToInvoiceCheckout(invoiceId);
Assert.Equal("Bitcoin (Lightning) (BTC)", s.Driver.FindElement(By.ClassName("payment__currencies")).Text);
s.Driver.Quit();
}
@ -178,7 +174,6 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser(true);
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.AddLightningNode();
s.GoToLightningSettings();
s.Driver.SetCheckbox(By.Id("LightningAmountInSatoshi"), true);
@ -198,7 +193,6 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser();
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.GoToStore();
s.AddDerivationScheme();
var invoiceId = s.CreateInvoice(0.001m, "BTC", "a@x.com");

View File

@ -1,13 +1,11 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using BTCPayServer.Client.Models;
using BTCPayServer.Payments;
using BTCPayServer.Tests.Logging;
using BTCPayServer.Views.Stores;
using NBitcoin;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.Extensions;
using OpenQA.Selenium.Support.UI;
using Xunit;
using Xunit.Abstractions;
@ -34,6 +32,7 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser(true);
s.CreateNewStore();
s.EnableCheckoutV2();
s.AddLightningNode();
// Use non-legacy derivation scheme
s.AddDerivationScheme("BTC", "tpubDD79XF4pzhmPSJ9AyUay9YbXAeD1c6nkUqC32pnKARJH6Ja5hGUfGc76V82ahXpsKqN6UcSGXMkzR34aZq4W23C6DAdZFaVrzWqzj24F8BC");
@ -149,7 +148,7 @@ namespace BTCPayServer.Tests
Assert.True(expiredSection.Displayed);
Assert.Contains("Invoice Expired", expiredSection.Text);
});
Assert.True(s.Driver.ElementDoesNotExist(By.Id("receipt-btn")));
Assert.True(s.Driver.ElementDoesNotExist(By.Id("ReceiptLink")));
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
// Test payment
@ -180,16 +179,23 @@ namespace BTCPayServer.Tests
await s.Server.ExplorerNode.GenerateAsync(1);
// Fake Pay
s.Driver.FindElement(By.Id("FakePayAmount")).FillIn(amountFraction);
s.Driver.FindElement(By.Id("FakePay")).Click();
TestUtils.Eventually(() =>
{
Assert.Contains("Created transaction",
s.Driver.WaitForElement(By.Id("CheatSuccessMessage")).Text);
s.Server.ExplorerNode.Generate(2);
paymentInfo = s.Driver.WaitForElement(By.Id("PaymentInfo"));
Assert.Contains("The invoice hasn't been paid in full", paymentInfo.Text);
Assert.Contains("Please send", paymentInfo.Text);
});
s.Driver.Navigate().Refresh();
// Pay full amount
s.PayInvoice();
var amountDue = s.Driver.FindElement(By.Id("AmountDue")).GetAttribute("data-amount-due");
s.Driver.FindElement(By.Id("FakePayAmount")).FillIn(amountDue);
s.Driver.FindElement(By.Id("FakePay")).Click();
// Processing
TestUtils.Eventually(() =>
{
@ -199,8 +205,9 @@ namespace BTCPayServer.Tests
Assert.Contains("Your payment has been received and is now processing", processingSection.Text);
Assert.True(s.Driver.ElementDoesNotExist(By.Id("confetti")));
});
// Mine
s.MineBlockOnInvoiceCheckout();
s.Driver.FindElement(By.Id("Mine")).Click();
TestUtils.Eventually(() =>
{
Assert.Contains("Mined 1 block",
@ -215,7 +222,7 @@ namespace BTCPayServer.Tests
Assert.Contains("Invoice Paid", settledSection.Text);
});
s.Driver.FindElement(By.Id("confetti"));
s.Driver.FindElement(By.Id("receipt-btn"));
s.Driver.FindElement(By.Id("ReceiptLink"));
Assert.Equal(storeUrl, s.Driver.FindElement(By.Id("StoreLink")).GetAttribute("href"));
// BIP21
@ -405,6 +412,7 @@ namespace BTCPayServer.Tests
s.GoToRegister();
s.RegisterNewUser();
s.CreateNewStore();
s.EnableCheckoutV2();
s.GoToStore();
s.AddDerivationScheme();
var invoiceId = s.CreateInvoice(0.001m, "BTC", "a@x.com");

View File

@ -249,7 +249,6 @@ namespace BTCPayServer.Tests
await s.StartAsync();
s.RegisterNewUser(true);
var receiver = s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
var receiverSeed = s.GenerateWallet("BTC", "", true, true, ScriptPubKeyType.Segwit);
var receiverWalletId = new WalletId(receiver.storeId, "BTC");
@ -304,7 +303,6 @@ namespace BTCPayServer.Tests
{
var cryptoCode = "BTC";
var receiver = s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
var receiverSeed = s.GenerateWallet(cryptoCode, "", true, true, format);
var receiverWalletId = new WalletId(receiver.storeId, cryptoCode);

View File

@ -5,7 +5,6 @@ using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Extensions;
using BTCPayServer.Abstractions.Models;
using BTCPayServer.Client.Models;
using BTCPayServer.Lightning;
using BTCPayServer.Lightning.CLightning;
using BTCPayServer.Views.Manage;
@ -95,7 +94,6 @@ namespace BTCPayServer.Tests
Driver.FindElement(By.Id("test-payment-amount")).Clear();
Driver.FindElement(By.Id("test-payment-amount")).SendKeys(amount.ToString());
}
Driver.WaitUntilAvailable(By.Id("FakePayment"));
Driver.FindElement(By.Id("FakePayment")).Click();
if (mine)
{
@ -195,22 +193,16 @@ namespace BTCPayServer.Tests
StoreId = storeId;
return (name, storeId);
}
public void EnableCheckout(CheckoutType checkoutType, bool bip21 = false)
public void EnableCheckoutV2(bool bip21 = false)
{
GoToStore(StoreNavPages.CheckoutAppearance);
if (checkoutType == CheckoutType.V2)
{
Driver.SetCheckbox(By.Id("UseClassicCheckout"), false);
Driver.WaitForElement(By.Id("OnChainWithLnInvoiceFallback"));
Driver.SetCheckbox(By.Id("OnChainWithLnInvoiceFallback"), bip21);
}
else
{
Driver.SetCheckbox(By.Id("UseClassicCheckout"), true);
}
Driver.SetCheckbox(By.Id("UseNewCheckout"), true);
Driver.WaitForElement(By.Id("OnChainWithLnInvoiceFallback"));
Driver.SetCheckbox(By.Id("OnChainWithLnInvoiceFallback"), bip21);
Driver.FindElement(By.Id("Save")).SendKeys(Keys.Enter);
Assert.Contains("Store successfully updated", FindAlertMessage().Text);
Assert.True(Driver.FindElement(By.Id("UseClassicCheckout")).Selected);
Assert.True(Driver.FindElement(By.Id("UseNewCheckout")).Selected);
}
public Mnemonic GenerateWallet(string cryptoCode = "BTC", string seed = "", bool? importkeys = null, bool isHotWallet = false, ScriptPubKeyType format = ScriptPubKeyType.Segwit)

View File

@ -592,7 +592,7 @@ namespace BTCPayServer.Tests
s.GoToInvoices(s.StoreId);
s.GoToInvoiceCheckout(i);
var checkouturi = s.Driver.Url;
s.PayInvoice(mine: true);
s.PayInvoice();
TestUtils.Eventually(() =>
{
s.Driver.Navigate().Refresh();
@ -602,7 +602,7 @@ namespace BTCPayServer.Tests
{
s.Driver.Navigate().Refresh();
Assert.DoesNotContain("invoice-unsettled", s.Driver.PageSource);
Assert.Contains("\"PaymentDetails\"", s.Driver.PageSource);
Assert.Contains("invoice-processing", s.Driver.PageSource);
});
s.GoToUrl(checkouturi);
@ -1067,7 +1067,6 @@ namespace BTCPayServer.Tests
await s.StartAsync();
s.RegisterNewUser();
s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
s.AddDerivationScheme();
s.Driver.FindElement(By.Id("StoreNav-PaymentRequests")).Click();
@ -2039,7 +2038,6 @@ namespace BTCPayServer.Tests
new[] { s.Server.MerchantLnd.Client });
s.RegisterNewUser(true);
(_, string storeId) = s.CreateNewStore();
s.EnableCheckout(CheckoutType.V1);
var network = s.Server.NetworkProvider.GetNetwork<BTCPayNetwork>(cryptoCode).NBitcoinNetwork;
s.AddLightningNode(LightningConnectionType.CLightning, false);
s.GoToLightningSettings();
@ -2170,7 +2168,6 @@ namespace BTCPayServer.Tests
s.GoToHome();
s.CreateNewStore(false);
s.EnableCheckout(CheckoutType.V1);
s.AddLightningNode(LightningConnectionType.LndREST, false);
s.GoToLightningSettings();
s.Driver.SetCheckbox(By.Id("LNURLEnabled"), true);

View File

@ -17,7 +17,7 @@ namespace BTCPayServer.Tests
#if DEBUG && !SHORT_TIMEOUT
public const int TestTimeout = 600_000;
#else
public const int TestTimeout = 90_000;
public const int TestTimeout = 60_000;
#endif
public static DirectoryInfo TryGetSolutionDirectoryInfo(string currentPath = null)
{

View File

@ -131,6 +131,7 @@ namespace BTCPayServer.Tests
// return name.Replace("_", "").ToLowerInvariant();
//}
/// <summary>
/// This utility will use selenium to pilot your browser to
/// automatically translate a language.
@ -146,7 +147,7 @@ namespace BTCPayServer.Tests
[FactWithSecret("TransifexAPIToken")]
public async Task AutoTranslateChatGPT()
{
var file = TranslationFolder.CheckoutV2;
var file = TranslationFolder.CheckoutV1;
using var driver = new ChromeDriver(new ChromeOptions()
{

View File

@ -33,7 +33,7 @@
</a>
</li>
<li class="nav-item">
<a asp-area="" asp-controller="UIStores" asp-action="GeneralSettings" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(new [] {StoreNavPages.Rates, StoreNavPages.CheckoutAppearance, StoreNavPages.General, StoreNavPages.Tokens, StoreNavPages.Users, StoreNavPages.Webhooks, StoreNavPages.PayoutProcessors, StoreNavPages.Emails})" id="StoreNav-StoreSettings">
<a asp-area="" asp-controller="UIStores" asp-action="GeneralSettings" asp-route-storeId="@Model.Store.Id" class="nav-link @ViewData.IsActivePage(new [] {StoreNavPages.Rates, StoreNavPages.CheckoutAppearance, StoreNavPages.General, StoreNavPages.Tokens, StoreNavPages.Users, StoreNavPages.Plugins, StoreNavPages.Webhooks, StoreNavPages.PayoutProcessors, StoreNavPages.Emails})" id="StoreNav-StoreSettings">
<vc:icon symbol="settings"/>
<span>Settings</span>
</a>

View File

@ -46,7 +46,7 @@
<tr>
<td>@tx.Timestamp.ToTimeAgo()</td>
<td>
<vc:truncate-center text="@tx.Id" link="@tx.Link" classes="truncate-center-id" />
<vc:truncate-center text="@tx.Id" link="tx.Link" classes="truncate-center-id" />
</td>
<td>
@if (tx.Labels.Any())

View File

@ -432,8 +432,7 @@ namespace BTCPayServer.Controllers
}
catch (WrongTradingPairException)
{
// Cannot trade this asset
return BadRequest(vm);
// Cannot trade this asset, just ignore
}
}
}
@ -515,17 +514,21 @@ namespace BTCPayServer.Controllers
if (paymentMethodId != null)
{
var walletId = new WalletId(storeId, paymentMethodId.CryptoCode);
var returnUrl = _linkGenerator.GetPathByAction(
var returnUrl = _linkGenerator.GetUriByAction(
nameof(ViewCustodianAccount),
"UICustodianAccounts",
new { storeId = custodianAccount.StoreId, accountId = custodianAccount.Id },
Request.Scheme,
Request.Host,
Request.PathBase);
vm.CryptoImageUrl = GetImage(paymentMethodId, network);
vm.CreateTransactionUrl = _linkGenerator.GetPathByAction(
vm.CreateTransactionUrl = _linkGenerator.GetUriByAction(
nameof(UIWalletsController.WalletSend),
"UIWallets",
new { walletId, defaultDestination = vm.Address, returnUrl },
Request.Scheme,
Request.Host,
Request.PathBase);
}
}

View File

@ -1157,7 +1157,7 @@ namespace BTCPayServer.Controllers
{
StoreId = model.StoreId,
Currency = storeBlob?.DefaultCurrency,
CheckoutType = storeBlob?.CheckoutType ?? CheckoutType.V2,
UseNewCheckout = storeBlob?.CheckoutType is CheckoutType.V2,
AvailablePaymentMethods = GetPaymentMethodsSelectList()
};
@ -1172,7 +1172,7 @@ namespace BTCPayServer.Controllers
{
var store = HttpContext.GetStoreData();
var storeBlob = store.GetStoreBlob();
model.CheckoutType = storeBlob.CheckoutType;
model.UseNewCheckout = storeBlob.CheckoutType == CheckoutType.V2;
model.AvailablePaymentMethods = GetPaymentMethodsSelectList();
if (!ModelState.IsValid)

View File

@ -385,7 +385,7 @@ namespace BTCPayServer.Controllers
};
}).ToList();
vm.UseClassicCheckout = storeBlob.CheckoutType == Client.Models.CheckoutType.V1;
vm.UseNewCheckout = storeBlob.CheckoutType == Client.Models.CheckoutType.V2;
vm.CelebratePayment = storeBlob.CelebratePayment;
vm.OnChainWithLnInvoiceFallback = storeBlob.OnChainWithLnInvoiceFallback;
vm.ShowPayInWalletButton = storeBlob.ShowPayInWalletButton;
@ -509,7 +509,7 @@ namespace BTCPayServer.Controllers
blob.ShowPayInWalletButton = model.ShowPayInWalletButton;
blob.ShowStoreHeader = model.ShowStoreHeader;
blob.CheckoutType = model.UseClassicCheckout ? Client.Models.CheckoutType.V1 : Client.Models.CheckoutType.V2;
blob.CheckoutType = model.UseNewCheckout ? Client.Models.CheckoutType.V2 : Client.Models.CheckoutType.V1;
blob.CelebratePayment = model.CelebratePayment;
blob.OnChainWithLnInvoiceFallback = model.OnChainWithLnInvoiceFallback;
blob.LightningAmountInSatoshi = model.LightningAmountInSatoshi;

View File

@ -33,15 +33,12 @@ namespace BTCPayServer.Data
RecommendedFeeBlockTarget = 1;
PaymentMethodCriteria = new List<PaymentMethodCriteria>();
ReceiptOptions = InvoiceDataBase.ReceiptOptions.CreateDefault();
CheckoutType = CheckoutType.V2;
}
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public NetworkFeeMode NetworkFeeMode { get; set; }
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
[DefaultValue(CheckoutType.V1)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
public CheckoutType CheckoutType { get; set; }
public bool RequiresRefundEmail { get; set; }
public bool LightningAmountInSatoshi { get; set; }

View File

@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Mvc
return url;
if (httpRequest is null)
return null;
if (Uri.TryCreate(url, UriKind.Absolute, out var r) && r.Host.Equals(httpRequest.Host.Host) && (!httpRequest.IsHttps || r.Scheme == "https"))
if (Uri.TryCreate(url, UriKind.Absolute, out var r) && r.Host.Equals(httpRequest.Host.Host))
return url;
return null;
}

View File

@ -12,7 +12,7 @@ public class AssetBalanceInfo
public decimal Qty { get; set; }
public string FormattedQty { get; set; }
public string FormattedFiatValue { get; set; }
public decimal? FiatValue { get; set; }
public decimal FiatValue { get; set; }
public Dictionary<string, AssetPairData> TradableAssetPairs { get; set; }
public List<string> WithdrawablePaymentMethods { get; set; } = new();

View File

@ -2,7 +2,6 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using BTCPayServer.Client.Models;
using BTCPayServer.Services.Apps;
using BTCPayServer.Validation;
using Microsoft.AspNetCore.Mvc.Rendering;
@ -90,6 +89,6 @@ namespace BTCPayServer.Models.InvoicingModels
get; set;
}
public CheckoutType CheckoutType { get; set; }
public bool UseNewCheckout { get; set; }
}
}

View File

@ -38,8 +38,8 @@ namespace BTCPayServer.Models.StoreViewModels
[Display(Name = "Default payment method on checkout")]
public string DefaultPaymentMethod { get; set; }
[Display(Name = "Use the classic checkout")]
public bool UseClassicCheckout { get; set; }
[Display(Name = "Use the new checkout")]
public bool UseNewCheckout { get; set; }
[Display(Name = "Celebrate payment with confetti")]
public bool CelebratePayment { get; set; }

View File

@ -4,39 +4,13 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Custodians;
using BTCPayServer.Abstractions.Custodians.Client;
using BTCPayServer.Abstractions.Form;
using BTCPayServer.Client;
using BTCPayServer.Client.Models;
using BTCPayServer.Data;
using BTCPayServer.Services.Custodian.Client;
using Newtonsoft.Json.Linq;
namespace BTCPayServer.Plugins.FakeCustodian;
public class FakeCustodian : ICustodian, ICanDeposit, ICanWithdraw, ICanTrade
public class FakeCustodian : ICustodian
{
private const string TargetAddress = "3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
private const string ValidWithdrawalId = "FAKE_WITHDRAWAL_ID";
private static readonly decimal _validWithdrawalAmount = new(0.05);
private static readonly decimal _btcWithdrawalFee = new(0.001);
private const string ValidWithdrawalPaymentMethod = "BTC-OnChain";
private const string TransactionId = "FAKE_TRANSACTION_ID";
private const string ValidAsset = "BTC";
private const string ValidPaymentMethod = "BTC-OnChain";
private const string ValidTradeId = "TRADE-ID-001";
private const string TradeFromAsset = "EUR";
private const string TradeToAsset = "BTC";
private static readonly decimal _tradeQtyBought = new(1);
private static readonly decimal _tradeFeeEuro = new(12.5);
private static readonly decimal _btcPriceInEuro = new(30000);
private readonly CustodianAccountRepository _custodianAccountRepository;
public FakeCustodian(CustodianAccountRepository custodianAccountRepository, Client.BTCPayServerClient client)
{
_custodianAccountRepository = custodianAccountRepository;
}
public string Code
{
get => "fake";
@ -50,28 +24,21 @@ public class FakeCustodian : ICustodian, ICanDeposit, ICanWithdraw, ICanTrade
public Task<Dictionary<string, decimal>> GetAssetBalancesAsync(JObject config, CancellationToken cancellationToken)
{
var fakeConfig = ParseConfig(config);
var r = new Dictionary<string, decimal>() { { "BTC", fakeConfig.BTCBalance }, { "LTC", fakeConfig.LTCBalance }, { "USD", fakeConfig.USDBalance }, { "EUR", fakeConfig.EURBalance } };
var r = new Dictionary<string, decimal>()
{
{ "BTC", fakeConfig.BTCBalance },
{ "LTC", fakeConfig.LTCBalance },
{ "USD", fakeConfig.USDBalance },
{ "EUR", fakeConfig.EURBalance }
};
return Task.FromResult(r);
}
public Task<Form> GetConfigForm(JObject config, CancellationToken cancellationToken = default)
{
var form = new Form();
var generalFieldset = Field.CreateFieldset();
generalFieldset.Label = "General";
// TODO we cannot validate the custodian account ID because we have no access to the correct value. This is fine given this is a development tool and won't be needed by actual custodians.
var accountIdField = Field.Create("Custodian Account ID", "CustodianAccountId", null, true,
"Enter the ID of this custodian account. This is needed as a workaround which only applies to the Fake Custodian.");
generalFieldset.Fields.Add(accountIdField);
// TODO we cannot validate the store ID because we have no access to the correct value. This is fine given this is a development tool and won't be needed by actual custodians.
var storeIdField = Field.Create("Store ID", "StoreId", null, true,
"Enter the ID of this store. This is needed as a workaround which only applies to the Fake Custodian.");
generalFieldset.Fields.Add(storeIdField);
form.Fields.Add(generalFieldset);
var balancesFieldset = Field.CreateFieldset();
var fieldset = Field.CreateFieldset();
// Maybe a decimal type field would be better?
var fakeBTCBalance = Field.Create("BTC Balance", "BTCBalance", null, true,
@ -83,12 +50,12 @@ public class FakeCustodian : ICustodian, ICanDeposit, ICanWithdraw, ICanTrade
var fakeUSDBalance = Field.Create("USD Balance", "USDBalance", null, true,
"Enter the amount of USD you want to have.");
balancesFieldset.Label = "Fake balances";
balancesFieldset.Fields.Add(fakeBTCBalance);
balancesFieldset.Fields.Add(fakeLTCBalance);
balancesFieldset.Fields.Add(fakeEURBalance);
balancesFieldset.Fields.Add(fakeUSDBalance);
form.Fields.Add(balancesFieldset);
fieldset.Label = "Your fake balances";
fieldset.Fields.Add(fakeBTCBalance);
fieldset.Fields.Add(fakeLTCBalance);
fieldset.Fields.Add(fakeEURBalance);
fieldset.Fields.Add(fakeUSDBalance);
form.Fields.Add(fieldset);
return Task.FromResult(form);
}
@ -97,254 +64,10 @@ public class FakeCustodian : ICustodian, ICanDeposit, ICanWithdraw, ICanTrade
{
return config?.ToObject<FakeCustodianConfig>() ?? throw new InvalidOperationException("Invalid config");
}
public Task<DepositAddressData> GetDepositAddressAsync(string paymentMethod, JObject config, CancellationToken cancellationToken)
{
if (paymentMethod.Equals(ValidPaymentMethod))
{
DepositAddressData r = new() { Address = "3XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" };
return Task.FromResult(r);
}
return null;
}
public string[] GetDepositablePaymentMethods()
{
return new[] { ValidPaymentMethod };
}
public async Task<WithdrawResult> WithdrawToStoreWalletAsync(string paymentMethod, decimal amount, JObject config, CancellationToken cancellationToken)
{
// TODO Store fake withdrawals in the DB so we can have a history of withdrawals
if (ValidWithdrawalPaymentMethod.Equals(paymentMethod))
{
LedgerEntryData ledgerEntryWithdrawal = new(ValidAsset, -amount, LedgerEntryData.LedgerEntryType.Withdrawal);
LedgerEntryData ledgerEntryFee = new(ValidAsset, - _btcWithdrawalFee, LedgerEntryData.LedgerEntryType.Fee);
List<LedgerEntryData> ledgerEntries = new();
ledgerEntries.Add(ledgerEntryWithdrawal);
ledgerEntries.Add(ledgerEntryFee);
var fakeConfig = ParseConfig(config);
if (amount <= fakeConfig.BTCBalance)
{
fakeConfig.BTCBalance -= amount;
if (_btcWithdrawalFee <= fakeConfig.BTCBalance)
{
fakeConfig.BTCBalance -= _btcWithdrawalFee;
var custodianAccount = await _custodianAccountRepository.FindById(fakeConfig.StoreId, fakeConfig.CustodianAccountId);
if (custodianAccount == null)
{
// We could not load the custodian account using the config settings, so they are bad and should be reported to the user so he can fix them.
throw new BadConfigException(new[] { "StoreId", "CustodianAccountId" });
}
var newConfig = JObject.FromObject(fakeConfig);
custodianAccount.SetBlob(newConfig);
await _custodianAccountRepository.CreateOrUpdate(custodianAccount);
var r = new WithdrawResult(paymentMethod, ValidAsset, ledgerEntries, ValidWithdrawalId, WithdrawalResponseData.WithdrawalStatus.Queued, DateTimeOffset.Now, TargetAddress, TransactionId);
return r;
}
CustodianApiException e3 = new(400, "insufficient-funds", "Cannot withdraw " + amount + " " + ValidAsset + " because you don't have enough to pay for fees");
throw new CannotWithdrawException(this, paymentMethod, TargetAddress, e3);
}
CustodianApiException e1 = new(400, "insufficient-funds", "Cannot withdraw " + amount + " " + ValidAsset + " because you only hold " + fakeConfig.BTCBalance + " " + ValidAsset);
throw new CannotWithdrawException(this, paymentMethod, TargetAddress, e1);
}
CustodianApiException e2 = new(400, "only-btc-supported", "The Fake Custodian can only withdraw using payment method " + ValidWithdrawalPaymentMethod);
throw new CannotWithdrawException(this, paymentMethod, TargetAddress, e2);
}
public Task<SimulateWithdrawalResult> SimulateWithdrawalAsync(string paymentMethod, decimal qty, JObject config, CancellationToken cancellationToken)
{
if (ValidWithdrawalPaymentMethod.Equals(paymentMethod))
{
LedgerEntryData ledgerEntryWithdrawal = new(ValidAsset, -qty, LedgerEntryData.LedgerEntryType.Withdrawal);
LedgerEntryData ledgerEntryFee = new(ValidAsset, new decimal(-0.001), LedgerEntryData.LedgerEntryType.Fee);
List<LedgerEntryData> ledgerEntries = new();
ledgerEntries.Add(ledgerEntryWithdrawal);
ledgerEntries.Add(ledgerEntryFee);
var fakeConfig = ParseConfig(config);
var r = new SimulateWithdrawalResult(paymentMethod, ValidAsset, ledgerEntries, new decimal(0.001), fakeConfig.BTCBalance);
return Task.FromResult(r);
}
CustodianApiException e = new(400, "only-btc-onchain-supported", "The Fake Custodian can only withdraw using payment method " + ValidWithdrawalPaymentMethod);
throw new CannotWithdrawException(this, paymentMethod, TargetAddress, e);
}
public Task<WithdrawResult> GetWithdrawalInfoAsync(string paymentMethod, string withdrawalId, JObject config, CancellationToken cancellationToken)
{
// TODO make this Fake Custodian smarter and store previous fake withdrawals in the DB
if (ValidWithdrawalPaymentMethod.Equals(paymentMethod) && withdrawalId.Equals(ValidWithdrawalId))
{
LedgerEntryData ledgerEntryWithdrawal = new(ValidAsset, _validWithdrawalAmount, LedgerEntryData.LedgerEntryType.Withdrawal);
LedgerEntryData ledgerEntryFee = new(ValidAsset, new decimal(0.001), LedgerEntryData.LedgerEntryType.Fee);
List<LedgerEntryData> ledgerEntries = new();
ledgerEntries.Add(ledgerEntryWithdrawal);
ledgerEntries.Add(ledgerEntryFee);
var r = new WithdrawResult(paymentMethod, ValidAsset, ledgerEntries, ValidWithdrawalId, WithdrawalResponseData.WithdrawalStatus.Queued, DateTimeOffset.Now, TargetAddress, TransactionId);
return Task.FromResult(r);
}
CustodianApiException e = new(400, "withdrawal-not-found", "The Fake Custodian can only fetch withdrawal ID " + ValidWithdrawalId);
throw new CannotWithdrawException(this, paymentMethod, TargetAddress, e);
}
public string[] GetWithdrawablePaymentMethods()
{
return new[] { ValidPaymentMethod };
}
public List<AssetPairData> GetTradableAssetPairs()
{
// We only support trading BTC -> EUR and EUR -> BTC
var r = new List<AssetPairData>();
r.Add(new AssetPairData(ValidAsset, "EUR", (decimal)0.0001));
r.Add(new AssetPairData("EUR", ValidAsset, (decimal)5));
return r;
}
public async Task<MarketTradeResult> TradeMarketAsync(string fromAsset, string toAsset, decimal qty, JObject config, CancellationToken cancellationToken)
{
// TODO store fake traded in the DB + Update the balances so this fake custodian behaves like the real thing.
if ((fromAsset.Equals("EUR") && toAsset.Equals(ValidAsset)) || (fromAsset.Equals(ValidAsset) && toAsset.Equals("EUR")))
{
// We only support trading BTC -> EUR and EUR -> BTC
var fakeConfig = ParseConfig(config);
if (fromAsset.Equals("BTC") && qty > fakeConfig.BTCBalance)
{
throw new InsufficientFundsException($"Insufficient funds. You only have {fakeConfig.BTCBalance} to trade.");
}
if (fromAsset.Equals("EUR") && qty > fakeConfig.EURBalance)
{
throw new InsufficientFundsException($"Insufficient funds. You only have {fakeConfig.EURBalance} to trade.");
}
decimal rate;
rate = getRate(fromAsset, toAsset);
var qtyReceived = qty / rate;
var ledgerEntries = new List<LedgerEntryData>();
ledgerEntries.Add(new LedgerEntryData(fromAsset, -qty, LedgerEntryData.LedgerEntryType.Trade));
ledgerEntries.Add(new LedgerEntryData(toAsset, qtyReceived, LedgerEntryData.LedgerEntryType.Trade));
ledgerEntries.Add(new LedgerEntryData("EUR", -1 * _tradeFeeEuro, LedgerEntryData.LedgerEntryType.Fee));
if (fromAsset.Equals("BTC"))
{
fakeConfig.BTCBalance -= qty;
}
if (fromAsset.Equals("EUR"))
{
fakeConfig.EURBalance -= qty;
}
if (toAsset.Equals("BTC"))
{
fakeConfig.BTCBalance += qtyReceived;
}
if (toAsset.Equals("EUR"))
{
fakeConfig.EURBalance += qtyReceived;
}
// Fees are always in EUR... for now...
if (_tradeFeeEuro <= fakeConfig.EURBalance)
{
fakeConfig.EURBalance -= _tradeFeeEuro;
}
else
{
throw new InsufficientFundsException($"Insufficient funds. You don't have enough EUR to pay for fees.");
}
var custodianAccount = await _custodianAccountRepository.FindById(fakeConfig.StoreId, fakeConfig.CustodianAccountId);
if (custodianAccount == null)
{
// We could not load the custodian account using the config settings, so they are bad and should be reported to the user so he can fix them.
throw new BadConfigException(new[] { "StoreId", "CustodianAccountId" });
}
var newConfig = JObject.FromObject(fakeConfig);
custodianAccount.SetBlob(newConfig);
await _custodianAccountRepository.CreateOrUpdate(custodianAccount);
return new MarketTradeResult(fromAsset, toAsset, ledgerEntries, ValidTradeId);
}
throw new WrongTradingPairException(fromAsset, toAsset);
}
private static decimal getRate(string fromAsset, string toAsset)
{
decimal rate;
if (fromAsset.Equals("EUR") && toAsset.Equals(ValidAsset))
{
rate = _btcPriceInEuro;
}
else
{
rate = 1 / _btcPriceInEuro;
}
return rate;
}
public Task<MarketTradeResult> GetTradeInfoAsync(string tradeId, JObject config, CancellationToken cancellationToken)
{
// TODO load the transaction from the DB which contains previous fake trades
if (tradeId == ValidTradeId)
{
var ledgerEntries = new List<LedgerEntryData>();
ledgerEntries.Add(new LedgerEntryData(ValidAsset, _tradeQtyBought, LedgerEntryData.LedgerEntryType.Trade));
ledgerEntries.Add(new LedgerEntryData("EUR", -1 * _tradeQtyBought * _btcPriceInEuro, LedgerEntryData.LedgerEntryType.Trade));
ledgerEntries.Add(new LedgerEntryData("EUR", -1 * _tradeFeeEuro, LedgerEntryData.LedgerEntryType.Fee));
var r = new MarketTradeResult(TradeFromAsset, TradeToAsset, ledgerEntries, ValidTradeId);
return Task.FromResult(r);
}
return Task.FromResult<MarketTradeResult>(null);
}
public Task<AssetQuoteResult> GetQuoteForAssetAsync(string fromAsset, string toAsset, JObject config, CancellationToken cancellationToken)
{
// TODO use the current market price for a realistic price
if ((fromAsset.Equals("EUR") && toAsset.Equals(ValidAsset)) || (fromAsset.Equals(ValidAsset) && toAsset.Equals("EUR")))
{
// We only support trading BTC -> EUR and EUR -> BTC
decimal rate = getRate(fromAsset, toAsset);
return Task.FromResult(new AssetQuoteResult(fromAsset, toAsset, rate, rate));
}
throw new WrongTradingPairException(fromAsset, toAsset);
}
}
public class FakeCustodianConfig
{
public string CustodianAccountId { get; set; }
public string StoreId { get; set; }
public decimal BTCBalance { get; set; }
public decimal LTCBalance { get; set; }
public decimal USDBalance { get; set; }

View File

@ -20,7 +20,6 @@ using BTCPayServer.Forms.Models;
using BTCPayServer.ModelBinders;
using BTCPayServer.Models;
using BTCPayServer.Plugins.PointOfSale.Models;
using BTCPayServer.Services;
using BTCPayServer.Services.Apps;
using BTCPayServer.Services.Invoices;
using BTCPayServer.Services.Rates;
@ -47,14 +46,12 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
CurrencyNameTable currencies,
StoreRepository storeRepository,
UIInvoiceController invoiceController,
FormDataService formDataService,
DisplayFormatter displayFormatter)
FormDataService formDataService)
{
_currencies = currencies;
_appService = appService;
_storeRepository = storeRepository;
_invoiceController = invoiceController;
_displayFormatter = displayFormatter;
FormDataService = formDataService;
}
@ -62,7 +59,6 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
private readonly StoreRepository _storeRepository;
private readonly AppService _appService;
private readonly UIInvoiceController _invoiceController;
private readonly DisplayFormatter _displayFormatter;
public FormDataService FormDataService { get; }
[HttpGet("/")]
@ -161,11 +157,9 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
decimal? price;
Dictionary<string, InvoiceSupportedTransactionCurrency> paymentMethods = null;
ViewPointOfSaleViewModel.Item choice = null;
Dictionary<string, int> cartItems = null;
ViewPointOfSaleViewModel.Item[] choices = null;
if (!string.IsNullOrEmpty(choiceKey))
{
choices = _appService.GetPOSItems(settings.Template, settings.Currency);
var choices = _appService.GetPOSItems(settings.Template, settings.Currency);
choice = choices.FirstOrDefault(c => c.Id == choiceKey);
if (choice == null)
return NotFound();
@ -200,11 +194,10 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
price = amount;
title = settings.Title;
//if cart IS enabled and we detect posdata that matches the cart system's, check inventory for the items
if (currentView == PosViewType.Cart &&
AppService.TryParsePosCartItems(jposData, out cartItems))
AppService.TryParsePosCartItems(jposData, out var cartItems))
{
choices = _appService.GetPOSItems(settings.Template, settings.Currency);
var choices = _appService.GetPOSItems(settings.Template, settings.Currency);
var expectedMinimumAmount = 0m;
foreach (var cartItem in cartItems)
{
@ -305,50 +298,6 @@ namespace BTCPayServer.Plugins.PointOfSale.Controllers
{
entity.Metadata.OrderUrl = Request.GetDisplayUrl();
entity.Metadata.PosData = jposData;
var receiptData = new JObject();
if (choice is not null)
{
receiptData = JObject.FromObject(new Dictionary<string, string>()
{
{"Title", choice.Title}, {"Description", choice.Description},
});
}
else if (jposData is not null)
{
var appPosData = jposData.ToObject<PosAppData>();
receiptData = new JObject();
if (cartItems is not null && choices is not null)
{
var selectedChoices = choices.Where(item => cartItems.Keys.Contains(item.Id))
.ToDictionary(item => item.Id);
var cartData = new JObject();
foreach (KeyValuePair<string, int> cartItem in cartItems)
{
if (selectedChoices.TryGetValue(cartItem.Key, out var selectedChoice))
{
cartData.Add(selectedChoice.Title ?? selectedChoice.Id,
$"{(selectedChoice.Price.Value is null ? "Any price" : $"{_displayFormatter.Currency((decimal)selectedChoice.Price.Value, settings.Currency, DisplayFormatter.CurrencyFormat.Symbol)}")} x {cartItem.Value} = {(selectedChoice.Price.Value is null ? "Any price" : $"{_displayFormatter.Currency(((decimal)selectedChoice.Price.Value) * cartItem.Value, settings.Currency, DisplayFormatter.CurrencyFormat.Symbol)}")}");
}
}
receiptData.Add("Cart", cartData);
}
if (appPosData.DiscountAmount > 0)
{
receiptData.Add("Discount",
$"{_displayFormatter.Currency(appPosData.DiscountAmount, settings.Currency, DisplayFormatter.CurrencyFormat.Symbol) } {(appPosData.DiscountPercentage > 0 ? $"({appPosData.DiscountPercentage}%)" : string.Empty)}");
}
if (appPosData.Tip > 0)
{
receiptData.Add("Tip",
$"{_displayFormatter.Currency(appPosData.Tip, settings.Currency, DisplayFormatter.CurrencyFormat.Symbol) }");
}
}
entity.Metadata.SetAdditionalData("receiptData", receiptData);
if (formResponseJObject is null) return;
var meta = entity.Metadata.ToJObject();
meta.Merge(formResponseJObject);

View File

@ -32,7 +32,7 @@
@if (!string.IsNullOrEmpty(Model.Action))
{
<form id="ConfirmForm" method="post" action="@Url.EnsureLocal(actionUrl, Context.Request)" rel="noreferrer noopener">
<form id="ConfirmForm" method="post" action="@Url.EnsureLocal(actionUrl)" rel="noreferrer noopener">
<div class="modal-body pt-0" id="ConfirmText" hidden>
<label for="ConfirmInput" class="form-label">Confirm the action by typing <strong id="ConfirmInputText"></strong>:</label>
<input id="ConfirmInput" class="form-control"/>

View File

@ -1,9 +1,8 @@
@using BTCPayServer.Views.Apps
@using BTCPayServer.Abstractions.Extensions
@using BTCPayServer.Views.CustodianAccounts
@using Microsoft.AspNetCore.Mvc.TagHelpers
@model BTCPayServer.Models.CustodianAccountViewModels.CreateCustodianAccountViewModel
@{
ViewData.SetActivePage( CustodianAccountsNavPages.Create, "Add a custodian account");
ViewData.SetActivePage(AppsNavPages.Create, "Add a custodian account");
}
@section PageFootContent {

View File

@ -1,10 +1,9 @@
@using BTCPayServer.Views.Apps
@using BTCPayServer.Abstractions.Extensions
@using BTCPayServer.Abstractions.Models
@using BTCPayServer.Views.CustodianAccounts
@using Microsoft.AspNetCore.Mvc.TagHelpers
@model BTCPayServer.Models.CustodianAccountViewModels.EditCustodianAccountViewModel
@{
ViewData.SetActivePage(CustodianAccountsNavPages.Update, "Edit Custodian account: " + @Model?.CustodianAccount.Name, Model?.CustodianAccount.Id);
ViewData.SetActivePage(AppsNavPages.Update, "Edit custodian account");
}
@section PageFootContent {

View File

@ -1,12 +1,10 @@
@using BTCPayServer.Views.Apps
@using BTCPayServer.Abstractions.Extensions
@using BTCPayServer.Abstractions.Custodians
@using BTCPayServer.Abstractions.TagHelpers
@using BTCPayServer.Views.CustodianAccounts
@using Microsoft.AspNetCore.Mvc.TagHelpers
@inject BTCPayServer.Security.ContentSecurityPolicies Csp
@model BTCPayServer.Models.CustodianAccountViewModels.ViewCustodianAccountViewModel
@{
ViewData.SetActivePage(CustodianAccountsNavPages.View, "Custodian account: " + @Model?.CustodianAccount.Name, Model.CustodianAccount.Id);
ViewData.SetActivePage(AppsNavPages.Create, "Custodian account: " + @Model?.CustodianAccount.Name);
Csp.UnsafeEval();
}

View File

@ -80,7 +80,7 @@
</div>
@if (Model.RequireConfirm)
{
<form id="RecoveryConfirmation" action="@Url.EnsureLocal(Model.ReturnUrl, Context.Request)" class="position-relative d-flex align-items-start justify-content-center" style="padding:20px 0 100px" rel="noreferrer noopener">
<form id="RecoveryConfirmation" action="@Url.EnsureLocal(Model.ReturnUrl)" class="position-relative d-flex align-items-start justify-content-center" style="padding:20px 0 100px" rel="noreferrer noopener">
<label class="form-check-label lead order-2" for="confirm">I have written down my recovery phrase and stored it in a secure location</label>
<input type="checkbox" class="me-3 order-1 form-check-input" id="confirm" style="margin-top:.35rem;flex-shrink:0">
<button type="submit" class="btn btn-primary btn-lg px-5 order-3" id="submit">Done</button>
@ -89,6 +89,6 @@
}
else
{
<a href="@Url.EnsureLocal(Model.ReturnUrl, Context.Request)" class="btn btn-primary btn-lg mt-3 px-5 order-3" id="proceed" rel="noreferrer noopener">Done</a>
<a href="@Url.EnsureLocal(Model.ReturnUrl)" class="btn btn-primary btn-lg mt-3 px-5 order-3" id="proceed" rel="noreferrer noopener">Done</a>
}
</main>

View File

@ -10,13 +10,13 @@
<form id="test-payment" :action="`/i/${invoiceId}/test-payment`" method="post" v-on:submit.prevent="handleFormSubmit($event, 'paying')" v-if="displayPayment">
<input name="CryptoCode" type="hidden" :value="cryptoCode">
<input name="PaymentMethodId" type="hidden" :value="paymentMethodId">
<label for="test-payment-amount" class="control-label form-label">Fake a {{cryptoCode}} payment for testing</label>
<label for="FakePayAmount" class="control-label form-label">Fake a {{cryptoCode}} payment for testing</label>
<div class="d-flex gap-2 mb-2">
<div class="input-group">
<input id="test-payment-amount" name="Amount" type="number" :step="isSats ? '1' : '0.00000001'" min="0" class="form-control" placeholder="Amount" v-model="amountRemaining" :disabled="paying || paymentMethodId === 'BTC_LightningLike'" />
<input id="FakePayAmount" name="Amount" type="number" :step="isSats ? '1' : '0.00000001'" min="0" class="form-control" placeholder="Amount" v-model="amountRemaining" :disabled="paying || paymentMethodId === 'BTC_LightningLike'"/>
<div id="test-payment-crypto-code" class="input-group-addon input-group-text" v-text="cryptoCode"></div>
</div>
<button class="btn btn-secondary flex-shrink-0 px-3 w-100px" type="submit" :disabled="paying" id="FakePayment">Pay</button>
<button class="btn btn-secondary flex-shrink-0 px-3 w-100px" type="submit" :disabled="paying" id="FakePay">Pay</button>
</div>
</form>
<form id="mine-block" :action="`/i/${invoiceId}/mine-blocks`" method="post" v-on:submit.prevent="handleFormSubmit($event, 'mining')" v-if="displayMine">
@ -26,7 +26,7 @@
<input id="BlockCount" name="BlockCount" type="number" step="1" min="1" class="form-control" value="1"/>
<div class="input-group-addon input-group-text">blocks</div>
</div>
<button class="btn btn-secondary flex-shrink-0 px-3 w-100px" type="submit" :disabled="mining" id="mine-block">Mine</button>
<button class="btn btn-secondary flex-shrink-0 px-3 w-100px" type="submit" :disabled="mining" id="Mine">Mine</button>
</div>
</form>
<form id="expire-invoice" :action="`/i/${invoiceId}/expire`" method="post" v-on:submit.prevent="handleFormSubmit($event, 'expiring')" v-if="displayExpire">

View File

@ -172,7 +172,7 @@
</div>
</div>
<div class="buttons">
<a v-if="srvModel.receiptLink" class="btn btn-primary rounded-pill w-100" :href="srvModel.receiptLink" :target="isModal ? '_top' : null" v-t="'view_receipt'" id="receipt-btn"></a>
<a v-if="srvModel.receiptLink" class="btn btn-primary rounded-pill w-100" :href="srvModel.receiptLink" :target="isModal ? '_top' : null" v-t="'view_receipt'" id="ReceiptLink"></a>
<a v-if="storeLink" class="btn btn-secondary rounded-pill w-100" :href="storeLink" :target="isModal ? '_top' : null" v-html="$t('return_to_store', { storeName: srvModel.storeName })" id="StoreLink"></a>
<button v-else-if="isModal" class="btn btn-secondary rounded-pill w-100" v-on:click="close" v-t="'Close'"></button>
</div>

View File

@ -19,16 +19,14 @@
: ''
});
delegate('click', '#Presets_InStore', e => {
$("#UseClassicCheckout").prop('checked', false);
$("#CheckoutV2Settings").addClass('show');
$("#ClassicCheckoutSettings").removeClass('show');
$("#UseNewCheckout").prop('checked', true);
$("#NewCheckoutSettings").addClass('show');
$("#ShowPayInWalletButton").prop('checked', false);
$("#ShowStoreHeader").prop('checked', false);
});
delegate('click', '#Presets_Online', e => {
$("#UseClassicCheckout").prop('checked', false);
$("#CheckoutV2Settings").addClass('show');
$("#ClassicCheckoutSettings").removeClass('show');
$("#UseNewCheckout").prop('checked', false);
$("#NewCheckoutSettings").removeClass('show');
$("#ShowPayInWalletButton").prop('checked', true);
$("#ShowStoreHeader").prop('checked', true);
});
@ -95,13 +93,22 @@
</div>
</h3>
<div class="d-flex align-items-center mb-4">
<input asp-for="UseClassicCheckout" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target=".checkout-settings" aria-expanded="@(Model.UseClassicCheckout)" aria-controls="CheckoutV2Settings" />
<label asp-for="UseClassicCheckout" class="form-label mb-0"></label>
<span asp-validation-for="UseClassicCheckout" class="text-danger"></span>
<div class="d-flex align-items-center mb-3">
<input asp-for="UseNewCheckout" type="checkbox" class="btcpay-toggle me-3" data-bs-toggle="collapse" data-bs-target=".checkout-settings" aria-expanded="@(Model.UseNewCheckout)" aria-controls="NewCheckoutSettings" />
<div>
<label asp-for="UseNewCheckout" class="d-flex align-items-center form-label">
Use the new checkout
<span class="badge bg-warning ms-2">Experimental</span>
</label>
<span asp-validation-for="UseNewCheckout" class="text-danger"></span>
<div class="form-text">
Since v1.7.0 a new version of the checkout is available. Note: For now, the new version is English-only.<br />
We are still collecting <a href="https://github.com/btcpayserver/btcpayserver/discussions/4308" target="_blank" rel="noreferrer noopener">feedback</a> and offer this as an opt-in feature.
</div>
</div>
</div>
<div class="checkout-settings collapse @(Model.UseClassicCheckout ? "" : "show")" id="CheckoutV2Settings">
<div class="checkout-settings collapse @(Model.UseNewCheckout ? "show" : "")" id="NewCheckoutSettings">
<div class="form-group">
<label asp-for="DisplayExpirationTimer" class="form-label"></label>
<div class="input-group">
@ -134,7 +141,7 @@
<input asp-for="LightningAmountInSatoshi" type="checkbox" class="form-check-input" />
<label asp-for="LightningAmountInSatoshi" class="form-check-label"></label>
</div>
<div class="checkout-settings collapse @(Model.UseClassicCheckout ? "show" : "")" id="ClassicCheckoutSettings">
<div class="checkout-settings collapse @(Model.UseNewCheckout ? "" : "show")" id="OldCheckoutSettings">
<div class="form-check">
<input asp-for="RequiresRefundEmail" type="checkbox" class="form-check-input" />
<label asp-for="RequiresRefundEmail" class="form-check-label"></label>

View File

@ -11,11 +11,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -13,11 +13,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -11,11 +11,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -77,11 +77,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -18,7 +18,7 @@
}
@section Navbar {
<a href="@Url.EnsureLocal(returnUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(returnUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -20,11 +20,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -11,11 +11,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -12,11 +12,11 @@
@section Navbar {
@if (backUrl != null)
{
<a href="@Url.EnsureLocal(backUrl, Context.Request)" id="GoBack">
<a href="@Url.EnsureLocal(backUrl)" id="GoBack">
<vc:icon symbol="back" />
</a>
}
<a href="@Url.EnsureLocal(cancelUrl, Context.Request)" id="CancelWizard" class="cancel">
<a href="@Url.EnsureLocal(cancelUrl)" id="CancelWizard" class="cancel">
<vc:icon symbol="close" />
</a>
}

View File

@ -123,20 +123,12 @@ new Vue({
if (this.hideDustAmounts) {
rows = rows.filter(function (row) {
return row.fiatValue === null || row.fiatValue > t.account.dustThresholdInFiat;
return row.fiatValue > t.account.dustThresholdInFiat;
});
}
rows = rows.sort(function (a, b) {
if(b.fiatValue !== null && a.fiatValue !== null){
return b.fiatValue - a.fiatValue;
}else if(b.fiatValue !== null && a.fiatValue === null){
return 1;
}else if(b.fiatValue === null && a.fiatValue !== null) {
return -1;
}else{
return b.asset.localeCompare(a.asset);
}
return b.fiatValue - a.fiatValue;
});
return rows;

View File

@ -34,10 +34,5 @@
"copy": "ቅጂ",
"copy_confirm": "ተቀድቷል",
"powered_by": "ተሰያትዎ በተጠቃሚዎች ላይ ያሉት",
"conversion_body": "ይህ አገልግሎት በ 3 ኛ ወገን ይቀርባል. እባክዎን ምን ያህል አገልግሎት ሰጪዎች ገንዘቡን እንደሚልኩ መቆጣጠር አለመቻላችንን ያስታውሱ. ደረሰኝ የተቆረጠለት ገንዘብ ከተቀበለ በኋላ ብቻ ነው {{cryptoCode}} Blockchain.",
"scanning_nfc": "ኤንክስፕ ማድረግ ...",
"submitting_nfc": "ኤንክስፕ ይግቡ ...",
"payment_received": "ክፍያ ተመልክቷል",
"payment_received_body": "የትእዛዝህ ክፍያ ተመልክቷል፣ እናንተ በአሁኑ ጊዜ ተጠቀሙ",
"payment_received_confirmations": "ከ {{cryptoCode}} ምርመራ በመታየት {{requiredConfirmations}} መረጃ ላይ የሚገኙት የማንኛውም ክፍያ የተከተሉ የሚከተለውን ክፍት ቀጠሮዎች ከሚከተሉት እቅድ ጋር ተጠቀሙ።"
"conversion_body": "ይህ አገልግሎት በ 3 ኛ ወገን ይቀርባል. እባክዎን ምን ያህል አገልግሎት ሰጪዎች ገንዘቡን እንደሚልኩ መቆጣጠር አለመቻላችንን ያስታውሱ. ደረሰኝ የተቆረጠለት ገንዘብ ከተቀበለ በኋላ ብቻ ነው {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "نسخ",
"copy_confirm": "تم النسخ",
"powered_by": "مدعوم بواسطة",
"conversion_body": "هذه الخدمة موفرة عن طريق طرف ثالث. يجب ان تضع في الإعتبار اننا غير مسؤلين عن كيف سيحول موفر الخدمة الأموال. الأموال ستكون ظاهر فقط في حين استلامها علي شبكة {{cryptoCode}}.",
"scanning_nfc": "مسح NFC ...",
"submitting_nfc": "إرسال NFC ...",
"payment_received": "تم الدفع",
"payment_received_body": "لقد تم استلام الدفع وجاري المعالجة الآن",
"payment_received_confirmations": "بمجرد استلام مدفوعاتك {{requiredConfirmations}} تأكيدًا على سلسلة كتل {{cryptoCode}} ، سيتم تسوية فاتورتك."
"conversion_body": "هذه الخدمة موفرة عن طريق طرف ثالث. يجب ان تضع في الإعتبار اننا غير مسؤلين عن كيف سيحول موفر الخدمة الأموال. الأموال ستكون ظاهر فقط في حين استلامها علي شبكة {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopyala",
"copy_confirm": "Kopyalandı",
"powered_by": "Tərəfindən təchiz edilmişdir",
"conversion_body": "Bu xidmət üçüncü tərəf vasitəsilə göstərilir. Unutmayın ki, təchizatçının sizin vəsaiti hansı formada köçürdüyünə biz nəzarət etmirik. Faktura {{cryptoCode}} vəsaitinin blokçeyn tərəfindən qəbul edildiyi zaman ödənilmiş olaraq işarələnəcək. ",
"scanning_nfc": "NFC skan edilir...",
"submitting_nfc": "NFC göndərilməkdədir...",
"payment_received": "Ödəniş qəbul edildi",
"payment_received_body": "Sizin ödənişiniz qəbul edildi və hazırda işlənir",
"payment_received_confirmations": "Sizin ödənişiniz {{cryptoCode}} blockchain-də {{requiredConfirmations}} təsdiqlənmə ilə qəbul ediləcəkdir."
"conversion_body": "Bu xidmət üçüncü tərəf vasitəsilə göstərilir. Unutmayın ki, təchizatçının sizin vəsaiti hansı formada köçürdüyünə biz nəzarət etmirik. Faktura {{cryptoCode}} vəsaitinin blokçeyn tərəfindən qəbul edildiyi zaman ödənilmiş olaraq işarələnəcək. "
}

View File

@ -34,10 +34,5 @@
"copy": "Копирай",
"copy_confirm": "Копирано",
"powered_by": "Задвижвано от",
"conversion_body": "Този сервиз за предлага от трето лице. Моля дръжте в предвид, че ние нямаме контрол как доставчикът препраща вашите средства. Фактурата ще бъде маркирана като платена само, когато средствата са получени на {{cryptoCode}} блок веригата.",
"scanning_nfc": "Сканиране на NFC...",
"submitting_nfc": "Изпращане на NFC...",
"payment_received": "Получено плащане.",
"payment_received_body": "Вашето плащане е получено и в момента се обработва",
"payment_received_confirmations": "След като плащането ви получи {{requiredConfirmations}} потвърждения във веригата на блокове на {{cryptoCode}}, вашата фактура ще бъде платена."
"conversion_body": "Този сервиз за предлага от трето лице. Моля дръжте в предвид, че ние нямаме контрол как доставчикът препраща вашите средства. Фактурата ще бъде маркирана като платена само, когато средствата са получени на {{cryptoCode}} блок веригата."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiraj",
"copy_confirm": "Kopirano",
"powered_by": "Pokreće",
"conversion_body": "Koristite servis 3. strane. Molimo vas da imate na umu da mi nemamo kontrolu kako drugi provajderi proslijeđuju vaša sredstva. Predračun će biti markiran kao plaćen nakon što su sredstva primljena na {{cryptoCode}} Blockchain.",
"scanning_nfc": "Skeniranje NFC-a...",
"submitting_nfc": "Slanje NFC-a...",
"payment_received": "Plaćanje primljeno",
"payment_received_body": "Vaša uplata je primljena i sada se obrađuje",
"payment_received_confirmations": "Nakon što Vaša uplata dobije {{requiredConfirmations}} potvrde na {{cryptoCode}} blockchain-u, Vaš račun će biti namiren."
"conversion_body": "Koristite servis 3. strane. Molimo vas da imate na umu da mi nemamo kontrolu kako drugi provajderi proslijeđuju vaša sredstva. Predračun će biti markiran kao plaćen nakon što su sredstva primljena na {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "Copia",
"copy_confirm": "Copiat",
"powered_by": "Propulsat per",
"conversion_body": "Aquest servei el proveeix un tercer. Si us plau, teniu en ment que no tenim control sobre com reenviaran el proveidors els fons. Els rebuts seran marcats com a pagats una vegada els fons seran rebuts al Blockchain de {{cryptoCode}} .",
"scanning_nfc": "Escanejant NFC...",
"submitting_nfc": "Enviant NFC...",
"payment_received": "Pagament rebut",
"payment_received_body": "El seu pagament ha estat rebut i ara s'està processant",
"payment_received_confirmations": "Un cop el vostre pagament hagi rebut {{requiredConfirmations}} confirmacions a la cadena de blocs {{cryptoCode}}, la vostra factura es liquidarà."
"conversion_body": "Aquest servei el proveeix un tercer. Si us plau, teniu en ment que no tenim control sobre com reenviaran el proveidors els fons. Els rebuts seran marcats com a pagats una vegada els fons seran rebuts al Blockchain de {{cryptoCode}} ."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopírovat",
"copy_confirm": "Zkopírováno",
"powered_by": "Poháněno pomocí",
"conversion_body": "Tato služba je poskytována třetí stranou. Prosíme mějte na paměti, že nemáme žádnou kontrolu nad tím, jak poskytovatelé budou nakládat s vašimi prostředky. Faktura bude označena jako zaplacena, pouze když jsou prostředky obdrženy v {{cryptoCode}} Blockchainu.",
"scanning_nfc": "Skenování NFC...",
"submitting_nfc": "Odesílání NFC...",
"payment_received": "Platba přijata",
"payment_received_body": "Vaše platba byla přijata a nyní se zpracovává",
"payment_received_confirmations": "Jakmile vaše platba obdrží {{requiredConfirmations}} potvrzení na blockchainu {{cryptoCode}}, vaše faktura bude uhrazena."
"conversion_body": "Tato služba je poskytována třetí stranou. Prosíme mějte na paměti, že nemáme žádnou kontrolu nad tím, jak poskytovatelé budou nakládat s vašimi prostředky. Faktura bude označena jako zaplacena, pouze když jsou prostředky obdrženy v {{cryptoCode}} Blockchainu."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopier",
"copy_confirm": "Kopieret",
"powered_by": "Drevet af",
"conversion_body": "Denne service er stillet til rådighed af 3. Partnere. Vær venligst opmærksom på, at vi ikke har kontrol over, hvordan udbydere vil videresende dine midler. Fakturaen vil kun blive markeret betalt, når der er modtaget midler på {{cryptoCode}} Blockchain.",
"scanning_nfc": "Scanner NFC ...",
"submitting_nfc": "Indsend NFC ...",
"payment_received": "Betaling modtaget",
"payment_received_body": "Din betaling er modtaget og behandles nu",
"payment_received_confirmations": "Når din betaling har modtaget {{requiredConfirmations}} bekræftelser på {{cryptoCode}} blockchain, vil din faktura blive afregnet."
"conversion_body": "Denne service er stillet til rådighed af 3. Partnere. Vær venligst opmærksom på, at vi ikke har kontrol over, hvordan udbydere vil videresende dine midler. Fakturaen vil kun blive markeret betalt, når der er modtaget midler på {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopieren",
"copy_confirm": "Kopiert",
"powered_by": "",
"conversion_body": "Sie können {{btcDue}} {{cryptoCode}} mit Altcoins bezahlen, die vom Händler nicht direkt unterstützt werden. Dieser Service wird von einem Drittanbieter bereitgestellt. Bitte beachten Sie, dass wir keine Kontrolle darüber haben, wie Anbieter Ihre Gelder weiterleiten werden. Die Rechnung wird erst als bezahlt markiert, wenn die Gelder auf der {{cryptoCode}} Blockchain eingegangen sind.",
"scanning_nfc": "NFC-Scan durchführen ...",
"submitting_nfc": "NFC-Übermittlung ...",
"payment_received": "Zahlung erhalten",
"payment_received_body": "Ihre Zahlung wurde erhalten und wird nun verarbeitet",
"payment_received_confirmations": "Sobald Ihre Zahlung {{requiredConfirmations}} Bestätigungen auf der {{cryptoCode}}-Blockchain erhalten hat, wird Ihre Rechnung beglichen sein."
"conversion_body": "Sie können {{btcDue}} {{cryptoCode}} mit Altcoins bezahlen, die vom Händler nicht direkt unterstützt werden. Dieser Service wird von einem Drittanbieter bereitgestellt. Bitte beachten Sie, dass wir keine Kontrolle darüber haben, wie Anbieter Ihre Gelder weiterleiten werden. Die Rechnung wird erst als bezahlt markiert, wenn die Gelder auf der {{cryptoCode}} Blockchain eingegangen sind."
}

View File

@ -34,10 +34,5 @@
"copy": "Αντιγραφή",
"copy_confirm": "Αντιγράφηκε",
"powered_by": "Κινούμενο από",
"conversion_body": "Αυτή η υπηρεσία παρέχεται απο 3ο μέρος. Παρακαλούμε έχετε υπ'όψιν σας πως δεν έχουμε κανένα απολύτως έλεγχο στο πώς οι πάροχοι πληρωμών θα προωθήσουν την πληρωμή σας. Το παραστατικό πληρωμής θα καταχωρηθεί ώς πληρωμένο μόνο όταν τα νομίσματα εμφανιστούν στη Blockchain του {{cryptoCode}}.",
"scanning_nfc": "Σάρωση NFC...",
"submitting_nfc": "Υποβολή NFC...",
"payment_received": "Η πληρωμή ελήφθη",
"payment_received_body": "Η πληρωμή σας έχει εληφθεί και επεξεργάζεται τώρα",
"payment_received_confirmations": "Μόλις η πληρωμή σας λάβει {{requiredConfirmations}} επιβεβαιώσεις στο blockchain {{cryptoCode}}, η τιμολόγησή σας θα εξοφληθεί."
"conversion_body": "Αυτή η υπηρεσία παρέχεται απο 3ο μέρος. Παρακαλούμε έχετε υπ'όψιν σας πως δεν έχουμε κανένα απολύτως έλεγχο στο πώς οι πάροχοι πληρωμών θα προωθήσουν την πληρωμή σας. Το παραστατικό πληρωμής θα καταχωρηθεί ώς πληρωμένο μόνο όταν τα νομίσματα εμφανιστούν στη Blockchain του {{cryptoCode}}."
}

View File

@ -30,7 +30,7 @@
"payment_link": "Payment Link",
"payment_received": "Payment Received",
"payment_received_body": "Your payment has been received and is now processing.",
"payment_received_confirmations": "Once your payment has received {{requiredConfirmations}} confirmations on the {{cryptoCode}} blockchain, your invoice will be settled.",
"payment_received_confirmations": "Currently it has {{receivedConfirmations}} confirmations. Once it receives {{requiredConfirmations}} confirmations on the {{cryptoCode}} blockchain, the status will be updated to settled.",
"invoice_paid": "Invoice Paid",
"invoice_expired": "Invoice Expired",
"invoice_expired_body": "An invoice is only valid for {{minutes}} minutes.\n\nReturn to {{storeName}} if you would like to resubmit a payment.",
@ -40,4 +40,4 @@
"copy_confirm": "Copied",
"powered_by": "Powered by",
"conversion_body": "This service is provided by 3rd party. Please keep in mind that we have no control over how providers will forward your funds. Invoice will only be marked paid once funds are received on the {{cryptoCode}} blockchain."
}
}

View File

@ -34,10 +34,5 @@
"copy": "Copiar",
"copy_confirm": "Copiado",
"powered_by": "Proporcionado por",
"conversion_body": "Este servicio es prestado por terceros. Ten en cuenta que no tenemos control sobre el reenvío de tus fondos. La factura solo se marcará como pagada una vez se reciban los fondos en la cadena de bloques de {{cryptoCode}}.",
"scanning_nfc": "Escaneando NFC...",
"submitting_nfc": "Enviando NFC...",
"payment_received": "Pago recibido",
"payment_received_body": "Su pago ha sido recibido y se está procesando en este momento",
"payment_received_confirmations": "Una vez que tu pago haya recibido {{requiredConfirmations}} confirmaciones en la cadena de bloques {{cryptoCode}}, se liquidará tu factura."
"conversion_body": "Este servicio es prestado por terceros. Ten en cuenta que no tenemos control sobre el reenvío de tus fondos. La factura solo se marcará como pagada una vez se reciban los fondos en la cadena de bloques de {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "کپی",
"copy_confirm": "کپی شده",
"powered_by": "قدرت گرفته از",
"conversion_body": "این سرویس توسط شخص سوم فراهم شده است. لطفا در نظر داشته باشید ما کنترلی در نحوه ارسال پول شما توسط آنها را نداریم. زمانی که ما {{cryptoCode}} در بلاکچین دریافت کنیم درخواست شما پرداخته شده محسوب می شود.",
"scanning_nfc": "اسکن NFC ...",
"submitting_nfc": "ثبت NFC ...",
"payment_received": "پرداخت دریافت شد",
"payment_received_body": "پرداخت شما دریافت شده و در حال پردازش است",
"payment_received_confirmations": "با دریافت {{requiredConfirmations}} تأییدیه بر روی بلاکچین {{cryptoCode}}، فاکتور شما پرداخت خواهد شد."
"conversion_body": "این سرویس توسط شخص سوم فراهم شده است. لطفا در نظر داشته باشید ما کنترلی در نحوه ارسال پول شما توسط آنها را نداریم. زمانی که ما {{cryptoCode}} در بلاکچین دریافت کنیم درخواست شما پرداخته شده محسوب می شود."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopioi",
"copy_confirm": "Kopioitu",
"powered_by": "Toimittaa",
"conversion_body": "Tämän palvelun tarjoaa 3:s osapuoli. Huomioithan, että emme pysty kontrolloimaan miten nämä palveluntarjoajat käsittelevät varojasi. Lasku merkitään maksetuksi, vasta kun varat on vastaanotettu {{cryptoCode}} lohkoketjussa.",
"scanning_nfc": "Skannataan NFC...",
"submitting_nfc": "Lähetetään NFC...",
"payment_received": "Maksu vastaanotettu",
"payment_received_body": "Maksusi on vastaanotettu ja sitä käsitellään parhaillaan",
"payment_received_confirmations": "Kun maksusi on vastaanotettu {{requiredConfirmations}} vahvistuksella {{cryptoCode}} lohkoketjussa, laskusi suoritetaan."
"conversion_body": "Tämän palvelun tarjoaa 3:s osapuoli. Huomioithan, että emme pysty kontrolloimaan miten nämä palveluntarjoajat käsittelevät varojasi. Lasku merkitään maksetuksi, vasta kun varat on vastaanotettu {{cryptoCode}} lohkoketjussa."
}

View File

@ -34,10 +34,5 @@
"copy": "Copier",
"copy_confirm": "Copié",
"powered_by": "Propulsé par",
"conversion_body": "Ce service est fourni par un tiers. Nous navons aucun contrôle sur la façon dont seront traités vos fonds. La facture sera considérée payée seulement quand les fonds seront reçus sur la blockchain {{ cryptoCode }}.",
"payment_received": "Paiement reçu",
"payment_received_body": "Votre paiement a été reçu et est en cours de traitement",
"scanning_nfc": "Numérisation NFC en cours...",
"submitting_nfc": "Soumission NFC en cours...",
"payment_received_confirmations": "Une fois que votre paiement aura reçu {{requiredConfirmations}} confirmations sur la blockchain {{cryptoCode}}, votre facture sera réglée."
"conversion_body": "Ce service est fourni par un tiers. Nous navons aucun contrôle sur la façon dont seront traités vos fonds. La facture sera considérée payée seulement quand les fonds seront reçus sur la blockchain {{ cryptoCode }}."
}

View File

@ -34,10 +34,5 @@
"copy": "העתקה",
"copy_confirm": "הועתק",
"powered_by": "מופעל על ידי",
"conversion_body": "שירות זה מסופק על ידי צד שלישי. זכרו שאין לנו שליטה על איך ספקים יעבירו את הכסף שלכם. החשבונית תסומן כשולמה כאשר הכספים מתקבלים על שרשרת הבלוקים של {{cryptocode}}.",
"scanning_nfc": "סריקת NFC...",
"submitting_nfc": "שליחת NFC...",
"payment_received": "התשלום התקבל",
"payment_received_body": "התשלום שלך התקבל ומעובד כעת",
"payment_received_confirmations": "כאשר התשלום שלך יקבל {{requiredConfirmations}} אישורים בצד שרת ה- blockchain של {{cryptoCode}}, החשבונית שלך תישוב."
"conversion_body": "שירות זה מסופק על ידי צד שלישי. זכרו שאין לנו שליטה על איך ספקים יעבירו את הכסף שלכם. החשבונית תסומן כשולמה כאשר הכספים מתקבלים על שרשרת הבלוקים של {{cryptocode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "कॉपी करें",
"copy_confirm": "कॉपी किया गया",
"powered_by": "द्वारा संचालित",
"conversion_body": "यह सेवा तीसरी पार्टी द्वारा प्रदान की जाती है। कृपया ध्यान रखें कि प्रदाता आपके धन को कैसे आगे बढ़ाएंगे इस पर हमारा कोई नियंत्रण नहीं है। केवल {{cryptoCode}} ब्लॉकचेन पर धन प्राप्त होने के बाद ही चालान का भुगतान माना जाएगा।.",
"scanning_nfc": "एनएफसी स्कैन कर रहा है ...",
"submitting_nfc": "एनएफसी जमा कर रहा है ...",
"payment_received": "भुगतान प्राप्त हुआ",
"payment_received_body": "आपका भुगतान प्राप्त हो गया है और अब प्रोसेस हो रहा है।",
"payment_received_confirmations": "जब आपके भुगतान को {{cryptoCode}} ब्लॉकचेन पर {{requiredConfirmations}} पुष्टिकरण मिल जाएंगे, तब आपका चालान समाप्त हो जाएगा।"
"conversion_body": "यह सेवा तीसरी पार्टी द्वारा प्रदान की जाती है। कृपया ध्यान रखें कि प्रदाता आपके धन को कैसे आगे बढ़ाएंगे इस पर हमारा कोई नियंत्रण नहीं है। केवल {{cryptoCode}} ब्लॉकचेन पर धन प्राप्त होने के बाद ही चालान का भुगतान माना जाएगा।."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiraj",
"copy_confirm": "Kopirano",
"powered_by": "Pokreće ga (Powered by)",
"conversion_body": "Ovu usluga pruža treća strana. Vodite računa da nemamo kontroli nad načinom kako će Vam davatelji usluge proslijediti sredstva. Vodite računa da je račun plaćen tek kada su primljena sredstva na {{cryptoCode}} Blockchainu.",
"scanning_nfc": "Skeniranje NFC-a...",
"submitting_nfc": "Slanje NFC-a...",
"payment_received": "Plaćanje primljeno",
"payment_received_body": "Vaša uplata je zaprimljena i sada se obrađuje",
"payment_received_confirmations": "Nakon što Vaša uplata primi {{requiredConfirmations}} potvrda na {{cryptoCode}} blockchain-u, Vaš će račun biti namiren."
"conversion_body": "Ovu usluga pruža treća strana. Vodite računa da nemamo kontroli nad načinom kako će Vam davatelji usluge proslijediti sredstva. Vodite računa da je račun plaćen tek kada su primljena sredstva na {{cryptoCode}} Blockchainu."
}

View File

@ -34,10 +34,5 @@
"copy": "Másolás",
"copy_confirm": "Másolva",
"powered_by": "Powered by / Működtető:",
"conversion_body": "Ezt a szolgáltatást harmadik fél nyújtja. Kérjük figyelembe venni, hogy nem áll módunkban befolyásolni a szolgáltatók hogyan fogják továbbítani a pénzét. A számla csak akkor lesz fizetettként jelölve, miután a tranzakciója megérkezett a {{cryptoCode}} Blockchain-re. ",
"scanning_nfc": "NFC szkennelése...",
"submitting_nfc": "NFC küldése...",
"payment_received": "Fizetés fogadva",
"payment_received_body": "A fizetésed megérkezett és feldolgozás alatt áll",
"payment_received_confirmations": "Amint a fizetésed {{requiredConfirmations}} megerősítést kapott a(z) {{cryptoCode}} blokkláncban, az áfád rendezve lesz."
"conversion_body": "Ezt a szolgáltatást harmadik fél nyújtja. Kérjük figyelembe venni, hogy nem áll módunkban befolyásolni a szolgáltatók hogyan fogják továbbítani a pénzét. A számla csak akkor lesz fizetettként jelölve, miután a tranzakciója megérkezett a {{cryptoCode}} Blockchain-re. "
}

View File

@ -34,10 +34,5 @@
"copy": "Պատճենել",
"copy_confirm": "Պատճենված է ",
"powered_by": "Էլեկտրատեսիլի միջոցով",
"conversion_body": "Այս ծառայությունը մատուցվում է 3-րդ կողմից: Խնդրում ենք նկատի ունենալ, որ մենք վերահսկողություն չունենք, թե ինչպես են մատակարարները փոխանցում ձեր միջոցները: Հաշիվը կհամարվի վճարված միայն {{cryptoCode}} Blockchain -ում միջոցները ստանալուց։",
"scanning_nfc": "NFC-ի սկանների ընթացքում ...",
"submitting_nfc": "NFC-ի ներկայացումը ...",
"payment_received": "Վճարումը ստացված է",
"payment_received_body": "Ձեր վճարումը ստացվել է և ներկայացում է մշակվում",
"payment_received_confirmations": "Ձեր վճարումը հաստատվելուց {{requiredConfirmations}} հաստատումներից հետո {{cryptoCode}} բլոկցային, ձեր հաշիվը կտեղափոխվի:"
"conversion_body": "Այս ծառայությունը մատուցվում է 3-րդ կողմից: Խնդրում ենք նկատի ունենալ, որ մենք վերահսկողություն չունենք, թե ինչպես են մատակարարները փոխանցում ձեր միջոցները: Հաշիվը կհամարվի վճարված միայն {{cryptoCode}} Blockchain -ում միջոցները ստանալուց։"
}

View File

@ -34,10 +34,5 @@
"copy": "Salinan",
"copy_confirm": "Disalin",
"powered_by": "Disediakan oleh",
"conversion_body": "Layanan ini disediakan oleh pihak ke-3. Harap diingat bahwa kami tidak memiliki kendali atas bagaimana penyedia layanan akan meneruskan dana Anda. Tagihan anda hanya akan ditandai dibayar setelah dana diterima di {{cryptoCode}} Blockchain.",
"scanning_nfc": "Memindai NFC...",
"submitting_nfc": "Mengirim NFC...",
"payment_received": "Pembayaran Diterima",
"payment_received_body": "Pembayaran Anda telah diterima dan sedang diproses",
"payment_received_confirmations": "Setelah pembayaran Anda menerima {{requiredConfirmations}} konfirmasi pada blockchain {{cryptoCode}}, faktur Anda akan diselesaikan."
"conversion_body": "Layanan ini disediakan oleh pihak ke-3. Harap diingat bahwa kami tidak memiliki kendali atas bagaimana penyedia layanan akan meneruskan dana Anda. Tagihan anda hanya akan ditandai dibayar setelah dana diterima di {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "Afrita",
"copy_confirm": "Afritað",
"powered_by": "Keyrt með",
"conversion_body": "Þessi þjónusta er veitt af þriðja aðila. Mundu að við höfum ekki stjórn á því hvað þeir gera við peningana. Reikningurinn verður aðeins móttekinn þegar {{cryptoCode}} greiðslan hefur verið staðfest á netinu.",
"scanning_nfc": "Skanna NFC …",
"submitting_nfc": "Sendi NFC …",
"payment_received": "Greiðsla móttekin",
"payment_received_body": "Greiðslan þín hefur verið móttekin og er nú í vinnslu",
"payment_received_confirmations": "Þegar greiðslan þín hefur fengið {{requiredConfirmations}} staðfestingar á {{cryptoCode}} blokkkeðjunni, mun reikningurinn þinn verða afhentur."
"conversion_body": "Þessi þjónusta er veitt af þriðja aðila. Mundu að við höfum ekki stjórn á því hvað þeir gera við peningana. Reikningurinn verður aðeins móttekinn þegar {{cryptoCode}} greiðslan hefur verið staðfest á netinu."
}

View File

@ -34,10 +34,5 @@
"copy": "Copia",
"copy_confirm": "Copiato",
"powered_by": "Fornito da",
"conversion_body": "Questo servizio è fornito da 3° parti. Ricorda che non abbiamo alcun controllo su come tali parti inoltreranno i tuoi fondi. La fattura verrà contrassegnata come pagata solo dopo aver ricevuto i fondi sulla {{cryptoCode}} Blockchain.",
"scanning_nfc": "Scansione NFC in corso...",
"submitting_nfc": "Invio NFC in corso...",
"payment_received": "Pagamento ricevuto",
"payment_received_body": "Il tuo pagamento è stato ricevuto ed è in fase di elaborazione",
"payment_received_confirmations": "Una volta che il tuo pagamento avrà ricevuto {{requiredConfirmations}} conferme sulla blockchain {{cryptoCode}}, la tua fattura verrà saldata."
"conversion_body": "Questo servizio è fornito da 3° parti. Ricorda che non abbiamo alcun controllo su come tali parti inoltreranno i tuoi fondi. La fattura verrà contrassegnata come pagata solo dopo aver ricevuto i fondi sulla {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "コピー",
"copy_confirm": "コピーしました",
"powered_by": "Powered by (提供元)",
"conversion_body": "ただし、この変換は第三者サービスによるものですので、お店が受け付けている通貨で着金するまでの間の処理に関しては何の保証もいたしません。変換後に受付中の通貨 ({{cryptoCode}}) がお店に着金してから支払い済みとなりますのでご了承ください。",
"scanning_nfc": "NFCをスキャンしています…",
"submitting_nfc": "NFCを送信しています…",
"payment_received": "支払いが受領されました",
"payment_received_body": "お支払いを受け付けました。現在処理中です",
"payment_received_confirmations": "{{cryptoCode}}ブロックチェーン上で{{requiredConfirmations}}回の承認が完了すると、支払いが完了し、請求書が決済されます。"
"conversion_body": "ただし、この変換は第三者サービスによるものですので、お店が受け付けている通貨で着金するまでの間の処理に関しては何の保証もいたしません。変換後に受付中の通貨 ({{cryptoCode}}) がお店に着金してから支払い済みとなりますのでご了承ください。"
}

View File

@ -34,10 +34,5 @@
"copy": "კოპირება",
"copy_confirm": "დაკოპირებულია",
"powered_by": "მძიმე მიერ",
"conversion_body": "ეს სერვისი მოსწონს სამეწარმეოს მესამე მხარეს. გთხოვთ გაითვალისწინოთ, რომ ჩვენ არ ვაქტიურებთ ამის დამატებას, როგორც სამსახურის მსახიობათა შემთხვევაში. ინვოისი მონაცემების მიღების შემდეგ {{cryptoCode}} ბლოკებზე მიღებული ფონდების შემცირებით იქნება მხოლოდ გადახდული.",
"scanning_nfc": "NFC-ს სკანირება...",
"submitting_nfc": "NFC-ის წარდგენა...",
"payment_received": "გადახდა მიღებულია",
"payment_received_body": "თქვენი გადახდა მიღებულია და ახლა მუშაობს",
"payment_received_confirmations": "როდესაც {{cryptoCode}} ბლოკტამის {{requiredConfirmations}} დამონაწილება მიიღება, თქვენი ინვოისი დადასტურდება."
"conversion_body": "ეს სერვისი მოსწონს სამეწარმეოს მესამე მხარეს. გთხოვთ გაითვალისწინოთ, რომ ჩვენ არ ვაქტიურებთ ამის დამატებას, როგორც სამსახურის მსახიობათა შემთხვევაში. ინვოისი მონაცემების მიღების შემდეგ {{cryptoCode}} ბლოკებზე მიღებული ფონდების შემცირებით იქნება მხოლოდ გადახდული."
}

View File

@ -34,10 +34,5 @@
"copy": "Көшіру",
"copy_confirm": "Көшірілді",
"powered_by": "Құралдарымен қамтамасыз етілген",
"conversion_body": "Бұл қызмет үшінші тараптан қамтамасыз етіледі. Сіздің ақшаңызды провайдерлер сізге қалай жеткізетінін біз бақылауға алмайтынымызды есте сақтауыңызды сұраймыз. Шот тек қана {{cryptoCode}} Blockchain жүйесі қаражаттырылған соң көрсетіледі.",
"scanning_nfc": "NFC сканерлеу ...",
"submitting_nfc": "NFC жіберу ...",
"payment_received": "Төлем қабылданды",
"payment_received_body": "Сіздің төлеміңіз қабылданды және осы жағдайда өңдеуі жүргізілуде",
"payment_received_confirmations": "Өтінішіңіз {{cryptoCode}} блокшотында {{requiredConfirmations}} растау алынғаннан кейін, сіздің счетіңіз төленеді."
"conversion_body": "Бұл қызмет үшінші тараптан қамтамасыз етіледі. Сіздің ақшаңызды провайдерлер сізге қалай жеткізетінін біз бақылауға алмайтынымызды есте сақтауыңызды сұраймыз. Шот тек қана {{cryptoCode}} Blockchain жүйесі қаражаттырылған соң көрсетіледі."
}

View File

@ -34,10 +34,5 @@
"copy": "복사",
"copy_confirm": "복사 완료",
"powered_by": "제공:",
"conversion_body": "이 서비스는 제 3자에서 제공됩니다. 공급자가 귀하의 자금을 어떻게 전달할지에 대해 우리가 제어할 수 없음을 염두에 두십시오. 자금이 {{cryptoCode}} 블록체인에 수신되면 청구서가 지불 완료로 표시됩니다.",
"scanning_nfc": "NFC를 스캔 중...",
"submitting_nfc": "NFC를 제출 중...",
"payment_received": "결제가 완료되었습니다",
"payment_received_body": "결제가 완료되어 처리 중입니다",
"payment_received_confirmations": "{{requiredConfirmations}} 개의 확인이 {{cryptoCode}} 블록체인 상에서 수신되면, 고객님의 청구서가 처리됩니다."
"conversion_body": "이 서비스는 제 3자에서 제공됩니다. 공급자가 귀하의 자금을 어떻게 전달할지에 대해 우리가 제어할 수 없음을 염두에 두십시오. 자금이 {{cryptoCode}} 블록체인에 수신되면 청구서가 지불 완료로 표시됩니다."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopēt",
"copy_confirm": "Nokopēts",
"powered_by": "Darbojas ar",
"conversion_body": "Šo pakalpojumu nodrošina starpnieks. Ņemiet vērā, kā mēs nekādā veidā nekontrolējam maksājuma norisi. Rēķins tiks atzīmēts kā samaksāts tikai tad, kad līdzekļi būs saņemti {{cryptoCode}} blokķēdē.",
"scanning_nfc": "Skenēju NFC ...",
"submitting_nfc": "Iesniegšana NFC ...",
"payment_received": "Saņemta maksājuma informācija",
"payment_received_body": "Jūsu maksājums ir saņemts un tagad tiek apstrādāts",
"payment_received_confirmations": "Kad jūsu maksājums ir saņēmis {{requiredConfirmations}} apstiprinājumus {{cryptoCode}} blokķēdē, jūsu rēķins tiks apmaksāts."
"conversion_body": "Šo pakalpojumu nodrošina starpnieks. Ņemiet vērā, kā mēs nekādā veidā nekontrolējam maksājuma norisi. Rēķins tiks atzīmēts kā samaksāts tikai tad, kad līdzekļi būs saņemti {{cryptoCode}} blokķēdē."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiëren",
"copy_confirm": "Gekopieerd",
"powered_by": "Mogelijk gemaakt door",
"conversion_body": "Deze dienst wordt door een 3e partij geleverd. Wij hebben daardoor geen zicht op uw fondsen. De factuur wordt pas als betaald beschouwd, wanneer de fondsen door de {{ cryptoCode }} blockchain aanvaard zijn.",
"scanning_nfc": "Scannen van NFC ...",
"submitting_nfc": "Indienen van NFC ...",
"payment_received": "Betaling ontvangen",
"payment_received_body": "Uw betaling is ontvangen en wordt nu verwerkt",
"payment_received_confirmations": "Zodra uw betaling {{requiredConfirmations}} bevestigingen heeft ontvangen op de {{cryptoCode}} blockchain, zal uw factuur worden voldaan."
"conversion_body": "Deze dienst wordt door een 3e partij geleverd. Wij hebben daardoor geen zicht op uw fondsen. De factuur wordt pas als betaald beschouwd, wanneer de fondsen door de {{ cryptoCode }} blockchain aanvaard zijn."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopier",
"copy_confirm": "Kopiert",
"powered_by": "Drevet av",
"conversion_body": "Denne tjenesten håndteres av tredjepartstilbydere.\nHusk at vi har ingen kontroll over hvordan tilbyderene vil sende deg dine penger. Fakturaen blir ikke markert betalt før pengene har blitt mottatt på blokkkjeden til {{cryptoCode}}.",
"scanning_nfc": "Skanner NFC ...",
"submitting_nfc": "Sender NFC ...",
"payment_received": "Betaling mottatt",
"payment_received_body": "Din betaling har blitt mottatt og blir nå behandlet",
"payment_received_confirmations": "Når betalingen din har mottatt {{requiredConfirmations}} bekreftelser på {{cryptoCode}} blockchain, vil fakturaen din bli oppgjort."
"conversion_body": "Denne tjenesten håndteres av tredjepartstilbydere.\nHusk at vi har ingen kontroll over hvordan tilbyderene vil sende deg dine penger. Fakturaen blir ikke markert betalt før pengene har blitt mottatt på blokkkjeden til {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "कापी",
"copy_confirm": "प्रतिलिपि गरियो",
"powered_by": "प्रबिधित by",
"conversion_body": "यो सेवा तेस्रो पार्टी द्वारा प्रदान गरिएको छ। कृपया ध्यान राख्नुहोस् कि हामीसँग कुनै नियन्त्रण छैन कि कसरी प्रदायकहरूले तपाईंको रकम अगाडि बढ्नेछन्। रकम प्राप्त {{cryptoCode}} Blockchain भएको बेलामा इनभ्वाइस मात्र भुक्तानी चिन्ह लगाइनेछ",
"scanning_nfc": "एनएफसी स्क्यान गर्दै...",
"submitting_nfc": "एनएफसी पेश गर्दै...",
"payment_received": "भुक्तानी प्राप्त भयो",
"payment_received_body": "तपाईंको भुक्तान गरिएको छ र अब प्रक्रिया हुँदै छ।",
"payment_received_confirmations": "तपाईंको भुक्तान {{cryptoCode}} ब्लकचेनमा {{requiredConfirmations}} पुष्टिकरणहरु प्राप्त भएपछि, तपाईंको चलान समाप्त हुनेछ।"
"conversion_body": "यो सेवा तेस्रो पार्टी द्वारा प्रदान गरिएको छ। कृपया ध्यान राख्नुहोस् कि हामीसँग कुनै नियन्त्रण छैन कि कसरी प्रदायकहरूले तपाईंको रकम अगाडि बढ्नेछन्। रकम प्राप्त {{cryptoCode}} Blockchain भएको बेलामा इनभ्वाइस मात्र भुक्तानी चिन्ह लगाइनेछ"
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiuj",
"copy_confirm": "Skopiowano",
"powered_by": "Napędzane przez",
"conversion_body": "Ten serwis prowadzony jest przez trzecią stronę. Proszę pamiętać, że nie mamy kontroli nad tym jak dostawcy przekażą Twoje fundusze. Płatność będzie uznana za opłaconą, tylko gdy otrzymane zostaną na blockchainie {{cryptoCode}}.",
"scanning_nfc": "Skanowanie NFC...",
"submitting_nfc": "Przesyłanie NFC...",
"payment_received": "Płatność otrzymana",
"payment_received_body": "Twoja płatność została odebrana i jest teraz przetwarzana",
"payment_received_confirmations": "Kiedy Twoja płatność otrzyma {{requiredConfirmations}} potwierdzeń na łańcuchu bloków {{cryptoCode}}, Twoja faktura zostanie uregulowana."
"conversion_body": "Ten serwis prowadzony jest przez trzecią stronę. Proszę pamiętać, że nie mamy kontroli nad tym jak dostawcy przekażą Twoje fundusze. Płatność będzie uznana za opłaconą, tylko gdy otrzymane zostaną na blockchainie {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "Copiar",
"copy_confirm": "Copiado",
"powered_by": "Desenvolvido por",
"conversion_body": "Esse serviço é oferecido por terceiros. Por favor, tenha em mente que não temos nenhum controle sobre como seus fundos serão utilizados. A fatura apenas será marcada como paga quando os fundos forem recebidos na Blockchain {{cryptoCode}}.",
"scanning_nfc": "Escaneando NFC...",
"submitting_nfc": "Enviando NFC...",
"payment_received": "Pagamento recebido",
"payment_received_body": "Seu pagamento foi recebido e está sendo processado",
"payment_received_confirmations": "Assim que o seu pagamento receber {{requiredConfirmations}} confirmações na blockchain {{cryptoCode}}, a sua fatura será liquidada."
"conversion_body": "Esse serviço é oferecido por terceiros. Por favor, tenha em mente que não temos nenhum controle sobre como seus fundos serão utilizados. A fatura apenas será marcada como paga quando os fundos forem recebidos na Blockchain {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "Copiar",
"copy_confirm": "Copiado",
"powered_by": "Desenvolvido por",
"conversion_body": "Este serviço é oferecido por terceiros. Por favor tenha em mente que não temos qualquer controlo sobre como os seus fundos serão utilizados. A fatura será marcada como paga apenas quando os fundos forem recebidos na Blockchain {{cryptoCode}}.",
"scanning_nfc": "A digitalizar NFC...",
"submitting_nfc": "A enviar NFC...",
"payment_received": "Pagamento recebido",
"payment_received_body": "O seu pagamento foi recebido e está agora a ser processado.",
"payment_received_confirmations": "Assim que o seu pagamento receber {{requiredConfirmations}} confirmações na blockchain {{cryptoCode}}, a sua fatura será liquidada."
"conversion_body": "Este serviço é oferecido por terceiros. Por favor tenha em mente que não temos qualquer controlo sobre como os seus fundos serão utilizados. A fatura será marcada como paga apenas quando os fundos forem recebidos na Blockchain {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "Copiere",
"copy_confirm": "Copiat",
"powered_by": "Powered by",
"conversion_body": "Acest serviciu este furnizat de o terță parte. Vă rugăm să rețineți că nu avem niciun control asupra modului în care furnizorii vor trimite fondurile mai departe. Factura va fi plătită numai după ce fondurile vor fi primite în {{cryptoCode}} Blockchain.",
"scanning_nfc": "Scanare NFC...",
"submitting_nfc": "Trimitere NFC...",
"payment_received": "Plată primită",
"payment_received_body": "Plata dvs. a fost primită și este acum în curs de procesare",
"payment_received_confirmations": "Odată ce plata dumneavoastră primește {{requiredConfirmations}} confirmări pe blockchain-ul {{cryptoCode}}, factura dumneavoastră va fi achitată."
"conversion_body": "Acest serviciu este furnizat de o terță parte. Vă rugăm să rețineți că nu avem niciun control asupra modului în care furnizorii vor trimite fondurile mai departe. Factura va fi plătită numai după ce fondurile vor fi primite în {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "Скопировать",
"copy_confirm": "Скопировано",
"powered_by": "Работает на основе (Powered by)",
"conversion_body": "Эта услуга предоставляется третьей стороной. Пожалуйста, имейте в виду, что мы не можем контролировать, как провайдеры будут направлять ваши средства. Счет будет помечен как оплаченный только после получения средств в {{cryptoCode}} блокчейне.",
"scanning_nfc": "Сканирование NFC...",
"submitting_nfc": "Отправка NFC...",
"payment_received": "Платеж получен",
"payment_received_body": "Ваш платеж получен и находится в обработке",
"payment_received_confirmations": "Как только ваш платеж получит {{requiredConfirmations}} подтверждений на блокчейне {{cryptoCode}}, ваш счет будет оплачен."
"conversion_body": "Эта услуга предоставляется третьей стороной. Пожалуйста, имейте в виду, что мы не можем контролировать, как провайдеры будут направлять ваши средства. Счет будет помечен как оплаченный только после получения средств в {{cryptoCode}} блокчейне."
}

View File

@ -34,10 +34,5 @@
"copy": "Skopírovať",
"copy_confirm": "Skopírované",
"powered_by": "Používa technológiu",
"conversion_body": "Táto služba je poskytovaná treťou stranou. Majte na pamäti, že nemáme žiadnu kontrolu nad tým, ako budú poskytovatelia nakladať s Vašimi prostriedkami. Faktúra bude označená ako zaplatená až po prijatí prostriedkov v {{cryptoCode}} blockchaine.",
"scanning_nfc": "Skenovanie NFC...",
"submitting_nfc": "Odosielanie NFC...",
"payment_received": "Platba prijatá",
"payment_received_body": "Vaša platba bola prijatá a spracováva sa.",
"payment_received_confirmations": "Akonáhle tvoja platba na blockchain-e {{cryptoCode}} získa {{requiredConfirmations}} potvrdení, tvoja faktúra bude vyrovnána."
"conversion_body": "Táto služba je poskytovaná treťou stranou. Majte na pamäti, že nemáme žiadnu kontrolu nad tým, ako budú poskytovatelia nakladať s Vašimi prostriedkami. Faktúra bude označená ako zaplatená až po prijatí prostriedkov v {{cryptoCode}} blockchaine."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiraj",
"copy_confirm": "Kopirano",
"powered_by": "Omogoča",
"conversion_body": "To storitev ponuja tretja oseba. Ne pozabite, da nimamo nadzora nad tem, kako bodo ponudniki posredovali vaša sredstva. Račun bo označen kot plačan šele po prejemu sredstev na {{cryptoCode}} Blockchain.",
"scanning_nfc": "Skeniranje NFC ...",
"submitting_nfc": "Oddaja NFC ...",
"payment_received": "Plačilo prejeto",
"payment_received_body": "Vaše plačilo je bilo sprejeto in se sedaj obdeluje.",
"payment_received_confirmations": "Ko bo vaše plačilo prejelo {{requiredConfirmations}} potrditev na verigi blokov {{cryptoCode}}, bo vaša faktura poravnana."
"conversion_body": "To storitev ponuja tretja oseba. Ne pozabite, da nimamo nadzora nad tem, kako bodo ponudniki posredovali vaša sredstva. Račun bo označen kot plačan šele po prejemu sredstev na {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiraj",
"copy_confirm": "Kopirano",
"powered_by": "Pokreće",
"conversion_body": "Ovu uslugu pruža treća strana. Vodite računa da nemamo kontroliu nad načinom kako će Vam davatelji usluge proslijediti sredstva. Račun je plaćen tek kada su sredstva primljena na {{cryptoCode}} blokčejnu.",
"scanning_nfc": "Skeniranje NFC-a...",
"submitting_nfc": "Slanje NFC-a...",
"payment_received": "Plaćanje primljeno",
"payment_received_body": "Vaše plaćanje je primljeno i sada se obrađuje",
"payment_received_confirmations": "Kada vaša uplata primi {{requiredConfirmations}} potvrda na {{cryptoCode}} blokčejnu, vaš račun će biti namiren."
"conversion_body": "Ovu uslugu pruža treća strana. Vodite računa da nemamo kontroliu nad načinom kako će Vam davatelji usluge proslijediti sredstva. Račun je plaćen tek kada su sredstva primljena na {{cryptoCode}} blokčejnu."
}

View File

@ -34,10 +34,5 @@
"copy": "Kopiera",
"copy_confirm": "Kopierat",
"powered_by": "Drivs av",
"conversion_body": "Denna tjänst tillhandahålls av 3e part. Vänligen kom ihåg att vi saknar kontroll över hur tjänstleverantörer behandlar din betalning. Fakturan markeras som betald först när betalningen har mottagits på {{cryptoCode}} Blockchain.",
"scanning_nfc": "Skanna NFC …",
"submitting_nfc": "Skickar NFC …",
"payment_received": "Betalningen mottagen",
"payment_received_body": "Din betalning har mottagits och bearbetas nu",
"payment_received_confirmations": "När din betalning har mottagit {{requiredConfirmations}} bekräftelser på {{cryptoCode}} blockkedjan kommer din faktura att betalas."
"conversion_body": "Denna tjänst tillhandahålls av 3e part. Vänligen kom ihåg att vi saknar kontroll över hur tjänstleverantörer behandlar din betalning. Fakturan markeras som betald först när betalningen har mottagits på {{cryptoCode}} Blockchain."
}

View File

@ -34,10 +34,5 @@
"copy": "คัดลอก (Copy)",
"copy_confirm": "คัดลอกแล้ว",
"powered_by": "ขับเคลื่อนโดย",
"conversion_body": "บริการนี้มาจากบุคคลที่สาม โปรดจำไว้ว่าเราไม่มีควบคุมต่อวิธีที่ผู้ให้บริการจะส่งเงินของคุณต่อไป ใบแจ้งหนี้จะถูกทำเครื่องหมายว่าจ่ายเมื่อเงินได้รับบนเทคโนโลยีบล็อกเชน {{cryptoCode}} เท่านั้น",
"scanning_nfc": "สแกน NFC ...",
"submitting_nfc": "ส่ง NFC ...",
"payment_received": "ได้รับการชำระเงินแล้ว",
"payment_received_body": "การชำระเงินของคุณได้รับและกำลังดำเนินการต่อไป",
"payment_received_confirmations": "เมื่อการชำระเงินของคุณได้รับการยืนยัน {{requiredConfirmations}} ครั้งบนบล็อกเชน {{cryptoCode}} ใบแจ้งหนี้ของคุณจะถูกชำระแล้ว"
"conversion_body": "บริการนี้มาจากบุคคลที่สาม โปรดจำไว้ว่าเราไม่มีควบคุมต่อวิธีที่ผู้ให้บริการจะส่งเงินของคุณต่อไป ใบแจ้งหนี้จะถูกทำเครื่องหมายว่าจ่ายเมื่อเงินได้รับบนเทคโนโลยีบล็อกเชน {{cryptoCode}} เท่านั้น"
}

View File

@ -34,10 +34,5 @@
"copy": "Kopyala",
"copy_confirm": "Kopyalandı",
"powered_by": "Tarafından desteklenmektedir:",
"conversion_body": "Bu servis 3. kişiler tarafından sağlanmaktadır. Ödemenizi ileten sağlayıcıların bunu nasıl yapacağı üzerinde bizim herhangi bir yetkimiz bulunmamaktadır. Fatura ancak ödeme {{cryptoCode}} Blok Zincirinde alındığında ödenmiş olarak kabul edilecektir.",
"scanning_nfc": "NFC taraması yapılıyor...",
"submitting_nfc": "NFC gönderiliyor...",
"payment_received": "Ödeme Alındı",
"payment_received_body": "Ödemeniz alındı ve işleniyor",
"payment_received_confirmations": "{{cryptoCode}} blockchain'indeki {{requiredConfirmations}} onay almış ödemeniz tamamlanacaktır."
"conversion_body": "Bu servis 3. kişiler tarafından sağlanmaktadır. Ödemenizi ileten sağlayıcıların bunu nasıl yapacağı üzerinde bizim herhangi bir yetkimiz bulunmamaktadır. Fatura ancak ödeme {{cryptoCode}} Blok Zincirinde alındığında ödenmiş olarak kabul edilecektir."
}

View File

@ -34,10 +34,5 @@
"copy": "Копіювати",
"copy_confirm": "Скопійовано",
"powered_by": "Працює на базі",
"conversion_body": "Послуга надається третьою особою. Будь ласка, майте на увазі, що ми не контролюємо те, як провайдери пересилатимуть ваші кошти. Рахунок буде позначений як сплачений тільки після надходження коштів на блокчейн {{cryptoCode}}.",
"scanning_nfc": "Сканування NFC...",
"submitting_nfc": "Надсилання NFC...",
"payment_received": "Платіж отримано",
"payment_received_body": "Ваш платіж отримано і зараз обробляється",
"payment_received_confirmations": "Як тільки ваш платіж отримає {{requiredConfirmations}} підтверджень на блокчейні {{cryptoCode}}, ваш рахунок буде сплачено."
"conversion_body": "Послуга надається третьою особою. Будь ласка, майте на увазі, що ми не контролюємо те, як провайдери пересилатимуть ваші кошти. Рахунок буде позначений як сплачений тільки після надходження коштів на блокчейн {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "Sao chép",
"copy_confirm": "Đã sao chép",
"powered_by": "Được cung cấp bởi",
"conversion_body": "Dịch vụ này được cung cấp bởi một bên thứ ba. Xin vui lòng ghi nhớ, chúng tôi không kiểm soát phương thức các nhà cung cấp chuyển tiếp các nguồn tiền của bạn. Hóa đơn sẽ chỉ được đánh dấu đã thanh toán khi nào các nguồn tiền đã được nhận bởi Chuỗi khối Blockchain {{cryptoCode}}.",
"scanning_nfc": "Quét NFC ...",
"submitting_nfc": "Gửi NFC ...",
"payment_received": "Đã nhận thanh toán",
"payment_received_body": "Thanh toán của bạn đã được nhận và đang được xử lý.",
"payment_received_confirmations": "Sau khi thanh toán của bạn nhận được {{requiredConfirmations}} xác nhận trên blockchain {{cryptoCode}}, hoá đơn của bạn sẽ được giải quyết."
"conversion_body": "Dịch vụ này được cung cấp bởi một bên thứ ba. Xin vui lòng ghi nhớ, chúng tôi không kiểm soát phương thức các nhà cung cấp chuyển tiếp các nguồn tiền của bạn. Hóa đơn sẽ chỉ được đánh dấu đã thanh toán khi nào các nguồn tiền đã được nhận bởi Chuỗi khối Blockchain {{cryptoCode}}."
}

View File

@ -34,10 +34,5 @@
"copy": "复制",
"copy_confirm": "已复制",
"powered_by": "技术支持由",
"conversion_body": "此服务由第三方提供。请记住,我们无法控制提供者如何转移您的资金。只有在{{cryptoCode}}区块链上收到资金后,发票才会被标记为已支付。",
"scanning_nfc": "扫描 NFC ...",
"submitting_nfc": "提交 NFC ...",
"payment_received": "支付已收到",
"payment_received_body": "您的付款已收到并正在处理中。",
"payment_received_confirmations": "一旦您的{{cryptoCode}}区块链支付获得{{requiredConfirmations}}个确认,您的发票将结清。"
"conversion_body": "此服务由第三方提供。请记住,我们无法控制提供者如何转移您的资金。只有在{{cryptoCode}}区块链上收到资金后,发票才会被标记为已支付。"
}

View File

@ -34,10 +34,5 @@
"copy": "复制",
"copy_confirm": "已复制",
"powered_by": "由...提供技术支持",
"conversion_body": "请您注意,这项服务由第三方应用提供,所以我们无法直接获悉和操控第三方应用的具体兑换过程。订单只有在支付款被{{cryptocode}}的区块链接收之后,才会显示已支付。",
"scanning_nfc": "扫描 NFC...",
"submitting_nfc": "提交 NFC...",
"payment_received": "已收到付款",
"payment_received_body": "您的付款已收到,正在处理中",
"payment_received_confirmations": "一旦{{cryptoCode}} 区块链上收到{{requiredConfirmations}}个确认,您的账单将会被结算。"
"conversion_body": "请您注意,这项服务由第三方应用提供,所以我们无法直接获悉和操控第三方应用的具体兑换过程。订单只有在支付款被{{cryptocode}}的区块链接收之后,才会显示已支付。"
}

View File

@ -34,10 +34,5 @@
"copy": "複製",
"copy_confirm": "已複製",
"powered_by": "動力來自",
"conversion_body": "本服務由第三方提供。請謹記我們無法控制提供者如何轉發您的資金。發票只有在資金到達{{cryptoCode}}區塊鏈時才會被標記為已付款。",
"scanning_nfc": "掃描 NFC ...",
"submitting_nfc": "提交 NFC ...",
"payment_received": "已收到付款",
"payment_received_body": "您的付款已經收到並正在處理中",
"payment_received_confirmations": "當{{cryptoCode}} 區塊鏈確認您的支付已收到{{requiredConfirmations}}次確認時,您的發票將會完成結算。"
"conversion_body": "本服務由第三方提供。請謹記我們無法控制提供者如何轉發您的資金。發票只有在資金到達{{cryptoCode}}區塊鏈時才會被標記為已付款。"
}

View File

@ -34,10 +34,5 @@
"copy": "Kopisha",
"copy_confirm": "Kukopishwe",
"powered_by": "Igcwele nge-",
"conversion_body": "Le nsizakalo ihlinzekwa yiqembu lesithathu. Uyacelwa ukuthi wazi ukuthi asikwazi ukulawula ukuthi abahlinzeki bazoyithumela kanjani imali yakho. Ama-invoice azoqoshwa kuphela uma imali isitholile ku - {{cryptoCode}} Blockchain.",
"scanning_nfc": "Ibanga le-NFC likhawulelwa ...",
"submitting_nfc": "Ukubhaliswa kwe-NFC ...",
"payment_received": "Isitshalo esilandelayo",
"payment_received_body": "Isitshalo sakho sibhalwe futhi kuyatholakala manje",
"payment_received_confirmations": "Ekubeni iliphi eliphezulu kwama-confirmations {{requiredConfirmations}} ku-blockchain ye-{{cryptoCode}}, isitifiketi sakho siza kuphela."
"conversion_body": "Le nsizakalo ihlinzekwa yiqembu lesithathu. Uyacelwa ukuthi wazi ukuthi asikwazi ukulawula ukuthi abahlinzeki bazoyithumela kanjani imali yakho. Ama-invoice azoqoshwa kuphela uma imali isitholile ku - {{cryptoCode}} Blockchain."
}

View File

@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<Version>1.9.0</Version>
<Version>1.8.4</Version>
</PropertyGroup>
</Project>

View File

@ -1,53 +1,5 @@
# Changelog
## 1.9.0
### Breaking change
As part of our effort to withdraw support for MySQL and SQLite, if you start BTCPay Server with `--sqlitefile` or `--mysql` without being in the context of a migration, your server will fail to start.
We introduce another flag, `--deprecated`, which allows you to start with SQLite or MySQL even if it is deprecated. We will remove this flag in version 1.10.
### New features
* NFC: If browser permission is already granted, do not require the merchant to click on the "Pay by NFC" button. (#4807 #4819) @dennisreimann
* Point of Sales bought items will now appear on the receipt (#4851) @Kukks
* Add payment proof to the receipt, such as transaction ID or Lightning preimage (#4782) @dennisreimann
* Checkout v2: Show when the payment still needs confirmation (#4778) @dennisreimann
* Wallet Transactions Export: Add BIP-329 support (#4799) @dennisreimann
* Invoice Details: Improve payments list and print view (#4817 #4783 #4729) @dennisreimann
* Can add labels to destination addresses in the Send Wallet (#4796 #4755) @dennisreimann
* Properly parse an imported wallet's xpub when it contains a fingerprint and keypath (#4781) @dennisreimann
* Forms can include HTML select components (#4726) @Kukks
* Checkout v2: Celebrate payment with confetti (#4727) @dennisreimann
* Checkout v2: Option to display amount in Sats in BIP21 case (#4730) @dennisreimann
* Store Email rules: Can send test emails (#4843) @Nisaba
* Store Email rules: Support HTML/Rich Text emails (#4843) @Nisaba
* Add presets to optimize checkout experience for retail use (#4756) @NicolasDorier
* Dashboard: Add labels for recent txs dashboard widget (#4831) @dennisreimann
### Bug fixes
* Do not propose Lightning payment if the LN Node is dead (#4795 #3541) @Kukks
* Point of Sale: Fix escaped HTML entities in item title (#4798) @dennisreimann
* Fix: Labels added by payouts to transactions shouldn't show HTML markups (#4790) @dennisreimann
* If store user is Guest, "issue refund" shouldn't be an option (#4595 #3512) @Kukks
### Improvements
* Checkout V2 will be the default for new stores (#4850) @NicolasDorier
* Improve UX for adding/removing labels on transaction view (#4796 #4706) @dennisreimann
* UI: Redesign Recovery Seed view (#4793) @TChukwuleta
* Polishing experimental custodian feature; see blog post soon (#4085) @woutersamaey
* Prevent people from starting with `--sqlitefile` or `--mysql` (#4772) @NicolasDorier
* Replace text in copy buttons with icons (#4699 #4764) @dennisreimann
* Plugins will be able to introduce new types of apps in addition to Point of Sale and Crowdfund (#4608) @Kukks
* Dashboard: App stats (#4775) @dennisreimann
* Update price display (#4736) @dennisreimann @dstrukt
* Store branding: Improve complementing text and accent colors (#4746) @dennisreimann
* UI: Improve pagination (#4828) @benalleng @dennisreimann
* Checkout V2: Remove `Pay by LNURL Withdraw` button if NFC isn't supported by the browser (#4822) @dennisreimann
## 1.8.4
### Bug fix
@ -65,7 +17,7 @@ We introduce another flag, `--deprecated`, which allows you to start with SQLite
### Bug fix
* Prevent XSS injection via VueJS (#4747) credit to @cupc4k3. @NicolasDorier
* Greenfield: Do not throw `missing-permission` error when no store on `/api/v1/stores` (#4735 #4748) @NicolasDorier
* Do not through missing-permission error when no store on /api/v1/stores (Close #4735) (#4748) @NicolasDorier
### Improvements