public async Task <IActionResult> CheckIfCanSweepNow(SweepFundsViewModel viewModel, string command, bool leaveActiveInvoice = false) { var web3 = _ethereumService.GetWeb3(viewModel.ChainId); if (web3 == null) { TempData.SetStatusMessageModel(new StatusMessageModel() { Message = $"Web3 not available", Severity = StatusMessageModel.StatusSeverity.Error }); return(RedirectToAction("GetStoreEthereumLikePaymentMethods", new { storeId = StoreData.Id })); } viewModel.GasPrice ??= (ulong)(await web3.Eth.GasPrice.SendRequestAsync()).Value; viewModel.SweepRequests = viewModel.SweepRequests .Where(request => leaveActiveInvoice || string.IsNullOrEmpty(request.UnableToSweepBecauseOfActiveInvoiceWithNativeCurrency)) .OrderByDescending(request => request.Sufficient(viewModel.GasPrice.Value, out var excess) ).ToList(); var networks = _btcPayNetworkProvider.GetAll().OfType <EthereumBTCPayNetwork>() .Where(network => network.ChainId == viewModel.ChainId); var mainNetwork = networks.SingleOrDefault(network => !(network is ERC20BTCPayNetwork)); var etherTransferService = web3.Eth.GetEtherTransferService(); var transferHandler = web3.Eth.GetContractTransactionHandler <TransferFunction>(); foreach (var sweepRequest in viewModel.SweepRequests) { sweepRequest.Native ??= new SweepRequestItem() { Sweep = true, CryptoCode = mainNetwork.CryptoCode, }; var amt = (await _ethereumService.GetBalance(mainNetwork, sweepRequest.Address)).Value; sweepRequest.Native.Amount = amt; sweepRequest.Native.GasCost = amt == 0 ? 0 : (ulong)await etherTransferService.EstimateGasAsync(viewModel.DestinationAddress, EthereumLikePaymentData.GetValue(mainNetwork, amt)); foreach (SweepRequestItem sweepRequestItem in sweepRequest.Tokens) { var network = _btcPayNetworkProvider.GetNetwork <ERC20BTCPayNetwork>(sweepRequestItem.CryptoCode); sweepRequestItem.Amount = (await _ethereumService.GetBalance(network, sweepRequest.Address)).Value; if (sweepRequestItem.Amount == 0 && string.IsNullOrEmpty(sweepRequestItem.TransactionHash)) { sweepRequestItem.TransactionHash = "external sweep detected"; var i = await _invoiceRepository.GetInvoice(sweepRequestItem.InvoiceId); var pD = i.GetPayments(network.CryptoCode).Last(entity => entity.Accounted); var ethpd = pD.GetCryptoPaymentData() as EthereumLikePaymentData; ethpd.SweepingTransaction = sweepRequestItem.TransactionHash; pD.SetCryptoPaymentData(ethpd); await _invoiceRepository.UpdatePayments(new List <PaymentEntity>() { pD }); } var transfer = new TransferFunction() { To = viewModel.DestinationAddress, Value = sweepRequestItem.Amount, FromAddress = sweepRequest.Address }; sweepRequestItem.GasCost = (ulong)(await transferHandler.EstimateGasAsync(network.SmartContractAddress, transfer)) .Value; } sweepRequest.Tokens = sweepRequest.Tokens.Where(item => item.Amount > 0).ToList(); } if (command == "sweep") { if (await DoSweepAction(viewModel, web3)) { return(await CheckIfCanSweepNow(viewModel, null)); } } return(View("SweepFundsSpecifyInfo", viewModel)); }