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);
    }
Example #2
0
        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());
                    }
                }
            }
        }
Example #3
0
 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;
        }
    }
Example #5
0
    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);
    }
Example #6
0
        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;
            }
        }
Example #7
0
 public static void SetBlob(this PayoutData data, PayoutBlob blob, BTCPayNetworkJsonSerializerSettings serializers)
 {
     data.Blob = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(blob, serializers.GetSerializer(data.GetPaymentMethodId().CryptoCode)));
 }
Example #8
0
 public static PayoutBlob GetBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers)
 {
     return(JsonConvert.DeserializeObject <PayoutBlob>(Encoding.UTF8.GetString(data.Blob), serializers.GetSerializer(data.GetPaymentMethodId().CryptoCode)));
 }
Example #9
0
 public static PaymentMethodId GetPaymentMethodId(this PayoutData data)
 {
     return(PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId)? paymentMethodId : null);
 }
Example #10
0
 public static PaymentMethodId GetPaymentMethodId(this PayoutData data)
 {
     return(PaymentMethodId.Parse(data.PaymentMethodId));
 }
Example #11
0
    //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());
                    }
                }
            }
        }
Example #13
0
 //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);
 }