Exemplo n.º 1
0
        public void CheckRatesProvider()
        {
            var coinAverage = new CoinAverageRateProvider("BTC");
            var jpy         = coinAverage.GetRateAsync("JPY").GetAwaiter().GetResult();
            var jpy2        = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/"))).GetRateAsync("JPY").GetAwaiter().GetResult();

            var cached = new CachedRateProvider("BTC", coinAverage, new MemoryCache(new MemoryCacheOptions()
            {
                ExpirationScanFrequency = TimeSpan.FromSeconds(1.0)
            }));

            cached.CacheSpan = TimeSpan.FromSeconds(10);
            var a = cached.GetRateAsync("JPY").GetAwaiter().GetResult();
            var b = cached.GetRateAsync("JPY").GetAwaiter().GetResult();
            //Manually check that cache get hit after 10 sec
            var c = cached.GetRateAsync("JPY").GetAwaiter().GetResult();

            var bitstamp = new CoinAverageRateProvider("BTC")
            {
                Exchange = "bitstamp"
            };
            var bitstampRate = bitstamp.GetRateAsync("USD").GetAwaiter().GetResult();

            Assert.Throws <RateUnavailableException>(() => bitstamp.GetRateAsync("XXXXX").GetAwaiter().GetResult());
        }
Exemplo n.º 2
0
        public void CheckRatesProvider()
        {
            var coinAverage = new CoinAverageRateProvider();
            var jpy         = coinAverage.GetRateAsync("JPY").GetAwaiter().GetResult();
            var jpy2        = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/"))).GetRateAsync("JPY").GetAwaiter().GetResult();

            var cached = new CachedRateProvider(coinAverage, new MemoryCache(new MemoryCacheOptions()
            {
                ExpirationScanFrequency = TimeSpan.FromSeconds(1.0)
            }));

            cached.CacheSpan = TimeSpan.FromSeconds(10);
            var a = cached.GetRateAsync("JPY").GetAwaiter().GetResult();
            var b = cached.GetRateAsync("JPY").GetAwaiter().GetResult();
            //Manually check that cache get hit after 10 sec
            var c = cached.GetRateAsync("JPY").GetAwaiter().GetResult();
        }
Exemplo n.º 3
0
        public void InitBitcoin()
        {
            var nbxplorerNetwork = NBXplorerNetworkProvider.GetFromCryptoCode("BTC");
            var coinaverage      = new CoinAverageRateProvider("BTC");
            var bitpay           = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
            var btcRate          = new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay });

            Add(new BTCPayNetwork()
            {
                CryptoCode          = nbxplorerNetwork.CryptoCode,
                BlockExplorerLink   = NBXplorerNetworkProvider.ChainType == ChainType.Main? "https://www.smartbit.com.au/tx/{0}" : "https://testnet.smartbit.com.au/tx/{0}",
                NBitcoinNetwork     = nbxplorerNetwork.NBitcoinNetwork,
                NBXplorerNetwork    = nbxplorerNetwork,
                UriScheme           = "bitcoin",
                DefaultRateProvider = btcRate,
                CryptoImagePath     = "imlegacy/bitcoin-symbol.svg",
                DefaultSettings     = BTCPayDefaultSettings.GetDefaultSettings(NBXplorerNetworkProvider.ChainType)
            });
        }
Exemplo n.º 4
0
        public static IServiceCollection AddBTCPayServer(this IServiceCollection services)
        {
            services.AddDbContext <ApplicationDbContext>((provider, o) =>
            {
                var factory = provider.GetRequiredService <ApplicationDbContextFactory>();
                factory.ConfigureBuilder(o);
            });
            services.TryAddSingleton <SettingsRepository>();
            services.TryAddSingleton <InvoicePaymentNotification>();
            services.TryAddSingleton <BTCPayServerOptions>(o => o.GetRequiredService <IOptions <BTCPayServerOptions> >().Value);
            services.TryAddSingleton <InvoiceRepository>(o =>
            {
                var opts      = o.GetRequiredService <BTCPayServerOptions>();
                var dbContext = o.GetRequiredService <ApplicationDbContextFactory>();
                var dbpath    = Path.Combine(opts.DataDir, "InvoiceDB");
                if (!Directory.Exists(dbpath))
                {
                    Directory.CreateDirectory(dbpath);
                }
                return(new InvoiceRepository(dbContext, dbpath, opts.Network));
            });
            services.AddSingleton <BTCPayServerEnvironment>();
            services.TryAddSingleton <TokenRepository>();
            services.TryAddSingleton <EventAggregator>();
            services.TryAddSingleton <ApplicationDbContextFactory>(o =>
            {
                var opts = o.GetRequiredService <BTCPayServerOptions>();
                ApplicationDbContextFactory dbContext = null;
                if (opts.PostgresConnectionString == null)
                {
                    var connStr = "Data Source=" + Path.Combine(opts.DataDir, "sqllite.db");
                    Logs.Configuration.LogInformation($"SQLite DB used ({connStr})");
                    dbContext = new ApplicationDbContextFactory(DatabaseType.Sqlite, connStr);
                }
                else
                {
                    Logs.Configuration.LogInformation($"Postgres DB used ({opts.PostgresConnectionString})");
                    dbContext = new ApplicationDbContextFactory(DatabaseType.Postgres, opts.PostgresConnectionString);
                }
                return(dbContext);
            });

            services.TryAddSingleton <BTCPayNetworkProvider>(o =>
            {
                var opts = o.GetRequiredService <BTCPayServerOptions>();
                return(new BTCPayNetworkProvider(opts.Network));
            });

            services.TryAddSingleton <StoreRepository>();
            services.TryAddSingleton <BTCPayWallet>();
            services.TryAddSingleton <CurrencyNameTable>();
            services.TryAddSingleton <IFeeProviderFactory>(o => new NBXplorerFeeProviderFactory(o.GetRequiredService <ExplorerClient>())
            {
                Fallback    = new FeeRate(100, 1),
                BlockTarget = 20
            });

            services.TryAddSingleton <NBXplorerWaiterAccessor>();
            services.AddSingleton <IHostedService, NBXplorerWaiter>();
            services.TryAddSingleton <ExplorerClient>(o =>
            {
                var opts     = o.GetRequiredService <BTCPayServerOptions>();
                var explorer = new ExplorerClient(opts.Network, opts.Explorer);
                if (!explorer.SetCookieAuth(opts.CookieFile))
                {
                    explorer.SetNoAuth();
                }
                return(explorer);
            });
            services.TryAddSingleton <Bitpay>(o =>
            {
                if (o.GetRequiredService <BTCPayServerOptions>().Network == Network.Main)
                {
                    return(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
                }
                else
                {
                    return(new Bitpay(new Key(), new Uri("https://test.bitpay.com/")));
                }
            });
            services.TryAddSingleton <IRateProvider>(o =>
            {
                var coinaverage = new CoinAverageRateProvider();
                var bitpay      = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
                return(new CachedRateProvider(new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay }), o.GetRequiredService <IMemoryCache>())
                {
                    CacheSpan = TimeSpan.FromMinutes(1.0)
                });
            });

            services.AddSingleton <IHostedService, InvoiceNotificationManager>();

            services.TryAddSingleton <InvoiceWatcherAccessor>();
            services.AddSingleton <IHostedService, InvoiceWatcher>();
            services.TryAddSingleton <Initializer>();
            services.TryAddScoped <IHttpContextAccessor, HttpContextAccessor>();
            services.TryAddSingleton <IAuthorizationHandler, OwnStoreHandler>();
            services.AddTransient <AccessTokenController>();
            services.AddTransient <CallbackController>();
            services.AddTransient <InvoiceController>();
            // Add application services.
            services.AddTransient <IEmailSender, EmailSender>();

            services.AddAuthorization(o =>
            {
                o.AddPolicy("CanAccessStore", builder =>
                {
                    builder.AddRequirements(new OwnStoreAuthorizationRequirement());
                });

                o.AddPolicy("OwnStore", builder =>
                {
                    builder.AddRequirements(new OwnStoreAuthorizationRequirement("Owner"));
                });
            });

            return(services);
        }
        public BTCPayNetworkProvider(Network network)
        {
            var coinaverage = new CoinAverageRateProvider("BTC");
            var bitpay      = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
            var btcRate     = new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay });

            var ltcRate = new CoinAverageRateProvider("LTC");

            if (network == Network.Main)
            {
                Add(new BTCPayNetwork()
                {
                    CryptoCode          = "BTC",
                    BlockExplorerLink   = "https://www.smartbit.com.au/tx/{0}",
                    NBitcoinNetwork     = Network.Main,
                    UriScheme           = "bitcoin",
                    DefaultRateProvider = btcRate,
                    CryptoImagePath     = "imlegacy/bitcoin-symbol.svg"
                });
                Add(new BTCPayNetwork()
                {
                    CryptoCode          = "LTC",
                    BlockExplorerLink   = "https://live.blockcypher.com/ltc/tx/{0}/",
                    NBitcoinNetwork     = NBXplorer.Altcoins.Litecoin.Networks.Mainnet,
                    UriScheme           = "litecoin",
                    DefaultRateProvider = ltcRate,
                    CryptoImagePath     = "imlegacy/litecoin-symbol.svg"
                });
            }

            if (network == Network.TestNet)
            {
                Add(new BTCPayNetwork()
                {
                    CryptoCode          = "BTC",
                    BlockExplorerLink   = "https://testnet.smartbit.com.au/tx/{0}",
                    NBitcoinNetwork     = Network.TestNet,
                    UriScheme           = "bitcoin",
                    DefaultRateProvider = btcRate,
                    CryptoImagePath     = "imlegacy/bitcoin-symbol.svg"
                });
                Add(new BTCPayNetwork()
                {
                    CryptoCode          = "LTC",
                    BlockExplorerLink   = "http://explorer.litecointools.com/tx/{0}",
                    NBitcoinNetwork     = NBXplorer.Altcoins.Litecoin.Networks.Testnet,
                    UriScheme           = "litecoin",
                    DefaultRateProvider = ltcRate,
                    CryptoImagePath     = "imlegacy/litecoin-symbol.svg"
                });
            }

            if (network == Network.RegTest)
            {
                Add(new BTCPayNetwork()
                {
                    CryptoCode          = "BTC",
                    BlockExplorerLink   = "https://testnet.smartbit.com.au/tx/{0}",
                    NBitcoinNetwork     = Network.RegTest,
                    UriScheme           = "bitcoin",
                    DefaultRateProvider = btcRate,
                    CryptoImagePath     = "imlegacy/bitcoin-symbol.svg"
                });
                Add(new BTCPayNetwork()
                {
                    CryptoCode          = "LTC",
                    BlockExplorerLink   = "http://explorer.litecointools.com/tx/{0}",
                    NBitcoinNetwork     = NBXplorer.Altcoins.Litecoin.Networks.Regtest,
                    UriScheme           = "litecoin",
                    DefaultRateProvider = ltcRate,
                    CryptoImagePath     = "imlegacy/litecoin-symbol.svg"
                });
            }
        }
        public static IServiceCollection AddBTCPayServer(this IServiceCollection services)
        {
            services.AddDbContext <ApplicationDbContext>((provider, o) =>
            {
                var factory = provider.GetRequiredService <ApplicationDbContextFactory>();
                factory.ConfigureBuilder(o);
            });
            services.TryAddSingleton <SettingsRepository>();
            services.TryAddSingleton <InvoicePaymentNotification>();
            services.TryAddSingleton <BTCPayServerOptions>(o => o.GetRequiredService <IOptions <BTCPayServerOptions> >().Value);
            services.TryAddSingleton <IConfigureOptions <MvcOptions>, BTCPayServerConfigureOptions>();
            services.TryAddSingleton(o =>
            {
                var runtime = new BTCPayServerRuntime();
                runtime.Configure(o.GetRequiredService <BTCPayServerOptions>());
                return(runtime);
            });
            services.AddSingleton <BTCPayServerEnvironment>();
            services.TryAddSingleton <TokenRepository>();
            services.TryAddSingleton(o => o.GetRequiredService <BTCPayServerRuntime>().InvoiceRepository);
            services.TryAddSingleton <Network>(o => o.GetRequiredService <BTCPayServerOptions>().Network);
            services.TryAddSingleton <ApplicationDbContextFactory>(o => o.GetRequiredService <BTCPayServerRuntime>().DBFactory);
            services.TryAddSingleton <StoreRepository>();
            services.TryAddSingleton <BTCPayWallet>();
            services.TryAddSingleton <CurrencyNameTable>();
            services.TryAddSingleton <IFeeProvider>(o => new NBXplorerFeeProvider()
            {
                Fallback       = new FeeRate(100, 1),
                BlockTarget    = 20,
                ExplorerClient = o.GetRequiredService <ExplorerClient>()
            });
            services.TryAddSingleton <ExplorerClient>(o =>
            {
                var runtime = o.GetRequiredService <BTCPayServerRuntime>();
                return(runtime.Explorer);
            });
            services.TryAddSingleton <Bitpay>(o =>
            {
                if (o.GetRequiredService <BTCPayServerOptions>().Network == Network.Main)
                {
                    return(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
                }
                else
                {
                    return(new Bitpay(new Key(), new Uri("https://test.bitpay.com/")));
                }
            });
            services.TryAddSingleton <IRateProvider>(o =>
            {
                var coinaverage = new CoinAverageRateProvider();
                var bitpay      = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/")));
                return(new CachedRateProvider(new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay }), o.GetRequiredService <IMemoryCache>())
                {
                    CacheSpan = TimeSpan.FromMinutes(1.0)
                });
            });
            services.TryAddSingleton <InvoiceWatcher>();
            services.TryAddSingleton <InvoiceNotificationManager>();
            services.TryAddSingleton <IHostedService>(o => o.GetRequiredService <InvoiceWatcher>());
            services.TryAddScoped <IHttpContextAccessor, HttpContextAccessor>();
            services.TryAddSingleton <IAuthorizationHandler, OwnStoreHandler>();
            services.AddTransient <AccessTokenController>();
            services.AddTransient <CallbackController>();
            services.AddTransient <InvoiceController>();
            // Add application services.
            services.AddTransient <IEmailSender, EmailSender>();

            services.AddAuthorization(o =>
            {
                o.AddPolicy("CanAccessStore", builder =>
                {
                    builder.AddRequirements(new OwnStoreAuthorizationRequirement());
                });

                o.AddPolicy("OwnStore", builder =>
                {
                    builder.AddRequirements(new OwnStoreAuthorizationRequirement("Owner"));
                });
            });

            return(services);
        }