public CheckTransaction CheckTransactionHash(string email, int buyId) { var user = UserBusiness.GetValidUser(email); var buy = BuyBusiness.Get(buyId); if (buy == null || buy.UserId != user.Id || buy.LastTransaction == null) { throw new ArgumentException("Invalid purchase."); } var status = buy.LastTransaction.TransactionStatus; if (status == TransactionStatus.Success.Value || status == TransactionStatus.Pending.Value) { if (status == TransactionStatus.Pending.Value) { status = CheckAndProcessTransaction(buy.LastTransaction, buy.Id).Value; } if (status == TransactionStatus.Success.Value) { var portfolio = PortfolioBusiness.GetSimple(buy.PortfolioId); return(new CheckTransaction() { Status = status, Distribution = DistributionBusiness.ListByProjection(portfolio.ProjectionId.Value) }); } } return(new CheckTransaction() { Status = status }); }
public void Cancel(string email, int buyId) { var user = UserBusiness.GetValidUser(email); var buy = BuyBusiness.Get(buyId); if (buy == null || buy.UserId != user.Id || buy.ExpirationDate.HasValue) { throw new ArgumentException("Invalid purchase."); } if (buy.LastTransaction.TransactionStatus == TransactionStatus.Pending.Value) { if (string.IsNullOrEmpty(buy.LastTransaction.TransactionHash)) { TransactionBusiness.Process(buy.LastTransaction, TransactionStatus.Cancel); } else { try { var transaction = Web3.Web3Business.CheckTransaction(buy.LastTransaction.TransactionHash); throw new ArgumentException(transaction.BlockNumber.HasValue ? "The transaction is already minted." : "Pending transaction cannot be canceled."); } catch (DomainObjects.Web3.Web3Exception ex) { if (ex.Code == 404) { TransactionBusiness.Process(buy.LastTransaction, TransactionStatus.Cancel); } else { throw; } } } } else if (buy.LastTransaction.TransactionStatus == TransactionStatus.Error.Value) { using (var transaction = new TransactionalDapperCommand()) { var trans = TransactionBusiness.SetCanceled(user.Id); transaction.Insert(trans); var buyTrans = BuyTransactionBusiness.SetNew(buyId, trans.Id); transaction.Insert(buyTrans); transaction.Commit(); } } else { throw new ArgumentException("Invalid transaction status."); } }
public void SetTransactionHash(string email, int buyId, string transactionHash) { var user = UserBusiness.GetValidUser(email); var buy = BuyBusiness.Get(buyId); if (buy == null || buy.UserId != user.Id || buy.ExpirationDate.HasValue) { throw new ArgumentException("Invalid purchase."); } if (buy.LastTransaction.TransactionStatus == TransactionStatus.Pending.Value && string.IsNullOrEmpty(buy.LastTransaction.TransactionHash)) { TransactionBusiness.SetTransactionHash(buy.LastTransaction, transactionHash); } else if (buy.LastTransaction.TransactionStatus == TransactionStatus.Error.Value) { Create(user.Id, buyId, transactionHash); } else if (buy.LastTransaction.TransactionStatus == TransactionStatus.Pending.Value && TransactionBusiness.TransactionCanBeConsideredLost(buy.LastTransaction) && buy.LastTransaction.TransactionHash != transactionHash.ToLower().Trim()) { try { var transaction = Web3.Web3Business.CheckTransaction(buy.LastTransaction.TransactionHash); throw new ArgumentException(transaction.BlockNumber.HasValue ? "Before transaction was processed." : "Before transaction is still pending."); } catch (DomainObjects.Web3.Web3Exception ex) { if (ex.Code == 404) { HandleLostTransaction(buy.LastTransaction, user.Id, buyId, transactionHash); } else { throw; } } } else { throw new ArgumentException("Invalid transaction status."); } }