Exemplo n.º 1
0
        public GraftService(ILoggerFactory loggerFactory,
                            IConfiguration configuration)
        {
            _settings = configuration
                        .GetSection("ExchangeService")
                        .Get <ExchangeServiceConfiguration>();

            _logger = loggerFactory.CreateLogger(nameof(GraftService));

            _dapi   = new GraftDapi(_settings.DapiUrl);
            _wallet = new Wallet(_settings.WalletUrl);
        }
        internal static async Task <Exchange> Create(BrokerExchangeToStableParams model,
                                                     IRateCache rateCache, ExchangeServiceConfiguration settings)
        {
            var log = new List <EventItem>
            {
                new EventItem($"Started exchange calculation")
            };

            log.Add(new EventItem($"Requesting GRFT rate..."));
            decimal graftRate = await rateCache.GetRateToUsd("GRFT");

            log.Add(new EventItem($"Received GRFT rate: {graftRate} USD"));

            decimal fee         = settings.ExchangeBrokerFee;
            decimal usdAmount   = graftRate * model.SellAmount;
            decimal feeAmount   = usdAmount * fee;
            decimal buyerAmount = usdAmount - feeAmount;

            var exchange = new Exchange
            {
                ExchangeId = model.ExchangeId ?? Guid.NewGuid().ToString(),
                CreatedAt  = DateTime.UtcNow,
                //Status = PaymentStatus.Waiting,

                SellAmount   = model.SellAmount,
                SellCurrency = model.SellCurrency,

                BuyAmount   = buyerAmount,
                BuyCurrency = "USDT",

                SellToUsdRate  = 1M,
                GraftToUsdRate = graftRate,

                ExchangeBrokerFee = feeAmount,

                BuyerWallet = model.WalletAddress,

                InTxStatus  = PaymentStatus.Waiting,
                OutTxStatus = PaymentStatus.New
            };

            exchange.ProcessingEvents = log;

            log.Add(new EventItem($"Created exchange: {exchange.SellAmount} {exchange.SellCurrency} to {exchange.BuyAmount} {exchange.BuyCurrency}"));
            log.Add(new EventItem($"Exchange Broker fee of {fee*100}% is {exchange.ExchangeBrokerFee} GRFT"));

            return(exchange);
        }
Exemplo n.º 3
0
        public ExchangeToStableService(ILoggerFactory loggerFactory,
                                       ApplicationDbContext db,
                                       IConfiguration configuration,
                                       IRateCache rateCache,
                                       IMemoryCache cache,
                                       ICryptoProviderService cryptoProviderService,
                                       GraftService graft)
        {
            _settings = configuration
                        .GetSection("ExchangeService")
                        .Get <ExchangeServiceConfiguration>();

            _logger                = loggerFactory.CreateLogger(nameof(ExchangeService));
            _db                    = db;
            _rateCache             = rateCache;
            _cache                 = cache;
            _cryptoProviderService = cryptoProviderService;
            _graft                 = graft;
        }
        internal static void Recalc(Exchange exchange, ExchangeServiceConfiguration settings)
        {
            decimal sellRate    = exchange.SellToUsdRate;
            decimal graftRate   = exchange.GraftToUsdRate;
            decimal sellAmount  = 0;
            decimal graftAmount = 0;
            decimal buyerAmount = 0;
            decimal feeAmount   = 0;
            decimal fee         = settings.ExchangeBrokerFee;

            sellAmount  = exchange.ReceivedAmount;
            graftAmount = sellAmount * sellRate / graftRate;
            feeAmount   = graftAmount * fee;
            buyerAmount = graftAmount - feeAmount;

            exchange.SellAmount        = sellAmount;
            exchange.BuyAmount         = buyerAmount;
            exchange.ExchangeBrokerFee = feeAmount;

            exchange.Log($"Recalcalated amounts: {exchange.SellAmount} {exchange.SellCurrency} to {exchange.BuyAmount} {exchange.BuyCurrency}");
        }
        internal static async Task <Exchange> Create(BrokerExchangeParams model,
                                                     IRateCache rateCache, ExchangeServiceConfiguration settings)
        {
            var log = new List <EventItem>
            {
                new EventItem($"Started exchange calculation")
            };

            log.Add(new EventItem($"Requesting {model.SellCurrency} rate..."));
            decimal sellRate = await rateCache.GetRateToUsd(model.SellCurrency);

            log.Add(new EventItem($"Received {model.SellCurrency} rate: {sellRate} USD"));

            log.Add(new EventItem($"Requesting GRFT rate..."));
            decimal graftRate = await rateCache.GetRateToUsd("GRFT");

            log.Add(new EventItem($"Received GRFT rate: {graftRate} USD"));

            decimal sellAmount  = 0;
            decimal graftAmount = 0;
            decimal buyerAmount = 0;
            decimal feeAmount   = 0;
            decimal fee         = settings.ExchangeBrokerFee;

            if (!string.IsNullOrWhiteSpace(model.FiatCurrency))
            {
                if (model.SellFiatAmount > 0)
                {
                    sellAmount  = model.SellFiatAmount / sellRate;
                    graftAmount = model.SellFiatAmount / graftRate;
                    feeAmount   = graftAmount * fee;
                    buyerAmount = graftAmount - feeAmount;
                }
                else
                {
                    buyerAmount = model.BuyFiatAmount / graftRate;
                    graftAmount = buyerAmount / (1 - fee);
                    feeAmount   = graftAmount - buyerAmount;
                    sellAmount  = graftAmount * graftRate / sellRate;
                }
            }
            else
            {
                if (model.SellAmount > 0)
                {
                    sellAmount  = model.SellAmount;
                    graftAmount = sellAmount * sellRate / graftRate;
                    feeAmount   = graftAmount * fee;
                    buyerAmount = graftAmount - feeAmount;
                }
                else
                {
                    buyerAmount = model.BuyAmount;
                    graftAmount = buyerAmount / (1 - fee);
                    feeAmount   = graftAmount - buyerAmount;
                    sellAmount  = graftAmount * graftRate / sellRate;
                }
            }

            var exchange = new Exchange
            {
                ExchangeId = model.PaymentId ?? Guid.NewGuid().ToString(),
                CreatedAt  = DateTime.UtcNow,
                //ExchangeStatus = PaymentStatus.Waiting,

                SellAmount   = sellAmount,
                SellCurrency = model.SellCurrency,

                BuyAmount   = buyerAmount,
                BuyCurrency = model.BuyCurrency,

                SellToUsdRate  = sellRate,
                GraftToUsdRate = graftRate,

                ExchangeBrokerFee = feeAmount,

                BuyerWallet = model.WalletAddress,

                InTxStatus  = PaymentStatus.Waiting,
                OutTxStatus = PaymentStatus.New
            };

            exchange.ProcessingEvents = log;

            log.Add(new EventItem($"Created exchange: {exchange.SellAmount} {exchange.SellCurrency} to {exchange.BuyAmount} {exchange.BuyCurrency}"));
            log.Add(new EventItem($"Exchange Broker fee of {fee*100}% is {exchange.ExchangeBrokerFee} GRFT"));

            return(exchange);
        }