private async Task TryHandleDepositAsync(IDepositNodesHandler deposit, bool isRetry = false) { if (_logger.IsTrace) { _logger.Trace($"Started handling consumed units for deposit: '{deposit.DepositId}'."); } if (deposit.ConsumedAll || await _receiptsPolicies.CanRequestReceipts(deposit.UnpaidUnits, deposit.UnitPrice)) { await RequestReceiptsAsync(deposit); } if (deposit.ConsumedAll || await _receiptsPolicies.CanMergeReceipts(deposit.UnmergedUnits, deposit.UnitPrice)) { await TryMergeReceiptsAsync(deposit); } await TryClaimPaymentAsync(deposit); if (_logger.IsTrace) { _logger.Trace($"Finished handling consumed units for deposit: '{deposit.DepositId}'."); } if (isRetry) { return; } if (!deposit.ConsumedAll) { return; } if (deposit.HasClaimedAllUnits) { if (_logger.IsInfo) { _logger.Info($"Last payment claim for deposit: '{deposit.DepositId}' was already processed."); } return; } deposit.FinishHandling(); while (deposit.CurrentLastClaimRetry < LastClaimRetries) { if (_logger.IsInfo) { _logger.Info($"Missing payment claim for deposit: '{deposit.DepositId}', retry {deposit.CurrentLastClaimRetry + 1}/{LastClaimRetries}."); } foreach (ConsumerNode node in _sessionManager.GetConsumerNodes(deposit.DepositId)) { ProviderSession?session = node.GetSession(deposit.DepositId); if (session is null) { if (_logger.IsInfo) { _logger.Info($"Session was not found for deposit: '{deposit.DepositId}', node: '{node.Peer.NodeId}'."); } continue; } if (_logger.IsInfo) { _logger.Info($"Consumer: '{node.Peer.NodeId}', session: '{session.Id}' has {session.UnpaidUnits} unpaid units."); } } await TryHandleDepositAsync(deposit, true); deposit.IncrementLastClaimRetries(); if (deposit.HasClaimedAllUnits) { return; } } }