/// <summary> /// Determines the state of a broadcasted transaction /// </summary> /// <param name="operationId"></param> /// <returns></returns> /// <exception cref="BusinessException"></exception> public async Task <BroadcastedSingleTransactionResponse> GetBroadcastedTxSingle(Guid operationId) { if (operationId == Guid.Empty) { throw new BusinessException(ErrorReason.BadRequest, "Operation id is invalid"); } // Retrieve the broadcasted transaction and deserialize it. var broadcastedTransaction = await GetBroadcastedTransaction(operationId); var transaction = new MsgTx(); transaction.Decode(HexUtil.ToByteArray(broadcastedTransaction.EncodedTransaction)); // Calculate the fee and total amount spent from the transaction. var fee = transaction.TxIn.Sum(t => t.ValueIn) - transaction.TxOut.Sum(t => t.Value); var amount = transaction.TxOut.Sum(t => t.Value); // Check to see if the transaction has been included in a block. var safeBlockHeight = await _dcrdClient.GetMaxConfirmedBlockHeight(); var knownTx = await _txRepo.GetTxInfoByHash(broadcastedTransaction.Hash, safeBlockHeight); var txState = knownTx == null ? BroadcastedTransactionState.InProgress : BroadcastedTransactionState.Completed; // If the tx has been included in a block, // use the block height + timestamp from the block var txBlockHeight = knownTx?.BlockHeight ?? safeBlockHeight; var timestamp = knownTx?.BlockTime.UtcDateTime ?? DateTime.UtcNow; return(new BroadcastedSingleTransactionResponse { Block = txBlockHeight, State = txState, Hash = broadcastedTransaction.Hash, Amount = amount.ToString(), Fee = fee.ToString(), Error = "", ErrorCode = null, OperationId = operationId, Timestamp = timestamp }); }
/// <summary> /// Retrieves balances for all subscribed addresses /// </summary> /// <param name="take">Max number of balances to retrieve</param> /// <param name="continuation">Determines position in the data set to start from</param> /// <returns></returns> public async Task <PaginationResponse <WalletBalanceContract> > GetBalancesAsync(int take, string continuation) { var result = await _observableWalletRepository.GetDataWithContinuationTokenAsync(take, continuation); var addresses = result.Entities.Select(e => e.Address).ToArray(); var blockHeight = await _dcrdClient.GetMaxConfirmedBlockHeight(); var balances = (from balance in await _addressRepository.GetAddressBalancesAsync(addresses, blockHeight) where balance.Balance > 0 select new WalletBalanceContract { AssetId = "DCR", Block = balance.BlockHeight, Address = balance.Address, Balance = balance.Balance.ToString() }).ToArray(); return(new PaginationResponse <WalletBalanceContract> { Items = balances.ToArray(), Continuation = result.ContinuationToken }); }