Example #1
0
        /// <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
            });
        }