コード例 #1
0
 public BalanceService(IHorizonService horizonService, IObservationRepository <BalanceObservation> observationRepository, IWalletBalanceRepository walletBalanceRepository, ILog log, int batchSize)
 {
     _horizonService          = horizonService;
     _observationRepository   = observationRepository;
     _walletBalanceRepository = walletBalanceRepository;
     _log       = log;
     _batchSize = batchSize;
 }
コード例 #2
0
 public TransactionHistoryService(IHorizonService horizonService, IObservationRepository <TransactionHistoryObservation> observationRepository,
                                  ITxHistoryRepository txHistoryRepository, ITxBroadcastRepository txBroadcastRepository, ILog log, int batchSize)
 {
     _horizonService        = horizonService;
     _observationRepository = observationRepository;
     _txHistoryRepository   = txHistoryRepository;
     _txBroadcastRepository = txBroadcastRepository;
     _log       = log;
     _batchSize = batchSize;
 }
コード例 #3
0
 public TransactionService(IHorizonService horizonService, IObservationRepository <BroadcastObservation> observationRepository,
                           ITxBroadcastRepository broadcastRepository, ITxBuildRepository buildRepository, ILog log, int batchSize)
 {
     _horizonService        = horizonService;
     _observationRepository = observationRepository;
     _broadcastRepository   = broadcastRepository;
     _buildRepository       = buildRepository;
     _log       = log;
     _batchSize = batchSize;
 }
コード例 #4
0
 public TransactionHistoryService(IBalanceService balanceService,
                                  IHorizonService horizonService,
                                  IKeyValueStoreRepository keyValueStoreRepository,
                                  IObservationRepository <TransactionHistoryObservation> observationRepository,
                                  ITxHistoryRepository txHistoryRepository,
                                  ILogFactory log,
                                  IBlockchainAssetsService blockchainAssetsService)
 {
     _balanceService          = balanceService;
     _horizonService          = horizonService;
     _keyValueStoreRepository = keyValueStoreRepository;
     _observationRepository   = observationRepository;
     _txHistoryRepository     = txHistoryRepository;
     _log = log.CreateLog(this);
     _blockchainAssetsService = blockchainAssetsService;
 }
コード例 #5
0
 public BalanceService(IHorizonService horizonService,
                       IKeyValueStoreRepository keyValueStoreRepository,
                       IObservationRepository <BalanceObservation> observationRepository,
                       IWalletBalanceRepository walletBalanceRepository,
                       string depositBaseAddress,
                       string[] explorerUrlFormats,
                       ILogFactory log,
                       IBlockchainAssetsService blockchainAssetsService)
 {
     _horizonService          = horizonService;
     _keyValueStoreRepository = keyValueStoreRepository;
     _observationRepository   = observationRepository;
     _walletBalanceRepository = walletBalanceRepository;
     _depositBaseAddress      = depositBaseAddress;
     _explorerUrlFormats      = explorerUrlFormats;
     _log = log.CreateLog(this);
     _blockchainAssetsService = blockchainAssetsService;
 }
コード例 #6
0
 public TransactionService(IBalanceService balanceService,
                           IHorizonService horizonService,
                           IObservationRepository <BroadcastObservation> observationRepository,
                           IWalletBalanceRepository balanceRepository,
                           ITxBroadcastRepository broadcastRepository,
                           ITxBuildRepository buildRepository,
                           TimeSpan transactionExpirationTime,
                           ILogFactory logFactory,
                           IBlockchainAssetsService blockchainAssetsService,
                           IChaosKitty chaosKitty,
                           AppSettings appSettings)
 {
     _balanceService            = balanceService;
     _horizonService            = horizonService;
     _observationRepository     = observationRepository;
     _balanceRepository         = balanceRepository;
     _broadcastRepository       = broadcastRepository;
     _buildRepository           = buildRepository;
     _transactionExpirationTime = transactionExpirationTime;
     _log = logFactory.CreateLog(this);
     _blockchainAssetsService = blockchainAssetsService;
     _chaos       = chaosKitty;
     _appSettings = appSettings;
 }
コード例 #7
0
        private async Task <(int Count, string Cursor)> ProcessTransactionsAsync(IHorizonService horizonService, ILog logger, string cursor)
        {
            var transactions = await horizonService.GetTransactions(_address, OrderDirection.ASC, cursor);

            var count = 0;

            cursor = null;
            foreach (var transaction in transactions)
            {
                try
                {
                    if (_latestBlock.HasValue && (long)transaction.Ledger > _latestBlock)
                    {
                        cursor = null;
                        break;
                    }

                    var sign = 1;
                    cursor = transaction.PagingToken;
                    count++;

                    // skip outgoing transactions and transactions without memo
                    //var memo = horizonService.GetMemo(transaction);
                    if (_address.Equals(transaction.SourceAccount, StringComparison.OrdinalIgnoreCase))
                    {
                        sign = -1;
                    }

                    var xdr        = Convert.FromBase64String(transaction.EnvelopeXdr);
                    var reader     = new XdrDataInputStream(xdr);
                    var txEnvelope = TransactionEnvelope.Decode(reader);
                    var tx         = txEnvelope.V0.Tx.Operations;

                    for (short i = 0; i < tx.Length; i++)
                    {
                        var operation     = tx[i];
                        var operationType = operation.Body.Discriminant.InnerValue;

                        string toAddress = null;
                        long   amount    = 0;
                        // ReSharper disable once SwitchStatementMissingSomeCases
                        switch (operationType)
                        {
                        case OperationType.OperationTypeEnum.PAYMENT:
                        {
                            var op = operation.Body.PaymentOp;
                            if (op.Asset.Discriminant.InnerValue == AssetType.AssetTypeEnum.ASSET_TYPE_NATIVE)
                            {
                                var keyPair = KeyPair.FromPublicKey(op.Destination.Ed25519.InnerValue);
                                toAddress = keyPair.Address;
                                amount    = op.Amount.InnerValue;
                            }
                            break;
                        }

                        case OperationType.OperationTypeEnum.ACCOUNT_MERGE:
                        {
                            var op      = operation.Body;
                            var keyPair = KeyPair.FromPublicKey(op.Destination.Ed25519.InnerValue);
                            toAddress = keyPair.Address;
                            amount    = horizonService.GetAccountMergeAmount(transaction.ResultXdr, i);
                            break;
                        }

                        case OperationType.OperationTypeEnum.PATH_PAYMENT_STRICT_RECEIVE:
                        {
                            var op = operation.Body.PathPaymentStrictReceiveOp;
                            if (op.DestAsset.Discriminant.InnerValue == AssetType.AssetTypeEnum.ASSET_TYPE_NATIVE)
                            {
                                var keyPair = KeyPair.FromPublicKey(op.Destination.Ed25519.InnerValue);
                                toAddress = keyPair.Address;
                                amount    = op.DestAmount.InnerValue;
                            }
                            break;
                        }

                        case OperationType.OperationTypeEnum.CREATE_ACCOUNT:
                        {
                            var op = operation.Body.CreateAccountOp;
                            if (op != null)
                            {
                                var keyPair = KeyPair.FromXdrPublicKey(op.Destination.InnerValue);
                                toAddress = keyPair.Address;
                                amount    = op.StartingBalance.InnerValue;
                            }
                            break;
                        }

                        default:
                            continue;
                        }

                        //var addressWithExtension = $"{toAddress}{Constants.PublicAddressExtension.Separator}{memo.ToLower()}";
                        var amountChange = (sign * amount);
                        _amountSoFar += amountChange;
                        //logger.Info($"Balance changed to {_amountSoFar} ({amountChange}) on ledger {transaction.Ledger}");
                    }
                }
                catch (Exception ex)
                {
                    throw new BusinessException($"Failed to process transaction. hash={transaction?.Hash}", ex);
                }
            }

            return(count, cursor);
        }