public async Task <IReadOnlyCollection <AssetBalanceModel> > GetLykkeAsync()
        {
            IReadOnlyCollection <Balance> balances = await _balanceService.GetAsync(ExchangeNames.Lykke);

            IReadOnlyCollection <Credit> credits = await _creditService.GetAllAsync();

            string[] assets = balances.Select(o => o.AssetId)
                              .Union(credits.Select(o => o.AssetId))
                              .ToArray();

            var model = new List <AssetBalanceModel>();

            foreach (string assetId in assets)
            {
                Balance balance = balances.SingleOrDefault(o => o.AssetId == assetId);
                Credit  credit  = credits.SingleOrDefault(o => o.AssetId == assetId);

                decimal balanceAmount = balance?.Amount ?? decimal.Zero;
                decimal creditAmount  = credit?.Amount ?? decimal.Zero;

                model.Add(new AssetBalanceModel
                {
                    AssetId      = assetId,
                    Amount       = balanceAmount,
                    CreditAmount = creditAmount,
                    Disbalance   = balanceAmount - creditAmount
                });
            }

            return(model);
        }
Example #2
0
        public async Task HandleAsync(string customerId)
        {
            var customerBalance = await _balanceService.GetAsync(customerId);

            if (customerBalance.Error != CustomerBalanceError.None)
            {
                _log.Error(message: "Cannot seize balance of a customer because of error", context: customerBalance.Error);
                return;
            }

            if (customerBalance.Total == 0)
            {
                await _seizeBalanceFromCustomerCompletedPublisher.PublishAsync(
                    new SeizeBalanceFromCustomerCompletedEvent { CustomerId = customerId });

                return;
            }

            var walletResult = await _walletOwnersRepository.GetByOwnerIdAsync(customerId);

            if (walletResult == null)
            {
                _log.Error(message: "Cannot seize balance of a customer because the wallet is missing", context: customerId);
                return;
            }

            await _operationRequestsProducer.AddAsync(customerId, OperationType.SeizeToInternal, new SeizeToInternalContext
            {
                Account = walletResult.WalletId,
                Amount  = customerBalance.Total,
                Reason  = BalanceSeizeReason,
            });
        }
        public async Task CreateMissedAsync(string userId)
        {
            string source = _quoteService.GetSources().FirstOrDefault();

            IReadOnlyCollection <Balance> balances = await _balanceService.GetAsync();

            foreach (Balance balance in balances)
            {
                if (balance.Amount <= 0)
                {
                    continue;
                }

                Asset asset = _assetsReadModelRepository.TryGetIfEnabled(balance.AssetId);

                if (asset == null)
                {
                    continue;
                }

                AssetPair assetPair = _assetPairsReadModelRepository.GetAllEnabled()
                                      .FirstOrDefault(o => o.BaseAssetId == asset.Id && o.QuotingAssetId == "USD");

                if (assetPair == null)
                {
                    continue;
                }

                IReadOnlyCollection <Instrument> instruments = await GetAllAsync();

                Instrument instrument = instruments.FirstOrDefault(o => o.AssetPairId == assetPair.Id);

                if (instrument != null)
                {
                    continue;
                }

                instrument = new Instrument
                {
                    AssetPairId = assetPair.Id,
                    QuoteSource = source,
                    Markup      = 0,
                    Levels      = 1,
                    MinSpread   = .2m,
                    MaxSpread   = .8m,
                    Mode        = InstrumentMode.Disabled,
                    IsApproved  = false
                };

                await _instrumentRepository.InsertAsync(instrument);

                _cache.Set(instrument);
            }

            _log.InfoWithDetails("Missed instruments created", new { userId });
        }
Example #4
0
        public async Task <GetWalletsResponse> GetWalletBalancesAsync()
        {
            IReadOnlyCollection <Balance> balances = await _balanceService.GetAsync(ExchangeNames.Lykke);

            return(new GetWalletsResponse
            {
                Wallets = balances.Select(o => new WalletBalanceModel
                {
                    Asset = o.AssetId,
                    Balance = o.Amount,
                    Reserved = 0
                }).ToList()
            });
        }
Example #5
0
        private async Task <TransferError> ValidateSenderBalance(string senderId, Money18 amount)
        {
            var senderBalance = await _balanceService.GetAsync(senderId);

            switch (senderBalance.Error)
            {
            case CustomerBalanceError.InvalidCustomerId:
                return(TransferError.InvalidSenderId);

            case CustomerBalanceError.CustomerWalletMissing:
                return(TransferError.SenderWalletMissing);

            case CustomerBalanceError.None when senderBalance.Total < amount:
                return(TransferError.NotEnoughFunds);
            }
            return(TransferError.None);
        }
        public async Task <BalanceIndicatorsReport> GetAsync()
        {
            IReadOnlyCollection <Balance> externalBalances = await _balanceService.GetAsync(ExchangeNames.External);

            decimal riskExposure = 0;
            decimal equity       = 0;
            decimal fiatEquity   = 0;

            foreach (Balance balance in externalBalances)
            {
                decimal amountInUsd;
                bool    isFiat = false;

                if (balance.AssetId == AssetConsts.UsdAssetId)
                {
                    amountInUsd = balance.Amount;
                    isFiat      = true;
                }
                else
                {
                    Domain.AssetSettings assetSettings = await _assetSettingsService.GetByIdAsync(balance.AssetId);

                    if (assetSettings == null)
                    {
                        continue;
                    }

                    if (!assetSettings.IsCrypto)
                    {
                        isFiat = true;
                    }

                    Quote quote = await _quoteService
                                  .GetAsync(assetSettings.QuoteSource, assetSettings.ExternalAssetPairId);

                    if (quote == null)
                    {
                        continue;
                    }

                    amountInUsd = Calculator.CalculateCrossMidPrice(balance.Amount, quote, assetSettings.IsInverse)
                                  .Item1;
                }

                if (balance.Amount < 0)
                {
                    riskExposure += Math.Abs(amountInUsd);
                }

                equity += amountInUsd;

                if (isFiat)
                {
                    fiatEquity += amountInUsd;
                }
            }

            return(new BalanceIndicatorsReport
            {
                Equity = equity,
                FiatEquity = fiatEquity,
                RiskExposure = riskExposure
            });
        }
Example #7
0
        public async Task <IReadOnlyCollection <BalanceModel> > GetAllAsync()
        {
            IReadOnlyCollection <Balance> balances = await _balanceService.GetAsync();

            return(Mapper.Map <BalanceModel[]>(balances));
        }
Example #8
0
        public async Task <CustomerBalanceResponseModel> GetBalanceAsync(Guid customerId)
        {
            var result = await _balanceService.GetAsync(customerId.ToString());

            return(_mapper.Map <CustomerBalanceResponseModel>(result));
        }
        public async Task <IReadOnlyCollection <BalanceReport> > GetAsync()
        {
            IReadOnlyCollection <Balance> lykkeBalances = await _balanceService.GetAsync(ExchangeNames.Lykke);

            IReadOnlyCollection <Balance> externalBalances = await _balanceService.GetAsync(ExchangeNames.External);

            IReadOnlyCollection <Credit> credits = await _creditService.GetAllAsync();

            IReadOnlyCollection <Domain.AssetSettings> assetsSettings = await _assetSettingsService.GetAllAsync();

            string[] assets = externalBalances
                              .Select(o => o.AssetId)
                              .Union(lykkeBalances.Select(o => o.AssetId).Union(credits.Select(o => o.AssetId))
                                     .Select(o => assetsSettings.SingleOrDefault(p => p.LykkeAssetId == o)?.AssetId ?? o))
                              .ToArray();

            var reports = new List <BalanceReport>();

            foreach (string assetId in assets)
            {
                Domain.AssetSettings assetSettings = assetsSettings.SingleOrDefault(o => o.AssetId == assetId);

                string lykkeAssetId = assetSettings?.LykkeAssetId ?? assetId;

                Balance lykkeBalance = lykkeBalances.SingleOrDefault(o => o.AssetId == lykkeAssetId);

                Balance externalBalance = externalBalances.SingleOrDefault(o => o.AssetId == assetId);

                Credit credit = credits.SingleOrDefault(o => o.AssetId == lykkeAssetId);

                decimal lykkeDisbalance = (lykkeBalance?.Amount ?? 0) - (credit?.Amount ?? 0);

                decimal totalAmount = lykkeDisbalance + (externalBalance?.Amount ?? 0);

                if (totalAmount != 0)
                {
                    (decimal? TotalAmountInUsd, decimal? Rate)tuple = (null, null);

                    if (assetId == AssetConsts.UsdAssetId)
                    {
                        tuple = (totalAmount, 1);
                    }
                    else if (assetSettings != null)
                    {
                        Quote quote = await _quoteService
                                      .GetAsync(assetSettings.QuoteSource, assetSettings.ExternalAssetPairId);

                        if (quote != null)
                        {
                            tuple = Calculator.CalculateCrossMidPrice(totalAmount, quote, assetSettings.IsInverse);
                        }
                    }

                    reports.Add(new BalanceReport
                    {
                        Asset             = assetId,
                        LykkeAssetId      = lykkeAssetId,
                        ExternalAssetId   = assetId,
                        LykkeAmount       = lykkeBalance?.Amount,
                        LykkeCreditAmount = credit?.Amount,
                        LykkeDisbalance   = lykkeDisbalance,
                        ExternalAmount    = externalBalance?.Amount,
                        TotalAmount       = totalAmount,
                        TotalAmountInUsd  = tuple.TotalAmountInUsd,
                        CrossRate         = tuple.Rate
                    });
                }
            }

            return(reports);
        }