mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-17 22:14:26 +01:00
Making BTCPayServer a bit faster when creating invoices
This commit is contained in:
@@ -63,7 +63,7 @@ services:
|
|||||||
|
|
||||||
|
|
||||||
nbxplorer:
|
nbxplorer:
|
||||||
image: nicolasdorier/nbxplorer:1.0.2.14
|
image: nicolasdorier/nbxplorer:1.0.2.31
|
||||||
ports:
|
ports:
|
||||||
- "32838:32838"
|
- "32838:32838"
|
||||||
expose:
|
expose:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||||
<Version>1.0.2.93</Version>
|
<Version>1.0.2.94</Version>
|
||||||
<NoWarn>NU1701,CA1816,CA1308,CA1810,CA2208</NoWarn>
|
<NoWarn>NU1701,CA1816,CA1308,CA1810,CA2208</NoWarn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -210,6 +210,7 @@ namespace BTCPayServer.Controllers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var storeBlob = store.GetStoreBlob();
|
var storeBlob = store.GetStoreBlob();
|
||||||
|
var preparePayment = handler.PreparePayment(supportedPaymentMethod, store, network);
|
||||||
var rate = await fetchingByCurrencyPair[new CurrencyPair(network.CryptoCode, entity.ProductInformation.Currency)];
|
var rate = await fetchingByCurrencyPair[new CurrencyPair(network.CryptoCode, entity.ProductInformation.Currency)];
|
||||||
if (rate.BidAsk == null)
|
if (rate.BidAsk == null)
|
||||||
{
|
{
|
||||||
@@ -220,7 +221,7 @@ namespace BTCPayServer.Controllers
|
|||||||
paymentMethod.Network = network;
|
paymentMethod.Network = network;
|
||||||
paymentMethod.SetId(supportedPaymentMethod.PaymentId);
|
paymentMethod.SetId(supportedPaymentMethod.PaymentId);
|
||||||
paymentMethod.Rate = rate.BidAsk.Bid;
|
paymentMethod.Rate = rate.BidAsk.Bid;
|
||||||
var paymentDetails = await handler.CreatePaymentMethodDetails(supportedPaymentMethod, paymentMethod, store, network);
|
var paymentDetails = await handler.CreatePaymentMethodDetails(supportedPaymentMethod, paymentMethod, store, network, preparePayment);
|
||||||
if (storeBlob.NetworkFeeDisabled)
|
if (storeBlob.NetworkFeeDisabled)
|
||||||
paymentDetails.SetNoTxFee();
|
paymentDetails.SetNoTxFee();
|
||||||
paymentMethod.SetPaymentMethodDetails(paymentDetails);
|
paymentMethod.SetPaymentMethodDetails(paymentDetails);
|
||||||
|
|||||||
@@ -27,16 +27,30 @@ namespace BTCPayServer.Payments.Bitcoin
|
|||||||
_WalletProvider = walletProvider;
|
_WalletProvider = walletProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(DerivationStrategy supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network)
|
class Prepare
|
||||||
|
{
|
||||||
|
public Task<FeeRate> GetFeeRate;
|
||||||
|
public Task<BitcoinAddress> ReserveAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object PreparePayment(DerivationStrategy supportedPaymentMethod, StoreData store, BTCPayNetwork network)
|
||||||
|
{
|
||||||
|
return new Prepare()
|
||||||
|
{
|
||||||
|
GetFeeRate = _FeeRateProviderFactory.CreateFeeProvider(network).GetFeeRateAsync(),
|
||||||
|
ReserveAddress = _WalletProvider.GetWallet(network).ReserveAddressAsync(supportedPaymentMethod.DerivationStrategyBase)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(DerivationStrategy supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
|
||||||
{
|
{
|
||||||
if (!_ExplorerProvider.IsAvailable(network))
|
if (!_ExplorerProvider.IsAvailable(network))
|
||||||
throw new PaymentMethodUnavailableException($"Full node not available");
|
throw new PaymentMethodUnavailableException($"Full node not available");
|
||||||
var getFeeRate = _FeeRateProviderFactory.CreateFeeProvider(network).GetFeeRateAsync();
|
var prepare = (Prepare)preparePaymentObject;
|
||||||
var getAddress = _WalletProvider.GetWallet(network).ReserveAddressAsync(supportedPaymentMethod.DerivationStrategyBase);
|
|
||||||
Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod onchainMethod = new Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod();
|
Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod onchainMethod = new Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod();
|
||||||
onchainMethod.FeeRate = await getFeeRate;
|
onchainMethod.FeeRate = await prepare.GetFeeRate;
|
||||||
onchainMethod.TxFee = onchainMethod.FeeRate.GetFee(100); // assume price for 100 bytes
|
onchainMethod.TxFee = onchainMethod.FeeRate.GetFee(100); // assume price for 100 bytes
|
||||||
onchainMethod.DepositAddress = (await getAddress).ToString();
|
onchainMethod.DepositAddress = (await prepare.ReserveAddress).ToString();
|
||||||
return onchainMethod;
|
return onchainMethod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,23 +20,46 @@ namespace BTCPayServer.Payments
|
|||||||
/// <param name="store"></param>
|
/// <param name="store"></param>
|
||||||
/// <param name="network"></param>
|
/// <param name="network"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<IPaymentMethodDetails> CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network);
|
Task<IPaymentMethodDetails> CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This method called before the rate have been fetched
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="supportedPaymentMethod"></param>
|
||||||
|
/// <param name="store"></param>
|
||||||
|
/// <param name="network"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
object PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IPaymentMethodHandler<T> : IPaymentMethodHandler where T : ISupportedPaymentMethod
|
public interface IPaymentMethodHandler<T> : IPaymentMethodHandler where T : ISupportedPaymentMethod
|
||||||
{
|
{
|
||||||
Task<IPaymentMethodDetails> CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network);
|
Task<IPaymentMethodDetails> CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class PaymentMethodHandlerBase<T> : IPaymentMethodHandler<T> where T : ISupportedPaymentMethod
|
public abstract class PaymentMethodHandlerBase<T> : IPaymentMethodHandler<T> where T : ISupportedPaymentMethod
|
||||||
{
|
{
|
||||||
public abstract Task<IPaymentMethodDetails> CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network);
|
|
||||||
|
public abstract Task<IPaymentMethodDetails> CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject);
|
||||||
|
public virtual object PreparePayment(T supportedPaymentMethod, StoreData store, BTCPayNetwork network)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Task<IPaymentMethodDetails> IPaymentMethodHandler.CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network)
|
object IPaymentMethodHandler.PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network)
|
||||||
{
|
{
|
||||||
if (supportedPaymentMethod is T method)
|
if (supportedPaymentMethod is T method)
|
||||||
{
|
{
|
||||||
return CreatePaymentMethodDetails(method, paymentMethod, store, network);
|
return PreparePayment(method, store, network);
|
||||||
|
}
|
||||||
|
throw new NotSupportedException("Invalid supportedPaymentMethod");
|
||||||
|
}
|
||||||
|
|
||||||
|
Task<IPaymentMethodDetails> IPaymentMethodHandler.CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
|
||||||
|
{
|
||||||
|
if (supportedPaymentMethod is T method)
|
||||||
|
{
|
||||||
|
return CreatePaymentMethodDetails(method, paymentMethod, store, network, preparePaymentObject);
|
||||||
}
|
}
|
||||||
throw new NotSupportedException("Invalid supportedPaymentMethod");
|
throw new NotSupportedException("Invalid supportedPaymentMethod");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace BTCPayServer.Payments.Lightning
|
|||||||
_LightningClientFactory = lightningClientFactory;
|
_LightningClientFactory = lightningClientFactory;
|
||||||
_Dashboard = dashboard;
|
_Dashboard = dashboard;
|
||||||
}
|
}
|
||||||
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(LightningSupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network)
|
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(LightningSupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
|
||||||
{
|
{
|
||||||
var storeBlob = store.GetStoreBlob();
|
var storeBlob = store.GetStoreBlob();
|
||||||
var test = Test(supportedPaymentMethod, network);
|
var test = Test(supportedPaymentMethod, network);
|
||||||
|
|||||||
Reference in New Issue
Block a user