public async Task <UpdatedTransactionInfo> CancelDepositAsync(Keccak depositId) { if (_logger.IsWarn) { _logger.Warn($"Canceling transaction for deposit with id: '{depositId}'."); } (UpdatedTransactionStatus status, DepositDetails? deposit) = await TryGetDepositAsync(depositId); if (status != UpdatedTransactionStatus.Ok) { return(new UpdatedTransactionInfo(status)); } if (deposit !.Transaction == null) { throw new InvalidDataException($"Maneged to retrieve deposit with id: '{depositId}' which has no Transaction set."); } if (deposit !.Confirmed) { if (_logger.IsError) { _logger.Error($"Deposit with id: '{depositId}' was confirmed, transaction hash: '{deposit!.Transaction.Hash}'."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.ResourceConfirmed)); } if (deposit !.Transaction.State != TransactionState.Pending) { if (_logger.IsError) { _logger.Error($"Cannot cancel transaction with hash: '{deposit!.Transaction.Hash}' for deposit with id: '{depositId}' (state: '{deposit.Transaction.State}')."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.AlreadyIncluded)); } if (deposit !.Transaction.Hash == null) { if (_logger.IsError) { _logger.Error($"Cannot cancel transaction with hash: '{deposit!.Transaction.Hash}' for deposit with id: '{depositId}' (state: '{deposit.Transaction.State}')."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.MissingTransaction)); } CanceledTransactionInfo transaction = await _transactionService.CancelAsync(deposit !.Transaction.Hash); if (_logger.IsWarn) { _logger.Warn($"Canceled transaction for deposit with id: '{depositId}', transaction hash: '{transaction.Hash}'."); } TransactionInfo cancellingTransaction = TransactionInfo.Cancellation(transaction.Hash, transaction.GasPrice, transaction.GasLimit, _timestamper.UnixTime.Seconds); deposit !.AddTransaction(cancellingTransaction); await _depositRepository.UpdateAsync(deposit); return(new UpdatedTransactionInfo(UpdatedTransactionStatus.Ok, transaction.Hash)); }
public async Task <UpdatedTransactionInfo> CancelPaymentClaimAsync(Keccak paymentClaimId) { (UpdatedTransactionStatus status, PaymentClaim? paymentClaim) = await TryGetPaymentClaimAsync(paymentClaimId, "cancel"); if (status != UpdatedTransactionStatus.Ok) { return(new UpdatedTransactionInfo(status)); } TransactionInfo?currentTransaction = paymentClaim !.Transaction; if (currentTransaction == null) { if (_logger.IsError) { _logger.Error($"Cannot cancel missing transaction for payment claim with id: '{paymentClaim!.Id}'."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.MissingTransaction)); } Keccak?hash = currentTransaction.Hash; if (hash == null) { if (_logger.IsError) { _logger.Error($"Cannot cancel missing transaction for payment claim with id: '{paymentClaim!.Id}'."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.MissingTransaction)); } if (currentTransaction.State != TransactionState.Pending) { if (_logger.IsError) { _logger.Error($"Cannot cancel transaction with hash: '{hash}' for payment claim with id: '{paymentClaim!.Id}' (state: '{currentTransaction.State}')."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.AlreadyIncluded)); } if (_logger.IsWarn) { _logger.Warn($"Canceling transaction for payment claim with id: '{paymentClaimId}'."); } CanceledTransactionInfo transaction = await _transactionService.CancelAsync(hash); if (_logger.IsWarn) { _logger.Warn($"Canceled transaction for payment claim with id: '{paymentClaimId}', transaction hash: '{transaction.Hash}'."); } TransactionInfo cancellingTransaction = TransactionInfo.Cancellation(transaction.Hash, transaction.GasPrice, transaction.GasLimit, _timestamper.UnixTime.Seconds); paymentClaim !.AddTransaction(cancellingTransaction); await _paymentClaimRepository.UpdateAsync(paymentClaim !); return(new UpdatedTransactionInfo(UpdatedTransactionStatus.Ok, transaction.Hash)); }
public async Task cancel_deposit_should_return_transaction_status() { var transactionHash = TestItem.KeccakA; var deposit = GetDepositDetails(transactionHash); var info = new CanceledTransactionInfo(TestItem.KeccakB, 10.GWei(), 1000); _depositRepository.GetAsync(deposit.Id).Returns(deposit); _transactionService.CancelAsync(transactionHash).Returns(info); var transactionInfo = await _consumerTransactionsService.CancelDepositAsync(deposit.Id); transactionInfo.Hash.Should().Be(info.Hash); transactionInfo.Status.Should().Be(UpdatedTransactionStatus.Ok); deposit.Transaction.Hash.Should().Be(transactionInfo.Hash); deposit.Transaction.Type.Should().Be(TransactionType.Cancellation); await _depositRepository.Received().GetAsync(deposit.Id); await _depositRepository.Received().UpdateAsync(deposit); await _transactionService.Received().CancelAsync(transactionHash); }
public async Task <UpdatedTransactionInfo> CancelRefundAsync(Keccak depositId) { if (_logger.IsWarn) { _logger.Warn($"Canceling transaction for refund for deposit with id: '{depositId}'."); } (UpdatedTransactionStatus status, DepositDetails? deposit) = await TryGetDepositAsync(depositId); if (status != UpdatedTransactionStatus.Ok) { return(new UpdatedTransactionInfo(status)); } if (deposit !.ClaimedRefundTransaction is null) { if (_logger.IsError) { _logger.Error($"Deposit with id: '{depositId}' has no transaction for refund claim."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.MissingTransaction)); } Keccak?currentHash = deposit !.ClaimedRefundTransaction.Hash; if (deposit !.RefundClaimed) { if (_logger.IsError) { _logger.Error($"Deposit with id: '{depositId}' has already claimed refund (transaction hash: '{currentHash}')."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.ResourceConfirmed)); } if (currentHash is null) { if (_logger.IsError) { _logger.Error($"Cannot cancel transaction with hash: '{null}' for refund for deposit with id: '{depositId}' (state: '{deposit.ClaimedRefundTransaction.State}')."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.MissingTransaction)); } if (deposit !.ClaimedRefundTransaction.State != TransactionState.Pending) { if (_logger.IsError) { _logger.Error($"Cannot cancel transaction with hash: '{deposit!.ClaimedRefundTransaction.Hash}' for refund for deposit with id: '{depositId}' (state: '{deposit.ClaimedRefundTransaction.State}')."); } return(new UpdatedTransactionInfo(UpdatedTransactionStatus.AlreadyIncluded)); } CanceledTransactionInfo transaction = await _transactionService.CancelAsync(currentHash); if (_logger.IsWarn) { _logger.Warn($"Canceled transaction for deposit with id: '{depositId}', transaction hash: '{transaction.Hash}'."); } TransactionInfo cancellingTransaction = TransactionInfo.Cancellation(transaction.Hash, transaction.GasPrice, transaction.GasLimit, _timestamper.UnixTime.Seconds); deposit.AddClaimedRefundTransaction(cancellingTransaction); await _depositRepository.UpdateAsync(deposit); return(new UpdatedTransactionInfo(UpdatedTransactionStatus.Ok, transaction.Hash)); }