Esempio n. 1
0
 public StoresController(
     IServiceProvider serviceProvider,
     BTCPayServerOptions btcpayServerOptions,
     BTCPayServerEnvironment btcpayEnv,
     StoreRepository repo,
     TokenRepository tokenRepo,
     UserManager <ApplicationUser> userManager,
     AccessTokenController tokenController,
     BTCPayWalletProvider walletProvider,
     BTCPayNetworkProvider networkProvider,
     RateFetcher rateFactory,
     ExplorerClientProvider explorerProvider,
     IFeeProviderFactory feeRateProvider,
     LanguageService langService,
     IHostingEnvironment env,
     InvoiceController invoiceController)
 {
     _RateFactory         = rateFactory;
     _Repo                = repo;
     _TokenRepository     = tokenRepo;
     _UserManager         = userManager;
     _LangService         = langService;
     _TokenController     = tokenController;
     _WalletProvider      = walletProvider;
     _Env                 = env;
     _NetworkProvider     = networkProvider;
     _ExplorerProvider    = explorerProvider;
     _FeeRateProvider     = feeRateProvider;
     _ServiceProvider     = serviceProvider;
     _BtcpayServerOptions = btcpayServerOptions;
     _BTCPayEnv           = btcpayEnv;
     _InvoiceController   = invoiceController;
 }
Esempio n. 2
0
 public StoresController(
     NBXplorerDashboard dashboard,
     IServiceProvider serviceProvider,
     BTCPayServerOptions btcpayServerOptions,
     BTCPayServerEnvironment btcpayEnv,
     IOptions <MvcJsonOptions> mvcJsonOptions,
     StoreRepository repo,
     TokenRepository tokenRepo,
     UserManager <ApplicationUser> userManager,
     AccessTokenController tokenController,
     BTCPayWalletProvider walletProvider,
     BTCPayNetworkProvider networkProvider,
     BTCPayRateProviderFactory rateFactory,
     ExplorerClientProvider explorerProvider,
     IFeeProviderFactory feeRateProvider,
     LanguageService langService,
     IHostingEnvironment env)
 {
     _RateFactory         = rateFactory;
     _Dashboard           = dashboard;
     _Repo                = repo;
     _TokenRepository     = tokenRepo;
     _UserManager         = userManager;
     _LangService         = langService;
     _TokenController     = tokenController;
     _WalletProvider      = walletProvider;
     _Env                 = env;
     _NetworkProvider     = networkProvider;
     _ExplorerProvider    = explorerProvider;
     _MvcJsonOptions      = mvcJsonOptions.Value;
     _FeeRateProvider     = feeRateProvider;
     _ServiceProvider     = serviceProvider;
     _BtcpayServerOptions = btcpayServerOptions;
     _BTCPayEnv           = btcpayEnv;
 }
Esempio n. 3
0
 public StoresController(
     IServiceProvider serviceProvider,
     IOptions <MvcJsonOptions> mvcJsonOptions,
     StoreRepository repo,
     TokenRepository tokenRepo,
     UserManager <ApplicationUser> userManager,
     AccessTokenController tokenController,
     BTCPayWalletProvider walletProvider,
     BTCPayNetworkProvider networkProvider,
     ExplorerClientProvider explorerProvider,
     IFeeProviderFactory feeRateProvider,
     IHostingEnvironment env)
 {
     _Repo             = repo;
     _TokenRepository  = tokenRepo;
     _UserManager      = userManager;
     _TokenController  = tokenController;
     _WalletProvider   = walletProvider;
     _Env              = env;
     _NetworkProvider  = networkProvider;
     _ExplorerProvider = explorerProvider;
     _MvcJsonOptions   = mvcJsonOptions.Value;
     _FeeRateProvider  = feeRateProvider;
     _ServiceProvider  = serviceProvider;
 }
Esempio n. 4
0
 public WalletsController(StoreRepository repo,
                          AtomicSwapRepository atomicSwapRepository,
                          WalletRepository walletRepository,
                          CurrencyNameTable currencyTable,
                          BTCPayNetworkProvider networkProvider,
                          UserManager <ApplicationUser> userManager,
                          MvcNewtonsoftJsonOptions mvcJsonOptions,
                          NBXplorerDashboard dashboard,
                          RateFetcher rateProvider,
                          IAuthorizationService authorizationService,
                          ExplorerClientProvider explorerProvider,
                          IFeeProviderFactory feeRateProvider,
                          BTCPayWalletProvider walletProvider,
                          AtomicSwapClientFactory atomicSwapClientFactory)
 {
     _currencyTable          = currencyTable;
     Repository              = repo;
     WalletRepository        = walletRepository;
     RateFetcher             = rateProvider;
     _authorizationService   = authorizationService;
     NetworkProvider         = networkProvider;
     _userManager            = userManager;
     _serializerSettings     = mvcJsonOptions.SerializerSettings;
     _dashboard              = dashboard;
     ExplorerClientProvider  = explorerProvider;
     _feeRateProvider        = feeRateProvider;
     _walletProvider         = walletProvider;
     AtomicSwapClientFactory = atomicSwapClientFactory;
     AtomicSwapRepository    = atomicSwapRepository;
 }
Esempio n. 5
0
        public async Task <CreatePSBTResponse> CreatePSBT(BTCPayNetwork network, DerivationSchemeSettings derivationSettings, WalletSendModel sendModel, CancellationToken cancellationToken)
        {
            var nbx = ExplorerClientProvider.GetExplorerClient(network);
            CreatePSBTRequest psbtRequest = new CreatePSBTRequest();

            foreach (var transactionOutput in sendModel.Outputs)
            {
                var psbtDestination = new CreatePSBTDestination();
                psbtRequest.Destinations.Add(psbtDestination);
                psbtDestination.Destination   = BitcoinAddress.Create(transactionOutput.DestinationAddress, network.NBitcoinNetwork);
                psbtDestination.Amount        = Money.Coins(transactionOutput.Amount.Value);
                psbtDestination.SubstractFees = transactionOutput.SubtractFeesFromOutput;
            }

            if (network.SupportRBF)
            {
                psbtRequest.RBF = !sendModel.DisableRBF;
            }

            psbtRequest.FeePreference = new FeePreference();
            psbtRequest.FeePreference.ExplicitFeeRate = new FeeRate(Money.Satoshis(sendModel.FeeSatoshiPerByte), 1);
            if (sendModel.NoChange)
            {
                psbtRequest.ExplicitChangeAddress = psbtRequest.Destinations.First().Destination;
            }

            var psbt = (await nbx.CreatePSBTAsync(derivationSettings.AccountDerivation, psbtRequest, cancellationToken));

            if (psbt == null)
            {
                throw new NotSupportedException("Necesitas actualizar tu versión de NBXplorer");
            }
            return(psbt);
        }
Esempio n. 6
0
 public NBXplorerWaiters(NBXplorerDashboard dashboard, ExplorerClientProvider explorerClientProvider, EventAggregator eventAggregator)
 {
     foreach (var explorer in explorerClientProvider.GetAll())
     {
         _Waiters.Add(new NBXplorerWaiter(dashboard, explorer.Item1, explorer.Item2, eventAggregator));
     }
 }
Esempio n. 7
0
        public async Task <IActionResult> WalletRescan(
            [ModelBinder(typeof(WalletIdModelBinder))]
            WalletId walletId, RescanWalletModel vm)
        {
            if (walletId?.StoreId == null)
            {
                return(NotFound());
            }
            DerivationSchemeSettings paymentMethod = GetDerivationSchemeSettings(walletId);

            if (paymentMethod == null)
            {
                return(NotFound());
            }
            var explorer = ExplorerClientProvider.GetExplorerClient(walletId.CryptoCode);

            try
            {
                await explorer.ScanUTXOSetAsync(paymentMethod.AccountDerivation, vm.BatchSize, vm.GapLimit, vm.StartingIndex);
            }
            catch (NBXplorerException ex) when(ex.Error.Code == "scanutxoset-in-progress")
            {
            }
            return(RedirectToAction());
        }
 public GreenfieldStoreOnChainWalletsController(
     IAuthorizationService authorizationService,
     BTCPayWalletProvider btcPayWalletProvider,
     BTCPayNetworkProvider btcPayNetworkProvider,
     WalletRepository walletRepository,
     ExplorerClientProvider explorerClientProvider,
     NBXplorerDashboard nbXplorerDashboard,
     PoliciesSettings policiesSettings,
     UIWalletsController walletsController,
     PayjoinClient payjoinClient,
     DelayedTransactionBroadcaster delayedTransactionBroadcaster,
     EventAggregator eventAggregator,
     WalletReceiveService walletReceiveService,
     IFeeProviderFactory feeProviderFactory,
     LabelFactory labelFactory
     )
 {
     _authorizationService          = authorizationService;
     _btcPayWalletProvider          = btcPayWalletProvider;
     _btcPayNetworkProvider         = btcPayNetworkProvider;
     _walletRepository              = walletRepository;
     _explorerClientProvider        = explorerClientProvider;
     PoliciesSettings               = policiesSettings;
     _nbXplorerDashboard            = nbXplorerDashboard;
     _walletsController             = walletsController;
     _payjoinClient                 = payjoinClient;
     _delayedTransactionBroadcaster = delayedTransactionBroadcaster;
     _eventAggregator               = eventAggregator;
     _walletReceiveService          = walletReceiveService;
     _feeProviderFactory            = feeProviderFactory;
     _labelFactory = labelFactory;
 }
        public async Task <CreatePSBTResponse> CreatePSBT(BTCPayNetwork network, DerivationSchemeSettings derivationSettings, WalletSendModel sendModel, CancellationToken cancellationToken)
        {
            var nbx = ExplorerClientProvider.GetExplorerClient(network);
            CreatePSBTRequest     psbtRequest     = new CreatePSBTRequest();
            CreatePSBTDestination psbtDestination = new CreatePSBTDestination();

            psbtRequest.Destinations.Add(psbtDestination);
            if (network.SupportRBF)
            {
                psbtRequest.RBF = !sendModel.DisableRBF;
            }
            psbtDestination.Destination = BitcoinAddress.Create(sendModel.Destination, network.NBitcoinNetwork);
            psbtDestination.Amount      = Money.Coins(sendModel.Amount.Value);
            psbtRequest.FeePreference   = new FeePreference();
            psbtRequest.FeePreference.ExplicitFeeRate = new FeeRate(Money.Satoshis(sendModel.FeeSatoshiPerByte), 1);
            if (sendModel.NoChange)
            {
                psbtRequest.ExplicitChangeAddress = psbtDestination.Destination;
            }
            psbtDestination.SubstractFees = sendModel.SubstractFees;
            var psbt = (await nbx.CreatePSBTAsync(derivationSettings.AccountDerivation, psbtRequest, cancellationToken));

            if (psbt == null)
            {
                throw new NotSupportedException("You need to update your version of NBXplorer");
            }
            return(psbt);
        }
Esempio n. 10
0
        public async Task <IActionResult> WalletPSBT(
            [ModelBinder(typeof(WalletIdModelBinder))]
            WalletId walletId,
            WalletPSBTViewModel vm, string command = null)
        {
            var network = NetworkProvider.GetNetwork(walletId.CryptoCode);
            var psbt    = vm.GetPSBT(network.NBitcoinNetwork);

            if (psbt == null)
            {
                ModelState.AddModelError(nameof(vm.PSBT), "Invalid PSBT");
                return(View(vm));
            }

            if (command == null)
            {
                vm.Decoded  = psbt.ToString();
                vm.FileName = string.Empty;
                return(View(vm));
            }
            else if (command == "ledger")
            {
                return(ViewWalletSendLedger(psbt));
            }
            else if (command == "broadcast")
            {
                if (!psbt.IsAllFinalized() && !psbt.TryFinalize(out var errors))
                {
                    return(ViewPSBT(psbt, errors));
                }
                var transaction = psbt.ExtractTransaction();
                try
                {
                    var broadcastResult = await ExplorerClientProvider.GetExplorerClient(network).BroadcastAsync(transaction);

                    if (!broadcastResult.Success)
                    {
                        return(ViewPSBT(psbt, new[] { $"RPC Error while broadcasting: {broadcastResult.RPCCode} {broadcastResult.RPCCodeMessage} {broadcastResult.RPCMessage}" }));
                    }
                }
                catch (Exception ex)
                {
                    return(ViewPSBT(psbt, "Error while broadcasting: " + ex.Message));
                }
                return(await RedirectToWalletTransaction(walletId, transaction));
            }
            else if (command == "combine")
            {
                ModelState.Remove(nameof(vm.PSBT));
                return(View(nameof(WalletPSBTCombine), new WalletPSBTCombineViewModel()
                {
                    OtherPSBT = psbt.ToBase64()
                }));
            }
            else if (command == "save-psbt")
            {
                return(FilePSBT(psbt, vm.FileName));
            }
            return(View(vm));
        }
Esempio n. 11
0
        public async Task <IActionResult> WalletRescan(
            [ModelBinder(typeof(WalletIdModelBinder))]
            WalletId walletId, RescanWalletModel vm)
        {
            if (walletId?.StoreId == null)
            {
                return(NotFound());
            }
            var store = await Repository.FindStore(walletId.StoreId, GetUserId());

            DerivationStrategy paymentMethod = GetPaymentMethod(walletId, store);

            if (paymentMethod == null)
            {
                return(NotFound());
            }
            var explorer = ExplorerClientProvider.GetExplorerClient(walletId.CryptoCode);

            try
            {
                await explorer.ScanUTXOSetAsync(paymentMethod.DerivationStrategyBase, vm.BatchSize, vm.GapLimit, vm.StartingIndex);
            }
            catch (NBXplorerException ex) when(ex.Error.Code == "scanutxoset-in-progress")
            {
            }
            return(RedirectToAction());
        }
 public StoreOnChainWalletsController(
     IAuthorizationService authorizationService,
     BTCPayWalletProvider btcPayWalletProvider,
     BTCPayNetworkProvider btcPayNetworkProvider,
     WalletRepository walletRepository,
     ExplorerClientProvider explorerClientProvider,
     CssThemeManager cssThemeManager,
     NBXplorerDashboard nbXplorerDashboard,
     WalletsController walletsController,
     PayjoinClient payjoinClient,
     DelayedTransactionBroadcaster delayedTransactionBroadcaster,
     EventAggregator eventAggregator,
     WalletReceiveService walletReceiveService)
 {
     _authorizationService          = authorizationService;
     _btcPayWalletProvider          = btcPayWalletProvider;
     _btcPayNetworkProvider         = btcPayNetworkProvider;
     _walletRepository              = walletRepository;
     _explorerClientProvider        = explorerClientProvider;
     _cssThemeManager               = cssThemeManager;
     _nbXplorerDashboard            = nbXplorerDashboard;
     _walletsController             = walletsController;
     _payjoinClient                 = payjoinClient;
     _delayedTransactionBroadcaster = delayedTransactionBroadcaster;
     _eventAggregator               = eventAggregator;
     _walletReceiveService          = walletReceiveService;
 }
 public UIInvoiceController(
     InvoiceRepository invoiceRepository,
     CurrencyNameTable currencyNameTable,
     UserManager <ApplicationUser> userManager,
     RateFetcher rateProvider,
     StoreRepository storeRepository,
     EventAggregator eventAggregator,
     ContentSecurityPolicies csp,
     BTCPayNetworkProvider networkProvider,
     PaymentMethodHandlerDictionary paymentMethodHandlerDictionary,
     ApplicationDbContextFactory dbContextFactory,
     PullPaymentHostedService paymentHostedService,
     WebhookSender webhookNotificationManager,
     LanguageService languageService,
     ExplorerClientProvider explorerClients,
     UIWalletsController walletsController)
 {
     _CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable));
     _StoreRepository   = storeRepository ?? throw new ArgumentNullException(nameof(storeRepository));
     _InvoiceRepository = invoiceRepository ?? throw new ArgumentNullException(nameof(invoiceRepository));
     _RateProvider      = rateProvider ?? throw new ArgumentNullException(nameof(rateProvider));
     _UserManager       = userManager;
     _EventAggregator   = eventAggregator;
     _NetworkProvider   = networkProvider;
     _paymentMethodHandlerDictionary = paymentMethodHandlerDictionary;
     _dbContextFactory          = dbContextFactory;
     _paymentHostedService      = paymentHostedService;
     WebhookNotificationManager = webhookNotificationManager;
     _languageService           = languageService;
     this._ExplorerClients      = explorerClients;
     _walletsController         = walletsController;
 }
Esempio n. 14
0
        private async Task <CreatePSBTResponse> CreatePSBT(BTCPayNetwork network, DerivationSchemeSettings derivationSettings, WalletSendLedgerModel sendModel, CancellationToken cancellationToken)
        {
            var nbx = ExplorerClientProvider.GetExplorerClient(network);
            CreatePSBTRequest     psbtRequest     = new CreatePSBTRequest();
            CreatePSBTDestination psbtDestination = new CreatePSBTDestination();

            psbtRequest.Destinations.Add(psbtDestination);
            if (network.SupportRBF)
            {
                psbtRequest.RBF = !sendModel.DisableRBF;
            }
            psbtDestination.Destination = BitcoinAddress.Create(sendModel.Destination, network.NBitcoinNetwork);
            psbtDestination.Amount      = Money.Coins(sendModel.Amount);
            psbtRequest.FeePreference   = new FeePreference();
            psbtRequest.FeePreference.ExplicitFeeRate = new FeeRate(Money.Satoshis(sendModel.FeeSatoshiPerByte), 1);
            if (sendModel.NoChange)
            {
                psbtRequest.ExplicitChangeAddress = psbtDestination.Destination;
            }
            psbtDestination.SubstractFees = sendModel.SubstractFees;

            var psbt = (await nbx.CreatePSBTAsync(derivationSettings.AccountDerivation, psbtRequest, cancellationToken));

            if (psbt == null)
            {
                throw new NotSupportedException("You need to update your version of NBXplorer");
            }

            if (network.MinFee != null)
            {
                psbt.PSBT.TryGetFee(out var fee);
                if (fee < network.MinFee)
                {
                    psbtRequest.FeePreference = new FeePreference()
                    {
                        ExplicitFee = network.MinFee
                    };
                    psbt = (await nbx.CreatePSBTAsync(derivationSettings.AccountDerivation, psbtRequest, cancellationToken));
                }
            }

            if (derivationSettings.AccountKeyPath != null && derivationSettings.AccountKeyPath.Indexes.Length != 0)
            {
                // NBX only know the path relative to the account xpub.
                // Here we rebase the hd_keys in the PSBT to have a keypath relative to the root HD so the wallet can sign
                // Note that the fingerprint of the hd keys are now 0, which is wrong
                // However, hardware wallets does not give a damn, and sometimes does not even allow us to get this fingerprint anyway.
                foreach (var o in psbt.PSBT.Inputs.OfType <PSBTCoin>().Concat(psbt.PSBT.Outputs))
                {
                    var rootFP = derivationSettings.RootFingerprint is HDFingerprint fp ? fp : default;
                    foreach (var keypath in o.HDKeyPaths.ToList())
                    {
                        var newKeyPath = derivationSettings.AccountKeyPath.Derive(keypath.Value.Item2);
                        o.HDKeyPaths.Remove(keypath.Key);
                        o.HDKeyPaths.Add(keypath.Key, Tuple.Create(rootFP, newKeyPath));
                    }
                }
            }
            return(psbt);
        }
Esempio n. 15
0
 public PayJoinEndpointController(BTCPayNetworkProvider btcPayNetworkProvider,
                                  InvoiceRepository invoiceRepository, ExplorerClientProvider explorerClientProvider,
                                  BTCPayWalletProvider btcPayWalletProvider,
                                  PayJoinRepository payJoinRepository,
                                  EventAggregator eventAggregator,
                                  NBXplorerDashboard dashboard,
                                  DelayedTransactionBroadcaster broadcaster,
                                  BTCPayServerEnvironment env,
                                  WalletReceiveService walletReceiveService,
                                  StoreRepository storeRepository,
                                  PaymentService paymentService)
 {
     _btcPayNetworkProvider  = btcPayNetworkProvider;
     _invoiceRepository      = invoiceRepository;
     _explorerClientProvider = explorerClientProvider;
     _btcPayWalletProvider   = btcPayWalletProvider;
     _payJoinRepository      = payJoinRepository;
     _eventAggregator        = eventAggregator;
     _dashboard            = dashboard;
     _broadcaster          = broadcaster;
     _env                  = env;
     _walletReceiveService = walletReceiveService;
     _storeRepository      = storeRepository;
     _paymentService       = paymentService;
 }
 public DelayedTransactionBroadcaster(ExplorerClientProvider explorerClientProvider)
 {
     if (explorerClientProvider == null)
     {
         throw new ArgumentNullException(nameof(explorerClientProvider));
     }
     _explorerClientProvider = explorerClientProvider;
 }
Esempio n. 17
0
 public BTCPayWallet(ExplorerClientProvider client)
 {
     if (client == null)
     {
         throw new ArgumentNullException(nameof(client));
     }
     _Client = client;
 }
 public NBXplorerFeeProviderFactory(ExplorerClientProvider explorerClients)
 {
     if (explorerClients == null)
     {
         throw new ArgumentNullException(nameof(explorerClients));
     }
     _ExplorerClients = explorerClients;
 }
Esempio n. 19
0
        public async Task <IActionResult> WalletPSBTReady(
            [ModelBinder(typeof(WalletIdModelBinder))]
            WalletId walletId, WalletPSBTReadyViewModel vm, string command = null)
        {
            PSBT psbt    = null;
            var  network = NetworkProvider.GetNetwork <BTCPayNetwork>(walletId.CryptoCode);

            try
            {
                psbt = PSBT.Parse(vm.PSBT, network.NBitcoinNetwork);
                var derivationSchemeSettings = await GetDerivationSchemeSettings(walletId);

                if (derivationSchemeSettings == null)
                {
                    return(NotFound());
                }
                await FetchTransactionDetails(derivationSchemeSettings, vm, network);
            }
            catch
            {
                vm.GlobalError = "Invalid PSBT";
                return(View(vm));
            }
            if (command == "broadcast")
            {
                if (!psbt.IsAllFinalized() && !psbt.TryFinalize(out var errors))
                {
                    vm.SetErrors(errors);
                    return(View(vm));
                }
                var transaction = psbt.ExtractTransaction();
                try
                {
                    var broadcastResult = await ExplorerClientProvider.GetExplorerClient(network).BroadcastAsync(transaction);

                    if (!broadcastResult.Success)
                    {
                        vm.GlobalError = $"RPC Error while broadcasting: {broadcastResult.RPCCode} {broadcastResult.RPCCodeMessage} {broadcastResult.RPCMessage}";
                        return(View(vm));
                    }
                }
                catch (Exception ex)
                {
                    vm.GlobalError = "Error while broadcasting: " + ex.Message;
                    return(View(vm));
                }
                return(await RedirectToWalletTransaction(walletId, transaction));
            }
            else if (command == "analyze-psbt")
            {
                return(RedirectToAction(nameof(WalletPSBT), new { walletId = walletId, psbt = psbt.ToBase64() }));
            }
            else
            {
                vm.GlobalError = "Unknown command";
                return(View(vm));
            }
        }
Esempio n. 20
0
 public InvoiceWatcher(
     InvoiceRepository invoiceRepository,
     EventAggregator eventAggregator,
     ExplorerClientProvider explorerClientProvider)
 {
     _InvoiceRepository      = invoiceRepository ?? throw new ArgumentNullException(nameof(invoiceRepository));
     _EventAggregator        = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
     _ExplorerClientProvider = explorerClientProvider;
 }
Esempio n. 21
0
        public async Task <IActionResult> WalletPSBTReady(
            [ModelBinder(typeof(WalletIdModelBinder))]
            WalletId walletId, WalletPSBTReadyViewModel vm, string command = null)
        {
            PSBT psbt    = null;
            var  network = NetworkProvider.GetNetwork(walletId.CryptoCode);

            try
            {
                psbt = PSBT.Parse(vm.PSBT, network.NBitcoinNetwork);
                await FetchTransactionDetails(walletId, vm, network);
            }
            catch
            {
                vm.Errors = new List <string>();
                vm.Errors.Add("Invalid PSBT");
                return(View(vm));
            }
            if (command == "broadcast")
            {
                if (!psbt.IsAllFinalized() && !psbt.TryFinalize(out var errors))
                {
                    vm.Errors = new List <string>();
                    vm.Errors.AddRange(errors.Select(e => e.ToString()));
                    return(View(vm));
                }
                var transaction = psbt.ExtractTransaction();
                try
                {
                    var broadcastResult = await ExplorerClientProvider.GetExplorerClient(network).BroadcastAsync(transaction);

                    if (!broadcastResult.Success)
                    {
                        vm.Errors = new List <string>();
                        vm.Errors.Add($"RPC Error while broadcasting: {broadcastResult.RPCCode} {broadcastResult.RPCCodeMessage} {broadcastResult.RPCMessage}");
                        return(View(vm));
                    }
                }
                catch (Exception ex)
                {
                    vm.Errors = new List <string>();
                    vm.Errors.Add("Error while broadcasting: " + ex.Message);
                    return(View(vm));
                }
                return(await RedirectToWalletTransaction(walletId, transaction));
            }
            else if (command == "analyze-psbt")
            {
                return(RedirectToAction(nameof(WalletPSBT), new { walletId = walletId, psbt = psbt.ToBase64() }));
            }
            else
            {
                vm.Errors = new List <string>();
                vm.Errors.Add("Unknown command");
                return(View(vm));
            }
        }
Esempio n. 22
0
 public PayjoinClient(ExplorerClientProvider explorerClientProvider, IHttpClientFactory httpClientFactory)
 {
     if (httpClientFactory == null)
     {
         throw new ArgumentNullException(nameof(httpClientFactory));
     }
     _explorerClientProvider =
         explorerClientProvider ?? throw new ArgumentNullException(nameof(explorerClientProvider));
     _httpClient = httpClientFactory.CreateClient("payjoin");
 }
 public WalletReceiveService(EventAggregator eventAggregator, ExplorerClientProvider explorerClientProvider,
                             BTCPayWalletProvider btcPayWalletProvider, BTCPayNetworkProvider btcPayNetworkProvider,
                             StoreRepository storeRepository)
 {
     _eventAggregator        = eventAggregator;
     _explorerClientProvider = explorerClientProvider;
     _btcPayWalletProvider   = btcPayWalletProvider;
     _btcPayNetworkProvider  = btcPayNetworkProvider;
     _storeRepository        = storeRepository;
 }
Esempio n. 24
0
 public BitcoinLikePayoutHandler(BTCPayNetworkProvider btcPayNetworkProvider,
                                 ExplorerClientProvider explorerClientProvider, BTCPayNetworkJsonSerializerSettings jsonSerializerSettings,
                                 ApplicationDbContextFactory dbContextFactory, EventAggregator eventAggregator)
 {
     _btcPayNetworkProvider  = btcPayNetworkProvider;
     _explorerClientProvider = explorerClientProvider;
     _jsonSerializerSettings = jsonSerializerSettings;
     _dbContextFactory       = dbContextFactory;
     _eventAggregator        = eventAggregator;
 }
 public BitcoinLikePaymentHandler(ExplorerClientProvider provider,
                                  BTCPayNetworkProvider networkProvider,
                                  IFeeProviderFactory feeRateProviderFactory,
                                  Services.Wallets.BTCPayWalletProvider walletProvider)
 {
     _ExplorerProvider       = provider;
     _networkProvider        = networkProvider;
     _FeeRateProviderFactory = feeRateProviderFactory;
     _WalletProvider         = walletProvider;
 }
        public void SetCryptoCurrencies(ExplorerClientProvider explorerProvider, string defaultCrypto)
        {
            var choices = explorerProvider.GetAll().Select(o => new Format()
            {
                Name = o.Item1.CryptoCode, Value = o.Item1.CryptoCode
            }).ToArray();
            var chosen = choices.FirstOrDefault(f => f.Value == defaultCrypto) ?? choices.FirstOrDefault();

            CryptoCurrencies      = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
            DefaultCryptoCurrency = chosen.Name;
        }
 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;
 }
Esempio n. 28
0
 public NBXplorerListener(ExplorerClientProvider explorerClients,
                          BTCPayWalletProvider wallets,
                          InvoiceRepository invoiceRepository,
                          EventAggregator aggregator, Microsoft.Extensions.Hosting.IApplicationLifetime lifetime)
 {
     PollInterval       = TimeSpan.FromMinutes(1.0);
     _Wallets           = wallets;
     _InvoiceRepository = invoiceRepository;
     _ExplorerClients   = explorerClients;
     _Aggregator        = aggregator;
     _Lifetime          = lifetime;
 }
Esempio n. 29
0
 public NBXplorerListener(ExplorerClientProvider explorerClients,
                          NBXplorerDashboard dashboard,
                          InvoiceRepository invoiceRepository,
                          EventAggregator aggregator, IApplicationLifetime lifetime)
 {
     PollInterval       = TimeSpan.FromMinutes(1.0);
     _Dashboards        = dashboard;
     _InvoiceRepository = invoiceRepository;
     _ExplorerClients   = explorerClients;
     _Aggregator        = aggregator;
     _Lifetime          = lifetime;
 }
Esempio n. 30
0
        public async Task <CreatePSBTResponse> CreatePSBT(BTCPayNetwork network, DerivationSchemeSettings derivationSettings, WalletSendModel sendModel, CancellationToken cancellationToken)
        {
            var nbx = ExplorerClientProvider.GetExplorerClient(network);
            CreatePSBTRequest psbtRequest = new CreatePSBTRequest();

            if (sendModel.InputSelection)
            {
                psbtRequest.IncludeOnlyOutpoints = sendModel.SelectedInputs?.Select(OutPoint.Parse)?.ToList() ?? new List <OutPoint>();
            }
            foreach (var transactionOutput in sendModel.Outputs)
            {
                var psbtDestination = new CreatePSBTDestination();
                psbtRequest.Destinations.Add(psbtDestination);
                psbtDestination.Destination   = BitcoinAddress.Create(transactionOutput.DestinationAddress, network.NBitcoinNetwork);
                psbtDestination.Amount        = Money.Coins(transactionOutput.Amount.Value);
                psbtDestination.SubstractFees = transactionOutput.SubtractFeesFromOutput;
            }

            if (network.SupportRBF)
            {
                if (sendModel.AllowFeeBump is WalletSendModel.ThreeStateBool.Yes)
                {
                    psbtRequest.RBF = true;
                }
                if (sendModel.AllowFeeBump is WalletSendModel.ThreeStateBool.No)
                {
                    psbtRequest.RBF = false;
                }
            }

            psbtRequest.AlwaysIncludeNonWitnessUTXO = sendModel.AlwaysIncludeNonWitnessUTXO;

            psbtRequest.FeePreference = new FeePreference();
            if (sendModel.FeeSatoshiPerByte is decimal v &&
                v > decimal.Zero)
            {
                psbtRequest.FeePreference.ExplicitFeeRate = new FeeRate(v);
            }
            if (sendModel.NoChange)
            {
                psbtRequest.ExplicitChangeAddress = psbtRequest.Destinations.First().Destination;
            }

            var psbt = (await nbx.CreatePSBTAsync(derivationSettings.AccountDerivation, psbtRequest, cancellationToken));

            if (psbt == null)
            {
                throw new NotSupportedException("You need to update your version of NBXplorer");
            }
            // Not supported by coldcard, remove when they do support it
            psbt.PSBT.GlobalXPubs.Clear();
            return(psbt);
        }