public IPayoutProof ParseProof(PayoutData payout) { if (payout?.Proof is null) { return(null); } var paymentMethodId = payout.GetPaymentMethodId(); if (paymentMethodId is null) { return(null); } var raw = JObject.Parse(Encoding.UTF8.GetString(payout.Proof)); if (raw.TryGetValue("proofType", StringComparison.InvariantCultureIgnoreCase, out var proofType) && proofType.Value <string>() == ManualPayoutProof.Type) { return(raw.ToObject <ManualPayoutProof>()); } var res = raw.ToObject <PayoutTransactionOnChainBlob>( JsonSerializer.Create(_jsonSerializerSettings.GetSerializer(paymentMethodId.CryptoCode))); var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(paymentMethodId.CryptoCode); if (res == null) { return(null); } res.LinkTemplate = network.BlockExplorerLink; return(res); }
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // some of the data models don't have OnModelCreating for now, commenting them AddressInvoiceData.OnModelCreating(builder); APIKeyData.OnModelCreating(builder); AppData.OnModelCreating(builder); //StoredFile.OnModelCreating(builder); HistoricalAddressInvoiceData.OnModelCreating(builder); InvoiceEventData.OnModelCreating(builder); InvoiceSearchData.OnModelCreating(builder); InvoiceWebhookDeliveryData.OnModelCreating(builder); InvoiceData.OnModelCreating(builder); NotificationData.OnModelCreating(builder); //OffchainTransactionData.OnModelCreating(builder); Data.PairedSINData.OnModelCreating(builder); PairingCodeData.OnModelCreating(builder); //PayjoinLock.OnModelCreating(builder); PaymentRequestData.OnModelCreating(builder); PaymentData.OnModelCreating(builder); PayoutData.OnModelCreating(builder); PendingInvoiceData.OnModelCreating(builder); //PlannedTransaction.OnModelCreating(builder); PullPaymentData.OnModelCreating(builder); RefundData.OnModelCreating(builder); //SettingData.OnModelCreating(builder); StoreWebhookData.OnModelCreating(builder); //StoreData.OnModelCreating(builder); U2FDevice.OnModelCreating(builder); Fido2Credential.OnModelCreating(builder); Data.UserStore.OnModelCreating(builder); //WalletData.OnModelCreating(builder); WalletTransactionData.OnModelCreating(builder); WebhookDeliveryData.OnModelCreating(builder); //WebhookData.OnModelCreating(builder); if (Database.IsSqlite() && !_designTime) { // SQLite does not have proper support for DateTimeOffset via Entity Framework Core, see the limitations // here: https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations#query-limitations // To work around this, when the Sqlite database provider is used, all model properties of type DateTimeOffset // use the DateTimeOffsetToBinaryConverter // Based on: https://github.com/aspnet/EntityFrameworkCore/issues/10784#issuecomment-415769754 // This only supports millisecond precision, but should be sufficient for most use cases. foreach (var entityType in builder.Model.GetEntityTypes()) { var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(DateTimeOffset)); foreach (var property in properties) { builder .Entity(entityType.Name) .Property(property.Name) .HasConversion(new Microsoft.EntityFrameworkCore.Storage.ValueConversion.DateTimeOffsetToBinaryConverter()); } } } }
public static PayoutTransactionOnChainBlob GetProofBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers) { if (data.Proof is null) { return(null); } return(JsonConvert.DeserializeObject <PayoutTransactionOnChainBlob>(Encoding.UTF8.GetString(data.Proof), serializers.GetSerializer(data.GetPaymentMethodId().CryptoCode))); }
public void SetProofBlob(PayoutData data, PayoutTransactionOnChainBlob blob) { var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(blob, _jsonSerializerSettings.GetSerializer(data.GetPaymentMethodId().CryptoCode))); // We only update the property if the bytes actually changed, this prevent from hammering the DB too much if (data.Proof is null || bytes.Length != data.Proof.Length || !bytes.SequenceEqual(data.Proof)) { data.Proof = bytes; } }
public IPayoutProof ParseProof(PayoutData payout) { if (payout?.Proof is null) { return(null); } var paymentMethodId = payout.GetPaymentMethodId(); var res = JsonConvert.DeserializeObject <PayoutTransactionOnChainBlob>(Encoding.UTF8.GetString(payout.Proof), _jsonSerializerSettings.GetSerializer(paymentMethodId.CryptoCode)); var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(paymentMethodId.CryptoCode); res.LinkTemplate = network.BlockExplorerLink; return(res); }
public static void SetProofBlob(this PayoutData data, ManualPayoutProof blob) { if (blob is null) { return; } var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(blob)); // We only update the property if the bytes actually changed, this prevent from hammering the DB too much if (data.Proof is null || bytes.Length != data.Proof.Length || !bytes.SequenceEqual(data.Proof)) { data.Proof = bytes; } }
public static void SetBlob(this PayoutData data, PayoutBlob blob, BTCPayNetworkJsonSerializerSettings serializers) { data.Blob = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(blob, serializers.GetSerializer(data.GetPaymentMethodId().CryptoCode))); }
public static PayoutBlob GetBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers) { return(JsonConvert.DeserializeObject <PayoutBlob>(Encoding.UTF8.GetString(data.Blob), serializers.GetSerializer(data.GetPaymentMethodId().CryptoCode))); }
public static PaymentMethodId GetPaymentMethodId(this PayoutData data) { return(PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId)? paymentMethodId : null); }
public static PaymentMethodId GetPaymentMethodId(this PayoutData data) { return(PaymentMethodId.Parse(data.PaymentMethodId)); }
//we group per store and init the transfers by each async Task <bool> TrypayBolt(ILightningClient lightningClient, PayoutBlob payoutBlob, PayoutData payoutData, BOLT11PaymentRequest bolt11PaymentRequest) { var boltAmount = bolt11PaymentRequest.MinimumAmount.ToDecimal(LightMoneyUnit.BTC); if (boltAmount != payoutBlob.CryptoAmount) { return(false); } var result = await lightningClient.Pay(bolt11PaymentRequest.ToString()); return(result.Result == PayResult.Ok); }
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); NotificationData.OnModelCreating(builder); builder.Entity <InvoiceData>() .HasOne(o => o.StoreData) .WithMany(a => a.Invoices).OnDelete(DeleteBehavior.Cascade); builder.Entity <InvoiceData>().HasIndex(o => o.StoreDataId); builder.Entity <PaymentData>() .HasOne(o => o.InvoiceData) .WithMany(i => i.Payments).OnDelete(DeleteBehavior.Cascade); builder.Entity <PaymentData>() .HasIndex(o => o.InvoiceDataId); builder.Entity <RefundAddressesData>() .HasOne(o => o.InvoiceData) .WithMany(i => i.RefundAddresses).OnDelete(DeleteBehavior.Cascade); builder.Entity <RefundAddressesData>() .HasIndex(o => o.InvoiceDataId); builder.Entity <UserStore>() .HasOne(o => o.StoreData) .WithMany(i => i.UserStores).OnDelete(DeleteBehavior.Cascade); builder.Entity <UserStore>() .HasKey(t => new { t.ApplicationUserId, t.StoreDataId }); builder.Entity <APIKeyData>() .HasOne(o => o.StoreData) .WithMany(i => i.APIKeys) .HasForeignKey(i => i.StoreId).OnDelete(DeleteBehavior.Cascade); builder.Entity <APIKeyData>() .HasOne(o => o.User) .WithMany(i => i.APIKeys) .HasForeignKey(i => i.UserId).OnDelete(DeleteBehavior.Cascade); builder.Entity <APIKeyData>() .HasIndex(o => o.StoreId); builder.Entity <AppData>() .HasOne(o => o.StoreData) .WithMany(i => i.Apps).OnDelete(DeleteBehavior.Cascade); builder.Entity <AppData>() .HasOne(a => a.StoreData); builder.Entity <UserStore>() .HasOne(pt => pt.ApplicationUser) .WithMany(p => p.UserStores) .HasForeignKey(pt => pt.ApplicationUserId); builder.Entity <UserStore>() .HasOne(pt => pt.StoreData) .WithMany(t => t.UserStores) .HasForeignKey(pt => pt.StoreDataId); builder.Entity <AddressInvoiceData>() .HasOne(o => o.InvoiceData) .WithMany(i => i.AddressInvoices).OnDelete(DeleteBehavior.Cascade); builder.Entity <AddressInvoiceData>() #pragma warning disable CS0618 .HasKey(o => o.Address); #pragma warning restore CS0618 builder.Entity <PairingCodeData>() .HasKey(o => o.Id); builder.Entity <PendingInvoiceData>() .HasOne(o => o.InvoiceData) .WithMany(o => o.PendingInvoices) .HasForeignKey(o => o.Id).OnDelete(DeleteBehavior.Cascade); builder.Entity <PairedSINData>() .HasOne(o => o.StoreData) .WithMany(i => i.PairedSINs).OnDelete(DeleteBehavior.Cascade); builder.Entity <PairedSINData>(b => { b.HasIndex(o => o.SIN); b.HasIndex(o => o.StoreDataId); }); builder.Entity <HistoricalAddressInvoiceData>() .HasOne(o => o.InvoiceData) .WithMany(i => i.HistoricalAddressInvoices).OnDelete(DeleteBehavior.Cascade); builder.Entity <HistoricalAddressInvoiceData>() .HasKey(o => new { o.InvoiceDataId, #pragma warning disable CS0618 o.Address #pragma warning restore CS0618 }); builder.Entity <InvoiceEventData>() .HasOne(o => o.InvoiceData) .WithMany(i => i.Events).OnDelete(DeleteBehavior.Cascade); builder.Entity <InvoiceEventData>() .HasKey(o => new { o.InvoiceDataId, #pragma warning disable CS0618 o.UniqueId #pragma warning restore CS0618 }); builder.Entity <PaymentRequestData>() .HasOne(o => o.StoreData) .WithMany(i => i.PaymentRequests) .OnDelete(DeleteBehavior.Cascade); builder.Entity <PaymentRequestData>() .Property(e => e.Created) .HasDefaultValue(new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero)); builder.Entity <PaymentRequestData>() .HasIndex(o => o.Status); builder.Entity <WalletTransactionData>() .HasKey(o => new { o.WalletDataId, #pragma warning disable CS0618 o.TransactionId #pragma warning restore CS0618 }); builder.Entity <WalletTransactionData>() .HasOne(o => o.WalletData) .WithMany(w => w.WalletTransactions).OnDelete(DeleteBehavior.Cascade); PullPaymentData.OnModelCreating(builder); PayoutData.OnModelCreating(builder); if (Database.IsSqlite() && !_designTime) { // SQLite does not have proper support for DateTimeOffset via Entity Framework Core, see the limitations // here: https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations#query-limitations // To work around this, when the Sqlite database provider is used, all model properties of type DateTimeOffset // use the DateTimeOffsetToBinaryConverter // Based on: https://github.com/aspnet/EntityFrameworkCore/issues/10784#issuecomment-415769754 // This only supports millisecond precision, but should be sufficient for most use cases. foreach (var entityType in builder.Model.GetEntityTypes()) { var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(DateTimeOffset)); foreach (var property in properties) { builder .Entity(entityType.Name) .Property(property.Name) .HasConversion(new Microsoft.EntityFrameworkCore.Storage.ValueConversion.DateTimeOffsetToBinaryConverter()); } } } }
//we group per store and init the transfers by each async Task <bool> TrypayBolt(ILightningClient lightningClient, PayoutBlob payoutBlob, PayoutData payoutData, BOLT11PaymentRequest bolt11PaymentRequest) { return((await UILightningLikePayoutController.TrypayBolt(lightningClient, payoutBlob, payoutData, bolt11PaymentRequest, payoutData.GetPaymentMethodId())).Result == PayResult.Ok); }