public async Task <RefundClaimStatus> TryClaimRefundAsync(DepositDetails deposit, Address refundTo) { ulong now = _timestamper.EpochSeconds; if (!deposit.CanClaimRefund(now)) { return(RefundClaimStatus.Empty); } Block?latestBlock = await _blockchainBridge.GetLatestBlockAsync(); if (latestBlock == null) { return(RefundClaimStatus.Empty); } now = (ulong)latestBlock.Timestamp; if (!deposit.CanClaimRefund(now)) { return(RefundClaimStatus.Empty); } Keccak depositId = deposit.Deposit.Id; Keccak?transactionHash = deposit.ClaimedRefundTransaction?.Hash; if (transactionHash is null) { Address provider = deposit.DataAsset.Provider.Address; RefundClaim refundClaim = new RefundClaim(depositId, deposit.DataAsset.Id, deposit.Deposit.Units, deposit.Deposit.Value, deposit.Deposit.ExpiryTime, deposit.Pepper, provider, refundTo); UInt256 gasPrice = await _gasPriceService.GetCurrentAsync(); transactionHash = await _refundService.ClaimRefundAsync(refundTo, refundClaim, gasPrice); if (transactionHash is null) { if (_logger.IsError) { _logger.Error("There was an error when trying to claim refund (no transaction hash returned)."); } return(RefundClaimStatus.Empty); } deposit.AddClaimedRefundTransaction(TransactionInfo.Default(transactionHash, 0, gasPrice, _refundService.GasLimit, _timestamper.EpochSeconds)); await _depositRepository.UpdateAsync(deposit); if (_logger.IsInfo) { _logger.Info($"Claimed a refund for deposit: '{depositId}', gas price: {gasPrice} wei, transaction hash: '{transactionHash}' (awaits a confirmation)."); } } bool confirmed = await TryConfirmClaimAsync(deposit, string.Empty); return(confirmed ? RefundClaimStatus.Confirmed(transactionHash) : RefundClaimStatus.Unconfirmed(transactionHash)); }
public async Task <RefundClaimStatus> TryClaimEarlyRefundAsync(DepositDetails deposit, Address refundTo) { var now = _timestamper.EpochSeconds; if (!deposit.CanClaimEarlyRefund(now)) { return(RefundClaimStatus.Empty); } var latestBlock = await _blockchainBridge.GetLatestBlockAsync(); now = (ulong)latestBlock.Timestamp; if (!deposit.CanClaimEarlyRefund(now)) { return(RefundClaimStatus.Empty); } var depositId = deposit.Deposit.Id; var transactionHash = deposit.ClaimedRefundTransaction?.Hash; if (transactionHash is null) { var provider = deposit.DataAsset.Provider.Address; var ticket = deposit.EarlyRefundTicket; var earlyRefundClaim = new EarlyRefundClaim(ticket.DepositId, deposit.DataAsset.Id, deposit.Deposit.Units, deposit.Deposit.Value, deposit.Deposit.ExpiryTime, deposit.Pepper, provider, ticket.ClaimableAfter, ticket.Signature, refundTo); var gasPrice = await _gasPriceService.GetCurrentAsync(); transactionHash = await _refundService.ClaimEarlyRefundAsync(refundTo, earlyRefundClaim, gasPrice); if (transactionHash is null) { if (_logger.IsError) { _logger.Error("There was an error when trying to claim early refund (no transaction hash returned)."); } return(RefundClaimStatus.Empty); } deposit.SetClaimedRefundTransaction(new TransactionInfo(transactionHash, 0, gasPrice, _refundService.GasLimit, _timestamper.EpochSeconds)); await _depositRepository.UpdateAsync(deposit); if (_logger.IsInfo) { _logger.Info($"Claimed an early refund for deposit: '{depositId}', gas price: {gasPrice} wei, transaction hash: '{transactionHash}' (awaits a confirmation)."); } } var confirmed = await TryConfirmClaimAsync(deposit, "early "); return(confirmed ? RefundClaimStatus.Confirmed(transactionHash) : RefundClaimStatus.Unconfirmed(transactionHash)); }