2018-02-20 12:45:04 +09:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using BTCPayServer.Data;
|
|
|
|
|
using BTCPayServer.Services;
|
|
|
|
|
using BTCPayServer.Services.Invoices;
|
|
|
|
|
using BTCPayServer.Services.Rates;
|
|
|
|
|
using NBitcoin;
|
|
|
|
|
|
|
|
|
|
namespace BTCPayServer.Payments.Bitcoin
|
|
|
|
|
{
|
2019-05-08 23:39:11 +09:00
|
|
|
|
public class BitcoinLikePaymentHandler : PaymentMethodHandlerBase<DerivationSchemeSettings>
|
2018-02-20 12:45:04 +09:00
|
|
|
|
{
|
|
|
|
|
ExplorerClientProvider _ExplorerProvider;
|
|
|
|
|
private IFeeProviderFactory _FeeRateProviderFactory;
|
|
|
|
|
private Services.Wallets.BTCPayWalletProvider _WalletProvider;
|
|
|
|
|
|
|
|
|
|
public BitcoinLikePaymentHandler(ExplorerClientProvider provider,
|
|
|
|
|
IFeeProviderFactory feeRateProviderFactory,
|
|
|
|
|
Services.Wallets.BTCPayWalletProvider walletProvider)
|
|
|
|
|
{
|
|
|
|
|
if (provider == null)
|
|
|
|
|
throw new ArgumentNullException(nameof(provider));
|
|
|
|
|
_ExplorerProvider = provider;
|
|
|
|
|
this._FeeRateProviderFactory = feeRateProviderFactory;
|
|
|
|
|
_WalletProvider = walletProvider;
|
|
|
|
|
}
|
|
|
|
|
|
2018-08-21 13:54:52 +09:00
|
|
|
|
class Prepare
|
|
|
|
|
{
|
|
|
|
|
public Task<FeeRate> GetFeeRate;
|
|
|
|
|
public Task<BitcoinAddress> ReserveAddress;
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-29 09:43:50 +00:00
|
|
|
|
public override object PreparePayment(DerivationSchemeSettings supportedPaymentMethod, StoreData store, BTCPayNetworkBase network)
|
2018-08-21 13:54:52 +09:00
|
|
|
|
{
|
|
|
|
|
return new Prepare()
|
|
|
|
|
{
|
|
|
|
|
GetFeeRate = _FeeRateProviderFactory.CreateFeeProvider(network).GetFeeRateAsync(),
|
2019-05-08 23:39:11 +09:00
|
|
|
|
ReserveAddress = _WalletProvider.GetWallet(network).ReserveAddressAsync(supportedPaymentMethod.AccountDerivation)
|
2018-08-21 13:54:52 +09:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 06:38:47 +00:00
|
|
|
|
public override string PrettyDescription => "On-Chain";
|
|
|
|
|
public override PaymentTypes PaymentType => PaymentTypes.BTCLike;
|
|
|
|
|
|
2019-05-29 09:43:50 +00:00
|
|
|
|
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(
|
|
|
|
|
DerivationSchemeSettings supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store,
|
|
|
|
|
BTCPayNetworkBase network, object preparePaymentObject)
|
2018-02-20 12:45:04 +09:00
|
|
|
|
{
|
2018-03-28 22:37:01 +09:00
|
|
|
|
if (!_ExplorerProvider.IsAvailable(network))
|
|
|
|
|
throw new PaymentMethodUnavailableException($"Full node not available");
|
2018-08-21 13:54:52 +09:00
|
|
|
|
var prepare = (Prepare)preparePaymentObject;
|
2018-02-20 12:45:04 +09:00
|
|
|
|
Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod onchainMethod = new Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod();
|
2019-01-05 00:37:09 +09:00
|
|
|
|
onchainMethod.NetworkFeeMode = store.GetStoreBlob().NetworkFeeMode;
|
2018-08-21 13:54:52 +09:00
|
|
|
|
onchainMethod.FeeRate = await prepare.GetFeeRate;
|
2019-01-05 00:37:09 +09:00
|
|
|
|
switch (onchainMethod.NetworkFeeMode)
|
|
|
|
|
{
|
|
|
|
|
case NetworkFeeMode.Always:
|
2019-01-07 15:35:18 +09:00
|
|
|
|
onchainMethod.NextNetworkFee = onchainMethod.FeeRate.GetFee(100); // assume price for 100 bytes
|
2019-01-05 00:37:09 +09:00
|
|
|
|
break;
|
|
|
|
|
case NetworkFeeMode.Never:
|
|
|
|
|
case NetworkFeeMode.MultiplePaymentsOnly:
|
2019-01-07 15:35:18 +09:00
|
|
|
|
onchainMethod.NextNetworkFee = Money.Zero;
|
2019-01-05 00:37:09 +09:00
|
|
|
|
break;
|
|
|
|
|
}
|
2018-08-21 13:54:52 +09:00
|
|
|
|
onchainMethod.DepositAddress = (await prepare.ReserveAddress).ToString();
|
2018-02-20 12:45:04 +09:00
|
|
|
|
return onchainMethod;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|