public PaymentMethod SetPaymentMethodDetails(IPaymentMethodDetails paymentMethod) { #pragma warning disable CS0618 // Type or member is obsolete // Legacy, need to fill the old fields if (PaymentType == null) { PaymentType = paymentMethod.GetPaymentType().ToString(); } else if (PaymentType != paymentMethod.GetPaymentType().ToString()) { throw new InvalidOperationException("Invalid payment method affected"); } if (paymentMethod is Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod bitcoinPaymentMethod) { TxFee = bitcoinPaymentMethod.TxFee; FeeRate = bitcoinPaymentMethod.FeeRate; DepositAddress = bitcoinPaymentMethod.DepositAddress; } var jobj = JObject.Parse(JsonConvert.SerializeObject(paymentMethod)); PaymentMethodDetails = jobj; #pragma warning restore CS0618 // Type or member is obsolete return(this); }
public IPaymentMethodDetails GetPaymentMethodDetails() { #pragma warning disable CS0618 // Type or member is obsolete // Legacy, old code does not have PaymentMethods if (string.IsNullOrEmpty(PaymentType) || PaymentMethodDetails == null) { return(new Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod() { FeeRate = FeeRate, DepositAddress = string.IsNullOrEmpty(DepositAddress) ? null : DepositAddress, NextNetworkFee = NextNetworkFee }); } else { IPaymentMethodDetails details = GetId().PaymentType.DeserializePaymentMethodDetails(Network, PaymentMethodDetails.ToString()); if (details is Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod btcLike) { btcLike.NextNetworkFee = NextNetworkFee; btcLike.DepositAddress = string.IsNullOrEmpty(DepositAddress) ? null : DepositAddress; btcLike.FeeRate = FeeRate; } return(details); } throw new NotSupportedException(PaymentType); #pragma warning restore CS0618 // Type or member is obsolete }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { var lnInvoiceTrimmedOfScheme = paymentMethodDetails.GetPaymentDestination().ToLowerInvariant() .Replace("lightning:", "", StringComparison.InvariantCultureIgnoreCase); return($"lightning:{lnInvoiceTrimmedOfScheme}"); }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { var bip21 = ((BTCPayNetwork)network).GenerateBIP21(paymentMethodDetails.GetPaymentDestination(), cryptoInfoDue); if ((paymentMethodDetails as BitcoinLikeOnChainPaymentMethod)?.PayjoinEnabled is true) { bip21 += $"&{PayjoinClient.BIP21EndpointKey}={serverUri.WithTrailingSlash()}{network.CryptoCode}/{PayjoinClient.BIP21EndpointKey}"; } return(bip21); }
public async Task <bool> NewAddress(string invoiceId, IPaymentMethodDetails paymentMethod, BTCPayNetwork network) { using (var context = _ContextFactory.CreateContext()) { var invoice = await context.Invoices.FirstOrDefaultAsync(i => i.Id == invoiceId); if (invoice == null) { return(false); } var invoiceEntity = ToObject <InvoiceEntity>(invoice.Blob, network.NBitcoinNetwork); var currencyData = invoiceEntity.GetPaymentMethod(network, paymentMethod.GetPaymentType(), null); if (currencyData == null) { return(false); } var existingPaymentMethod = currencyData.GetPaymentMethodDetails(); if (existingPaymentMethod.GetPaymentDestination() != null) { MarkUnassigned(invoiceId, invoiceEntity, context, currencyData.GetId()); } existingPaymentMethod.SetPaymentDestination(paymentMethod.GetPaymentDestination()); currencyData.SetPaymentMethodDetails(existingPaymentMethod); #pragma warning disable CS0618 if (network.IsBTC) { invoiceEntity.DepositAddress = currencyData.DepositAddress; } #pragma warning restore CS0618 invoiceEntity.SetPaymentMethod(currencyData); invoice.Blob = ToBytes(invoiceEntity, network.NBitcoinNetwork); context.AddressInvoices.Add(new AddressInvoiceData() { InvoiceDataId = invoiceId, CreatedTime = DateTimeOffset.UtcNow } .Set(GetDestination(currencyData, network.NBitcoinNetwork), currencyData.GetId())); context.HistoricalAddressInvoices.Add(new HistoricalAddressInvoiceData() { InvoiceDataId = invoiceId, Assigned = DateTimeOffset.UtcNow }.SetAddress(paymentMethod.GetPaymentDestination(), network.CryptoCode)); await context.SaveChangesAsync(); AddToTextSearch(invoice.Id, paymentMethod.GetPaymentDestination()); return(true); } }
/// <summary> /// Add a payment to an invoice /// </summary> /// <param name="invoiceId"></param> /// <param name="date"></param> /// <param name="paymentData"></param> /// <param name="cryptoCode"></param> /// <param name="accounted"></param> /// <returns>The PaymentEntity or null if already added</returns> public async Task <PaymentEntity> AddPayment(string invoiceId, DateTimeOffset date, CryptoPaymentData paymentData, BTCPayNetworkBase network, bool accounted = false) { using (var context = _ContextFactory.CreateContext()) { var invoice = context.Invoices.Find(invoiceId); if (invoice == null) { return(null); } InvoiceEntity invoiceEntity = ToObject(invoice.Blob); invoiceEntity.PaymentMethodHandlerDictionary = _paymentMethodHandlerDictionary; PaymentMethod paymentMethod = invoiceEntity.GetPaymentMethod(new PaymentMethodId(network.CryptoCode, paymentData.GetPaymentType()), null); IPaymentMethodDetails paymentMethodDetails = paymentMethod.GetPaymentMethodDetails(); PaymentEntity entity = new PaymentEntity { Version = 1, #pragma warning disable CS0618 CryptoCode = network.CryptoCode, #pragma warning restore CS0618 ReceivedTime = date.UtcDateTime, Accounted = accounted, NetworkFee = paymentMethodDetails.GetNextNetworkFee(), PaymentMethodHandlerDictionary = _paymentMethodHandlerDictionary }; entity.SetCryptoPaymentData(paymentData); if (paymentMethodDetails is Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod bitcoinPaymentMethod && bitcoinPaymentMethod.NetworkFeeMode == NetworkFeeMode.MultiplePaymentsOnly && bitcoinPaymentMethod.NextNetworkFee == Money.Zero) { bitcoinPaymentMethod.NextNetworkFee = bitcoinPaymentMethod.FeeRate.GetFee(100); // assume price for 100 bytes paymentMethod.SetPaymentMethodDetails(bitcoinPaymentMethod); invoiceEntity.SetPaymentMethod(paymentMethod); invoice.Blob = ToBytes(invoiceEntity, network); } PaymentData data = new PaymentData { Id = paymentData.GetPaymentId(), Blob = ToBytes(entity, null), InvoiceDataId = invoiceId, Accounted = accounted }; context.Payments.Add(data); try { await context.SaveChangesAsync().ConfigureAwait(false); } catch (DbUpdateException) { return(null); } // Already exists AddToTextSearch(invoiceId, paymentData.GetSearchTerms()); return(entity); } }
public async Task <bool> NewPaymentDetails(string invoiceId, IPaymentMethodDetails paymentMethodDetails, BTCPayNetworkBase network) { await using var context = _ContextFactory.CreateContext(); var invoice = (await context.Invoices.Where(i => i.Id == invoiceId).ToListAsync()).FirstOrDefault(); if (invoice == null) { return(false); } var invoiceEntity = invoice.GetBlob(_Networks); var paymentMethod = invoiceEntity.GetPaymentMethod(network, paymentMethodDetails.GetPaymentType()); if (paymentMethod == null) { return(false); } var existingPaymentMethod = paymentMethod.GetPaymentMethodDetails(); if (existingPaymentMethod.GetPaymentDestination() != null) { MarkUnassigned(invoiceId, context, paymentMethod.GetId()); } paymentMethod.SetPaymentMethodDetails(paymentMethodDetails); #pragma warning disable CS0618 if (network.IsBTC) { invoiceEntity.DepositAddress = paymentMethod.DepositAddress; } #pragma warning restore CS0618 invoiceEntity.SetPaymentMethod(paymentMethod); invoice.Blob = ToBytes(invoiceEntity, network); await context.AddressInvoices.AddAsync(new AddressInvoiceData() { InvoiceDataId = invoiceId, CreatedTime = DateTimeOffset.UtcNow } .Set(GetDestination(paymentMethod), paymentMethod.GetId())); await context.HistoricalAddressInvoices.AddAsync(new HistoricalAddressInvoiceData() { InvoiceDataId = invoiceId, Assigned = DateTimeOffset.UtcNow }.SetAddress(paymentMethodDetails.GetPaymentDestination(), network.CryptoCode)); await context.SaveChangesAsync(); AddToTextSearch(invoice.Id, paymentMethodDetails.GetPaymentDestination()); return(true); }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { if (!paymentMethodDetails.Activated) { return(null); } var lnurlPaymentMethodDetails = (LNURLPayPaymentMethodDetails)paymentMethodDetails; var uri = new Uri( $"{serverUri.WithTrailingSlash()}{network.CryptoCode}/lnurl/pay/i/{lnurlPaymentMethodDetails.BTCPayInvoiceId}"); return(LNURL.LNURL.EncodeUri(uri, "payRequest", lnurlPaymentMethodDetails.Bech32Mode).ToString()); }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { if (!paymentMethodDetails.Activated) { return(string.Empty); } var bip21 = ((BTCPayNetwork)network).GenerateBIP21(paymentMethodDetails.GetPaymentDestination(), cryptoInfoDue); if ((paymentMethodDetails as BitcoinLikeOnChainPaymentMethod)?.PayjoinEnabled is true && serverUri != null) { bip21.QueryParams.Add(PayjoinClient.BIP21EndpointKey, $"{serverUri.WithTrailingSlash()}{network.CryptoCode}/{PayjoinClient.BIP21EndpointKey}"); } return(bip21.ToString()); }
public void SetPaymentDetails(IPaymentMethodDetails newPaymentMethodDetails) { throw new System.NotImplementedException(); }
public InvoiceNewPaymentDetailsEvent(string invoiceId, IPaymentMethodDetails details, PaymentMethodId paymentMethodId) { InvoiceId = invoiceId; Details = details; PaymentMethodId = paymentMethodId; }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { return(""); }
public override string SerializePaymentMethodDetails(BTCPayNetworkBase network, IPaymentMethodDetails details) { return(JsonConvert.SerializeObject(details)); }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { return(paymentMethodDetails.Activated ? $"{(network as ZcashLikeSpecificBtcPayNetwork).UriScheme}:{paymentMethodDetails.GetPaymentDestination()}?amount={cryptoInfoDue.ToDecimal(MoneyUnit.BTC)}" : string.Empty); }
public override string SerializePaymentMethodDetails(BTCPayNetworkBase network, IPaymentMethodDetails details) { return(((BTCPayNetwork)network).ToString((BitcoinLikeOnChainPaymentMethod)details)); }
public void SetPaymentDetails(IPaymentMethodDetails newPaymentMethodDetails) { BOLT11 = newPaymentMethodDetails.GetPaymentDestination(); }
public abstract string SerializePaymentMethodDetails(BTCPayNetworkBase network, IPaymentMethodDetails details);
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { return ($"lightning:{paymentMethodDetails.GetPaymentDestination().ToUpperInvariant().Replace("LIGHTNING:", "", StringComparison.InvariantCultureIgnoreCase)}"); }
/// <summary> /// Add a payment to an invoice /// </summary> /// <param name="invoiceId"></param> /// <param name="date"></param> /// <param name="paymentData"></param> /// <param name="cryptoCode"></param> /// <param name="accounted"></param> /// <returns>The PaymentEntity or null if already added</returns> public async Task <PaymentEntity> AddPayment(string invoiceId, DateTimeOffset date, CryptoPaymentData paymentData, BTCPayNetworkBase network, bool accounted = false) { await using var context = _applicationDbContextFactory.CreateContext(); var invoice = await context.Invoices.FindAsync(invoiceId); if (invoice == null) { return(null); } InvoiceEntity invoiceEntity = invoice.GetBlob(_btcPayNetworkProvider); PaymentMethod paymentMethod = invoiceEntity.GetPaymentMethod(new PaymentMethodId(network.CryptoCode, paymentData.GetPaymentType())); IPaymentMethodDetails paymentMethodDetails = paymentMethod.GetPaymentMethodDetails(); PaymentEntity entity = new PaymentEntity { Version = 1, #pragma warning disable CS0618 CryptoCode = network.CryptoCode, #pragma warning restore CS0618 ReceivedTime = date.UtcDateTime, Accounted = accounted, NetworkFee = paymentMethodDetails.GetNextNetworkFee(), Network = network }; entity.SetCryptoPaymentData(paymentData); //TODO: abstract if (paymentMethodDetails is Payments.Bitcoin.BitcoinLikeOnChainPaymentMethod bitcoinPaymentMethod && bitcoinPaymentMethod.NetworkFeeMode == NetworkFeeMode.MultiplePaymentsOnly && bitcoinPaymentMethod.NextNetworkFee == Money.Zero) { bitcoinPaymentMethod.NextNetworkFee = bitcoinPaymentMethod.NetworkFeeRate.GetFee(100); // assume price for 100 bytes paymentMethod.SetPaymentMethodDetails(bitcoinPaymentMethod); invoiceEntity.SetPaymentMethod(paymentMethod); invoice.Blob = InvoiceRepository.ToBytes(invoiceEntity, network); } PaymentData data = new PaymentData { Id = paymentData.GetPaymentId(), Blob = InvoiceRepository.ToBytes(entity, entity.Network), InvoiceDataId = invoiceId, Accounted = accounted }; await context.Payments.AddAsync(data); InvoiceRepository.AddToTextSearch(context, invoice, paymentData.GetSearchTerms()); var alreadyExists = false; try { await context.SaveChangesAsync().ConfigureAwait(false); } catch (DbUpdateException) { alreadyExists = true; } if (alreadyExists) { return(null); } if (paymentData.PaymentConfirmed(entity, invoiceEntity.SpeedPolicy)) { _eventAggregator.Publish(new InvoiceEvent(invoiceEntity, InvoiceEvent.PaymentSettled) { Payment = entity }); } return(entity); }
public override string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri) { return ($"{(network as MoneroLikeSpecificBtcPayNetwork).UriScheme}:{paymentMethodDetails.GetPaymentDestination()}?tx_amount={cryptoInfoDue.ToDecimal(MoneyUnit.BTC)}"); }
public abstract string GetPaymentLink(BTCPayNetworkBase network, IPaymentMethodDetails paymentMethodDetails, Money cryptoInfoDue, string serverUri);
public void SetPaymentDetails(IPaymentMethodDetails newPaymentMethodDetails) { DepositAddress = newPaymentMethodDetails.GetPaymentDestination(); KeyPath = (newPaymentMethodDetails as BitcoinLikeOnChainPaymentMethod)?.KeyPath; }