public static SwapViewModel CreateSwapViewModel(Swap swap, ICurrencies currencies, IAccount account)
        {
            var soldCurrency      = currencies.GetByName(swap.SoldCurrency);
            var purchasedCurrency = currencies.GetByName(swap.PurchasedCurrency);

            var fromAmount = AmountHelper.QtyToAmount(swap.Side, swap.Qty, swap.Price, soldCurrency.DigitsMultiplier);
            var toAmount   = AmountHelper.QtyToAmount(swap.Side.Opposite(), swap.Qty, swap.Price, purchasedCurrency.DigitsMultiplier);

            var quoteCurrency = swap.Symbol.QuoteCurrency() == swap.SoldCurrency
                ? soldCurrency
                : purchasedCurrency;

            var swapViewModel = new SwapViewModel
            {
                Id   = swap.Id.ToString(),
                Mode = ModeBySwap(swap),
                Time = swap.TimeStamp,

                FromAmount       = fromAmount,
                FromCurrencyCode = soldCurrency.Name,

                ToAmount       = toAmount,
                ToCurrencyCode = purchasedCurrency.Name,

                Price       = swap.Price,
                PriceFormat = $"F{quoteCurrency.Digits}",

                Account = account
            };

            swapViewModel.UpdateSwap(swap);

            return(swapViewModel);
        }
        private async Task <Error> SendSwapAsync()
        {
            try
            {
                var account = App.Account;

                var requiredAmount = Amount + Fee;

                var fromWallets = (await account
                                   .GetUnspentAddressesAsync(
                                       currency: FromCurrency,
                                       requiredAmount: requiredAmount))
                                  .ToList();

                var refundWallet = await account
                                   .GetRefundAddressAsync(FromCurrency, fromWallets);

                var toWallet = await account
                               .GetRedeemAddressAsync(ToCurrency);

                var symbol    = Symbols.SymbolByCurrencies(FromCurrency, ToCurrency);
                var side      = symbol.OrderSideForBuyCurrency(ToCurrency);
                var terminal  = App.Terminal;
                var orderBook = terminal.GetOrderBook(symbol);
                var price     = orderBook.EstimatedDealPrice(side, Amount);

                if (price == 0)
                {
                    return(new Error(Errors.NoLiquidity, Resources.CvNoLiquidity));
                }

                var qty = Math.Round(AmountHelper.AmountToQty(side, Amount, price), symbol.QtyDigits);

                var order = new Order
                {
                    Symbol       = symbol,
                    TimeStamp    = DateTime.UtcNow,
                    Price        = price,
                    Qty          = qty,
                    Fee          = Fee,
                    Side         = side,
                    Type         = OrderType.FillOrKill,
                    FromWallets  = fromWallets.ToList(),
                    ToWallet     = toWallet,
                    RefundWallet = refundWallet
                };

                await order.CreateProofOfPossessionAsync(account);

                terminal.OrderSendAsync(order);
            }
            catch (Exception e)
            {
                Log.Error(e, "Conversion error");

                return(new Error(Errors.SwapError, Resources.CvConversionError));
            }

            return(null);
        }
Ejemplo n.º 3
0
        public Decimal GetTrendByMarket(string currency, string marketId)
        {
            var            tm             = AmountHelper.DateTimeToUnixTimestamp(DateTime.UtcNow);
            var            exchange_stats = _dtoMain.mainDb.GetCollection <ExchangeTicker>("aaexchanges_real_twodays");
            DateTimeOffset dateTimeDaily  = new DateTimeOffset(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0,
                                                               new TimeSpan(0, 0, 0)).AddDays(-1);
            long unixTimeDaily = AmountHelper.DateTimeToUnixTimestamp(dateTimeDaily.UtcDateTime);

            var     exchangeStats = exchange_stats.Find(m => m.InCurrency == currency && m.OutCurrency == "BTC" && m.MarketID == marketId && m.Time >= unixTimeDaily).ToList();
            Decimal dict24Prev = 0.0m;
            Decimal dict24Now = 0.0m;
            int     a = 0, b = 0, i = 0;

            foreach (var ex in exchangeStats)
            {
                if (i == 0)
                {
                    dict24Prev += ex.Last;
                    a++;
                }
                else
                {
                    dict24Now += ex.Last;
                    b++;
                }
                i++;
            }
            if (a == 0 || b == 0 || dict24Prev == 0)
            {
                return(0.0m);
            }
            Decimal trend = (dict24Now / b) * 100 / (dict24Prev / a) - 100;

            return(trend);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// When an order needs to be captured the cartridge needs to make an API Call
        /// POST /ordermanagement/v1/orders/{order_id}/captures for the amount which needs to be captured.
        ///     If it's a partial capture the API call will be the same just for the
        /// amount that should be captured. Many captures can be made up to the whole amount authorized.
        /// The shipment information can be added in this call or amended aftewards using the method
        /// "Add shipping info to a capture".
        ///     The amount captured never can be greater than the authorized.
        /// When an order is Partally Captured the status of the order in Klarna is PART_CAPTURED
        /// </summary>
        public override bool Process(IPayment payment, IOrderForm orderForm, IOrderGroup orderGroup, IShipment shipment, ref string message)
        {
            if (payment.TransactionType == TransactionType.Capture.ToString())
            {
                var amount  = AmountHelper.GetAmount(payment.Amount);
                var orderId = orderGroup.Properties[Common.Constants.KlarnaOrderIdField]?.ToString();
                if (!string.IsNullOrEmpty(orderId))
                {
                    try
                    {
                        var captureData = KlarnaOrderService.CaptureOrder(orderId, amount, "Capture the payment", orderGroup, orderForm, payment, shipment);
                        AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Captured {payment.Amount}, id {captureData.CaptureId}");
                    }
                    catch (Exception ex) when(ex is ApiException || ex is WebException)
                    {
                        var exceptionMessage = GetExceptionMessage(ex);

                        payment.Status = PaymentStatus.Failed.ToString();
                        message        = exceptionMessage;
                        AddNoteAndSaveChanges(orderGroup, payment.TransactionType, $"Error occurred {exceptionMessage}");
                        Logger.Error(exceptionMessage, ex);
                        return(false);
                    }
                }
                return(true);
            }
            else if (Successor != null)
            {
                return(Successor.Process(payment, orderForm, orderGroup, shipment, ref message));
            }
            return(false);
        }
        public static SwapViewModel CreateSwapViewModel(ClientSwap swap)
        {
            var fromCurrency = CurrencyViewModelCreator.CreateViewModel(
                currency: swap.SoldCurrency,
                subscribeToUpdates: false);

            var toCurrency = CurrencyViewModelCreator.CreateViewModel(
                currency: swap.PurchasedCurrency,
                subscribeToUpdates: false);

            var fromAmount = AmountHelper.QtyToAmount(swap.Side, swap.Qty, swap.Price);
            var toAmount   = AmountHelper.QtyToAmount(swap.Side.Opposite(), swap.Qty, swap.Price);

            return(new SwapViewModel
            {
                Id = swap.Id.ToString(),
                CompactState = CompactStateBySwap(swap),
                Mode = ModeBySwap(swap),
                Time = swap.TimeStamp,

                FromBrush = new SolidColorBrush(fromCurrency.AmountColor),
                FromAmount = fromAmount,
                FromAmountFormat = fromCurrency.CurrencyFormat,
                FromCurrencyCode = fromCurrency.CurrencyCode,

                ToBrush = new SolidColorBrush(toCurrency.AmountColor),
                ToAmount = toAmount,
                ToAmountFormat = toCurrency.CurrencyFormat,
                ToCurrencyCode = toCurrency.CurrencyCode,

                Price = swap.Price,
                PriceFormat = $"F{swap.Symbol.Quote.Digits}"
            });
        }
Ejemplo n.º 6
0
        private async Task <IBitcoinBasedTransaction> CreateRefundTxAsync(
            Swap swap,
            IBitcoinBasedTransaction paymentTx,
            string refundAddress,
            DateTimeOffset lockTime,
            byte[] redeemScript)
        {
            Log.Debug("Create refund tx for swap {@swapId}", swap.Id);

            var currency = Currencies.Get <BitcoinBasedCurrency>(Currency);

            var amountInSatoshi = currency.CoinToSatoshi(AmountHelper.QtyToAmount(swap.Side, swap.Qty, swap.Price, currency.DigitsMultiplier));

            var tx = await _transactionFactory
                     .CreateSwapRefundTxAsync(
                paymentTx : paymentTx,
                amount : amountInSatoshi,
                refundAddress : refundAddress,
                lockTime : lockTime,
                redeemScript : redeemScript)
                     .ConfigureAwait(false);

            if (tx == null)
            {
                throw new InternalException(
                          code: Errors.TransactionCreationError,
                          description: $"Refund tx creation error for swap {swap.Id}");
            }

            tx.Type = BlockchainTransactionType.Output | BlockchainTransactionType.SwapRefund;

            Log.Debug("Refund tx successfully created for swap {@swapId}", swap.Id);

            return(tx);
        }
Ejemplo n.º 7
0
        public ShippingOptionUpdateResponse UpdateShippingMethod(ICart cart, ShippingOptionUpdateRequest shippingOptionUpdateRequest)
        {
            var configuration = GetConfiguration(cart.Market);
            var shipment      = cart.GetFirstShipment();

            if (shipment != null && Guid.TryParse(shippingOptionUpdateRequest.SelectedShippingOption.Id, out Guid guid))
            {
                shipment.ShippingMethodId = guid;
                shipment.ShippingAddress  = shippingOptionUpdateRequest.ShippingAddress.ToOrderAddress(cart);
                _orderRepository.Save(cart);
            }

            var totals = _orderGroupTotalsCalculator.GetTotals(cart);
            var result = new ShippingOptionUpdateResponse
            {
                OrderAmount      = AmountHelper.GetAmount(totals.Total),
                OrderTaxAmount   = AmountHelper.GetAmount(totals.TaxTotal),
                OrderLines       = GetOrderLines(cart, totals, configuration.SendProductAndImageUrl),
                PurchaseCurrency = cart.Currency.CurrencyCode
            };

            if (ServiceLocator.Current.TryGetExistingInstance(out ICheckoutOrderDataBuilder checkoutOrderDataBuilder))
            {
                checkoutOrderDataBuilder.Build(result, cart, configuration);
            }
            return(result);
        }
Ejemplo n.º 8
0
        public AddressUpdateResponse UpdateAddress(ICart cart, AddressUpdateRequest addressUpdateRequest)
        {
            var configuration = GetConfiguration(cart.Market);
            var shipment      = cart.GetFirstShipment();

            if (shipment != null)
            {
                shipment.ShippingAddress = addressUpdateRequest.ShippingAddress.ToOrderAddress(cart);
                _orderRepository.Save(cart);
            }

            var totals = _orderGroupTotalsCalculator.GetTotals(cart);
            var result = new AddressUpdateResponse
            {
                OrderAmount      = AmountHelper.GetAmount(totals.Total),
                OrderTaxAmount   = AmountHelper.GetAmount(totals.TaxTotal),
                OrderLines       = GetOrderLines(cart, totals, configuration.SendProductAndImageUrl),
                PurchaseCurrency = cart.Currency.CurrencyCode,
                ShippingOptions  = configuration.ShippingOptionsInIFrame ? GetShippingOptions(cart, cart.Currency, ContentLanguage.PreferredCulture) : Enumerable.Empty <ShippingOption>()
            };

            if (ServiceLocator.Current.TryGetExistingInstance(out ICheckoutOrderDataBuilder checkoutOrderDataBuilder))
            {
                checkoutOrderDataBuilder.Build(result, cart, configuration);
            }
            return(result);
        }
        public decimal EstimatedDealPrice(Side side, decimal amount)
        {
            var amountToFill = amount;

            lock (SyncRoot)
            {
                var book = side == Side.Buy
                    ? Sells
                    : Buys;

                if (amount == 0)
                {
                    return(book.Any() ? book.First().Key : 0);
                }

                foreach (var entryPair in book)
                {
                    var qty             = entryPair.Value.Qty();
                    var availableAmount = AmountHelper.QtyToAmount(side, qty, entryPair.Key);

                    amountToFill -= availableAmount;

                    if (amountToFill <= 0)
                    {
                        return(entryPair.Key);
                    }
                }
            }

            return(0m);
        }
Ejemplo n.º 10
0
        public override async Task <decimal> GetRewardForRedeemAsync(
            decimal maxRewardPercent,
            decimal maxRewardPercentInBase,
            string feeCurrencyToBaseSymbol,
            decimal feeCurrencyToBasePrice,
            string feeCurrencySymbol            = null,
            decimal feeCurrencyPrice            = 0,
            CancellationToken cancellationToken = default)
        {
            var rewardForRedeemInEth = await base.GetRewardForRedeemAsync(
                maxRewardPercent : maxRewardPercent,
                maxRewardPercentInBase : maxRewardPercentInBase,
                feeCurrencyToBaseSymbol : feeCurrencyToBaseSymbol,
                feeCurrencyToBasePrice : feeCurrencyToBasePrice,
                feeCurrencySymbol : feeCurrencySymbol,
                feeCurrencyPrice : feeCurrencyPrice,
                cancellationToken : cancellationToken);

            if (feeCurrencySymbol == null || feeCurrencyPrice == 0)
            {
                return(0m);
            }

            return(AmountHelper.RoundDown(feeCurrencySymbol.IsBaseCurrency(Name)
                ? rewardForRedeemInEth / feeCurrencyPrice
                : rewardForRedeemInEth *feeCurrencyPrice, DigitsMultiplier));
        }
Ejemplo n.º 11
0
        private async Task <Error> SendSwapAsync()
        {
            try
            {
                var account = App.Account;

                var requiredAmount = Amount + EstimatedPaymentFee;

                var fromWallets = (await account
                                   .GetUnspentAddressesAsync(
                                       currency: FromCurrency,
                                       amount: requiredAmount,
                                       fee: 0,
                                       feePrice: 0,
                                       isFeePerTransaction: false,
                                       addressUsagePolicy: AddressUsagePolicy.UseMinimalBalanceFirst))
                                  .ToList();

                if (requiredAmount > 0 && !fromWallets.Any())
                {
                    return(new Error(Errors.SwapError, Resources.CvInsufficientFunds));
                }

                var symbol    = App.Account.Symbols.SymbolByCurrencies(FromCurrency, ToCurrency);
                var side      = symbol.OrderSideForBuyCurrency(ToCurrency);
                var terminal  = App.Terminal;
                var orderBook = terminal.GetOrderBook(symbol);
                var price     = orderBook.EstimatedDealPrice(side, Amount);

                if (price == 0)
                {
                    return(new Error(Errors.NoLiquidity, Resources.CvNoLiquidity));
                }

                var qty = Math.Round(AmountHelper.AmountToQty(side, Amount, price), symbol.Base.Digits);

                var order = new Order
                {
                    Symbol      = symbol,
                    TimeStamp   = DateTime.UtcNow,
                    Price       = price,
                    Qty         = qty,
                    Side        = side,
                    Type        = OrderType.FillOrKill,
                    FromWallets = fromWallets.ToList(),
                };

                await order.CreateProofOfPossessionAsync(account);

                terminal.OrderSendAsync(order);
            }
            catch (Exception e)
            {
                Log.Error(e, "Conversion error");

                return(new Error(Errors.SwapError, Resources.CvConversionError));
            }

            return(null);
        }
Ejemplo n.º 12
0
 public static OrderLine GetOrderLine(this ILineItem lineItem, bool includeProductAndImageUrl = false)
 {
     return(GetOrderLine(
                lineItem,
                includeProductAndImageUrl,
                AmountHelper.GetAmount(lineItem.PlacedPrice),
                AmountHelper.GetAmount(lineItem.PlacedPrice * lineItem.Quantity),
                0, 0, 0));
 }
Ejemplo n.º 13
0
        private CheckoutOrderData GetCheckoutOrderData(
            ICart cart, IMarket market, PaymentMethodDto paymentMethodDto)
        {
            var totals        = _orderGroupCalculator.GetOrderGroupTotals(cart);
            var shipment      = cart.GetFirstShipment();
            var marketCountry = CountryCodeHelper.GetTwoLetterCountryCode(market.Countries.FirstOrDefault());

            if (string.IsNullOrWhiteSpace(marketCountry))
            {
                throw new ConfigurationException($"Please select a country in CM for market {cart.MarketId}");
            }
            var checkoutConfiguration = GetCheckoutConfiguration(market);

            var orderData = new PatchedCheckoutOrderData
            {
                PurchaseCountry  = marketCountry,
                PurchaseCurrency = cart.Currency.CurrencyCode,
                Locale           = ContentLanguage.PreferredCulture.Name,
                // Non-negative, minor units. Total amount of the order, including tax and any discounts.
                OrderAmount = AmountHelper.GetAmount(totals.Total),
                // Non-negative, minor units. The total tax amount of the order.
                OrderTaxAmount = AmountHelper.GetAmount(totals.TaxTotal),
                MerchantUrls   = GetMerchantUrls(cart),
                OrderLines     = GetOrderLines(cart, totals, checkoutConfiguration.SendProductAndImageUrl)
            };

            if (checkoutConfiguration.SendShippingCountries)
            {
                orderData.ShippingCountries = GetCountries().ToList();
            }

            // KCO_6 Setting to let the user select shipping options in the iframe
            if (checkoutConfiguration.SendShippingOptionsPriorAddresses)
            {
                if (checkoutConfiguration.ShippingOptionsInIFrame)
                {
                    orderData.ShippingOptions = GetShippingOptions(cart, cart.Currency, ContentLanguage.PreferredCulture);
                }
                else
                {
                    if (shipment != null)
                    {
                        orderData.SelectedShippingOption = ShippingManager.GetShippingMethod(shipment.ShippingMethodId)
                                                           ?.ShippingMethod?.FirstOrDefault()
                                                           ?.ToShippingOption();
                    }
                }
            }

            if (paymentMethodDto != null)
            {
                orderData.Options = GetOptions(cart.MarketId);
            }
            return(orderData);
        }
Ejemplo n.º 14
0
        static void Main()
        {
            //var k = NumberToWord.AmountToWords(101.155);
            var k1 = AmountHelper.AmountToWords(101.155, "", "");

            var k2 = 10.0;

            var k = k2.ToWords();

            Console.WriteLine("Hello World!");
        }
Ejemplo n.º 15
0
        public Dictionary <string, Decimal> GetTrendByMarkets(string currency)
        {
            Dictionary <string, Decimal> markets = new Dictionary <string, Decimal>();
            var            tm             = AmountHelper.DateTimeToUnixTimestamp(DateTime.UtcNow);
            var            exchange_stats = _dtoMain.mainDb.GetCollection <ExchangeTicker>("aaexchanges_real_twodays");
            DateTimeOffset dateTimeDaily  = new DateTimeOffset(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0,
                                                               new TimeSpan(0, 0, 0)).AddDays(-1);
            long unixTimeDaily = AmountHelper.DateTimeToUnixTimestamp(dateTimeDaily.UtcDateTime);

            var exchangeStats = exchange_stats.Find(m => m.InCurrency == currency && m.OutCurrency == "BTC" && m.Time >= unixTimeDaily).ToList();

            Dictionary <string, List <ExchangeTicker> > marketsList = new Dictionary <string, List <ExchangeTicker> >();

            foreach (var mrkt in exchangeStats)
            {
                if (!marketsList.ContainsKey(mrkt.MarketID))
                {
                    marketsList.Add(mrkt.MarketID, new List <ExchangeTicker>());
                    marketsList[mrkt.MarketID].Add(mrkt);
                }
                else
                {
                    marketsList[mrkt.MarketID].Add(mrkt);
                }
            }
            foreach (KeyValuePair <string, List <ExchangeTicker> > kv in marketsList)
            {
                Decimal dict24Prev = 0.0m;
                Decimal dict24Now = 0.0m;
                int     a = 0, b = 0, i = 0;
                foreach (var ex in kv.Value)
                {
                    if (i == 0)
                    {
                        dict24Prev += ex.Last;
                        a++;
                    }
                    else
                    {
                        dict24Now += ex.Last;
                        b++;
                    }
                    i++;
                }
                if (a == 0 || b == 0 || dict24Prev == 0)
                {
                    markets.Add(kv.Key, 0.0m);
                    continue;
                }
                Decimal trend = (dict24Now / b) * 100 / (dict24Prev / a) - 100;
                markets.Add(kv.Key, trend);
            }
            return(markets);
        }
        private async Task <IBitcoinBasedTransaction> CreatePaymentTxAsync(
            Swap swap,
            string refundAddress,
            DateTimeOffset lockTime)
        {
            var currency = Currencies.Get <BitcoinBasedConfig>(swap.SoldCurrency);

            Log.Debug("Create swap payment {@currency} tx for swap {@swapId}",
                      currency.Name,
                      swap.Id);

            var amountInSatoshi = currency.CoinToSatoshi(
                AmountHelper.QtyToSellAmount(
                    swap.Side,
                    swap.Qty,
                    swap.Price,
                    currency.DigitsMultiplier));

            // maker network fee
            if (swap.MakerNetworkFee > 0)
            {
                var makerNetworkFeeInSatoshi = currency.CoinToSatoshi(swap.MakerNetworkFee);

                if (makerNetworkFeeInSatoshi < amountInSatoshi) // network fee size check
                {
                    amountInSatoshi += makerNetworkFeeInSatoshi;
                }
            }

            var tx = await _transactionFactory
                     .CreateSwapPaymentTxAsync(
                fromOutputs : swap.FromOutputs,
                amount : amountInSatoshi,
                refundAddress : refundAddress,
                toAddress : swap.PartyAddress,
                lockTime : lockTime,
                secretHash : swap.SecretHash,
                secretSize : DefaultSecretSize,
                currencyConfig : currency)
                     .ConfigureAwait(false);

            if (tx == null)
            {
                throw new InternalException(
                          code: Errors.TransactionCreationError,
                          description: $"Payment tx creation error for swap {swap.Id}");
            }

            tx.Type = BlockchainTransactionType.Output | BlockchainTransactionType.SwapPayment;

            Log.Debug("Payment tx successfully created for swap {@swapId}", swap.Id);

            return(tx);
        }
Ejemplo n.º 17
0
        private Session GetSessionRequest(ICart cart, PaymentsConfiguration config, Uri siteUrl, bool includePersonalInformation = false)
        {
            var market  = _marketService.GetMarket(cart.MarketId);
            var totals  = _orderGroupCalculator.GetOrderGroupTotals(cart);
            var request = new Session
            {
                PurchaseCountry = CountryCodeHelper.GetTwoLetterCountryCode(market.Countries.FirstOrDefault()),
                OrderAmount     = AmountHelper.GetAmount(totals.Total),
                // Non-negative, minor units. The total tax amount of the order.
                OrderTaxAmount   = AmountHelper.GetAmount(totals.TaxTotal),
                PurchaseCurrency = cart.Currency.CurrencyCode,
                Locale           = _languageService.GetPreferredCulture().Name,
                OrderLines       = GetOrderLines(cart, totals, config.SendProductAndImageUrlField).ToArray()
            };

            var paymentMethod = PaymentManager.GetPaymentMethodBySystemName(
                Constants.KlarnaPaymentSystemKeyword, _languageService.GetPreferredCulture().Name, returnInactive: true);

            if (paymentMethod != null)
            {
                request.MerchantUrl = new MerchantUrl
                {
                    Confirmation = ToFullSiteUrl(siteUrl, config.ConfirmationUrl),
                    Notification = ToFullSiteUrl(siteUrl, config.NotificationUrl),
                };
                request.Options     = GetWidgetOptions(paymentMethod, cart.MarketId);
                request.AutoCapture = config.AutoCapture;
            }

            if (includePersonalInformation)
            {
                var shipment = cart.GetFirstShipment();
                var payment  = cart.GetFirstForm()?.Payments.FirstOrDefault();

                if (shipment?.ShippingAddress != null)
                {
                    request.ShippingAddress = shipment.ShippingAddress.ToAddress();
                }
                if (payment?.BillingAddress != null)
                {
                    request.BillingAddress = payment.BillingAddress.ToAddress();
                }
                else if (request.ShippingAddress != null)
                {
                    request.BillingAddress = new OrderManagementAddressInfo()
                    {
                        Email = request.ShippingAddress?.Email,
                        Phone = request.ShippingAddress?.Phone
                    };
                }
            }
            return(request);
        }
Ejemplo n.º 18
0
        private List <OrderLine> GetOrderLinesWithTax(ICart cart, OrderGroupTotals orderGroupTotals, bool sendProductAndImageUrl)
        {
            var shipment   = cart.GetFirstShipment();
            var orderLines = new List <OrderLine>();
            var market     = _marketService.GetMarket(cart.MarketId);

            // Line items
            foreach (var lineItem in cart.GetAllLineItems())
            {
                var orderLine = lineItem.GetOrderLineWithTax(market, cart.GetFirstShipment(), cart.Currency, sendProductAndImageUrl);
                orderLines.Add(orderLine);
            }

            // Shipment
            if (shipment != null && orderGroupTotals.ShippingTotal.Amount > 0)
            {
                var shipmentOrderLine = shipment.GetOrderLine(cart, orderGroupTotals, true);
                orderLines.Add(shipmentOrderLine);
            }

            // Without tax
            var orderLevelDiscount = AmountHelper.GetAmount(cart.GetOrderDiscountTotal());

            if (orderLevelDiscount > 0)
            {
                // Order level discounts with tax
                var totalOrderAmountWithoutDiscount =
                    orderLines
                    .Sum(x => x.TotalAmount);
                var totalOrderAmountWithDiscount   = AmountHelper.GetAmount(orderGroupTotals.Total.Amount);
                var orderLevelDiscountIncludingTax = totalOrderAmountWithoutDiscount - totalOrderAmountWithDiscount;

                // Tax
                var totalTaxAmountWithoutDiscount =
                    orderLines
                    .Sum(x => x.TotalTaxAmount);
                var totalTaxAmountWithDiscount = AmountHelper.GetAmount(orderGroupTotals.TaxTotal);
                var discountTax = totalTaxAmountWithoutDiscount - totalTaxAmountWithDiscount;
                var taxRate     = discountTax * 100 / (orderLevelDiscountIncludingTax - discountTax);

                orderLines.Add(new OrderLine()
                {
                    Type           = OrderLineType.discount,
                    Name           = "Discount",
                    Quantity       = 1,
                    TotalAmount    = orderLevelDiscountIncludingTax * -1,
                    UnitPrice      = orderLevelDiscountIncludingTax * -1,
                    TotalTaxAmount = discountTax * -1,
                    TaxRate        = AmountHelper.GetAmount(taxRate)
                });
            }
            return(orderLines);
        }
Ejemplo n.º 19
0
        private decimal RequiredAmountInTokens(Swap swap, Erc20Config erc20)
        {
            var requiredAmountInERC20 = AmountHelper.QtyToSellAmount(swap.Side, swap.Qty, swap.Price, erc20.DigitsMultiplier);

            // maker network fee
            if (swap.MakerNetworkFee > 0 && swap.MakerNetworkFee < requiredAmountInERC20) // network fee size check
            {
                requiredAmountInERC20 += AmountHelper.RoundDown(swap.MakerNetworkFee, erc20.DigitsMultiplier);
            }

            return(requiredAmountInERC20);
        }
        private async Task <IBitcoinBasedTransaction> CreateRedeemTxAsync(
            Swap swap,
            IBitcoinBasedTransaction paymentTx,
            string redeemAddress,
            byte[] redeemScript,
            bool increaseSequenceNumber = false)
        {
            Log.Debug("Create redeem tx for swap {@swapId}", swap.Id);

            var currency = Currencies.Get <BitcoinBasedConfig>(Currency);

            var amountInSatoshi = currency.CoinToSatoshi(
                AmountHelper.QtyToSellAmount(
                    swap.Side.Opposite(),
                    swap.Qty,
                    swap.Price,
                    currency.DigitsMultiplier));

            var sequenceNumber = 0u;

            if (increaseSequenceNumber)
            {
                var previousSequenceNumber = (swap?.RedeemTx as IBitcoinBasedTransaction)?.GetSequenceNumber(0) ?? 0;

                sequenceNumber = previousSequenceNumber == 0
                    ? Sequence.SEQUENCE_FINAL - 1024
                    : (previousSequenceNumber == Sequence.SEQUENCE_FINAL
                        ? Sequence.SEQUENCE_FINAL
                        : previousSequenceNumber + 1);
            }

            var tx = await _transactionFactory
                     .CreateSwapRedeemTxAsync(
                paymentTx : paymentTx,
                amount : amountInSatoshi,
                redeemAddress : redeemAddress,
                redeemScript : redeemScript,
                currency : currency,
                sequenceNumber : sequenceNumber)
                     .ConfigureAwait(false);

            if (tx == null)
            {
                throw new InternalException(
                          code: Errors.TransactionCreationError,
                          description: $"Redeem tx creation error for swap {swap.Id}");
            }

            tx.Type = BlockchainTransactionType.Output | BlockchainTransactionType.SwapRedeem;

            return(tx);
        }
Ejemplo n.º 21
0
 public static ShippingOption ToShippingOption(this ShippingMethodDto.ShippingMethodRow method)
 {
     return(new ShippingOption
     {
         Id = method.ShippingMethodId.ToString(),
         Name = method.DisplayName,
         Price = AmountHelper.GetAmount(method.BasePrice),
         PreSelected = method.IsDefault,
         TaxAmount = 0,
         TaxRate = 0,
         Description = method.Description
     });
 }
Ejemplo n.º 22
0
        private List <OrderLine> GetOrderLinesWithoutTax(ICart cart, OrderGroupTotals orderGroupTotals, bool sendProductAndImageUrl)
        {
            var shipment   = cart.GetFirstShipment();
            var orderLines = new List <OrderLine>();

            // Line items
            foreach (var lineItem in cart.GetAllLineItems())
            {
                var orderLine = lineItem.GetOrderLine(sendProductAndImageUrl);
                orderLines.Add(orderLine);
            }

            // Shipment
            if (shipment != null && orderGroupTotals.ShippingTotal.Amount > 0)
            {
                var shipmentOrderLine = shipment.GetOrderLine(cart, orderGroupTotals, false);
                orderLines.Add(shipmentOrderLine);
            }

            // Sales tax
            orderLines.Add(new PatchedOrderLine()
            {
                Type           = "sales_tax",
                Name           = "Sales Tax",
                Quantity       = 1,
                TotalAmount    = AmountHelper.GetAmount(orderGroupTotals.TaxTotal),
                UnitPrice      = AmountHelper.GetAmount(orderGroupTotals.TaxTotal),
                TotalTaxAmount = 0,
                TaxRate        = 0
            });

            // Order level discounts
            var orderDiscount      = cart.GetOrderDiscountTotal(cart.Currency);
            var entryLevelDiscount = cart.GetAllLineItems().Sum(x => x.GetEntryDiscount());
            var totalDiscount      = orderDiscount.Amount + entryLevelDiscount;

            if (totalDiscount > 0)
            {
                orderLines.Add(new PatchedOrderLine()
                {
                    Type           = "discount",
                    Name           = "Discount",
                    Quantity       = 1,
                    TotalAmount    = -AmountHelper.GetAmount(totalDiscount),
                    UnitPrice      = -AmountHelper.GetAmount(totalDiscount),
                    TotalTaxAmount = 0,
                    TaxRate        = 0
                });
            }
            return(orderLines);
        }
Ejemplo n.º 23
0
        public static Prices GetPrices(ILineItem lineItem, IMarket market, IShipment shipment, Currency currency)
        {
            /*
             * unit_price integer required
             *  Minor units. Includes tax, excludes discount. (max value: 100000000)
             * tax_rate integer required
             *  Non-negative. In percent, two implicit decimals. I.e 2500 = 25%.
             * total_amount integer required
             *  Includes tax and discount. Must match (quantity * unit_price) - total_discount_amount within �quantity. (max value: 100000000)
             * total_tax_amount integer required
             *  Must be within �1 of total_amount - total_amount * 10000 / (10000 + tax_rate). Negative when type is discount.
             * total_discount_amount integer
             *  Non - negative minor units. Includes tax.
             */
            var taxType = TaxType.SalesTax;

            // All excluding tax
            var unitPrice = lineItem.PlacedPrice;
            var totalPriceWithoutDiscount = lineItem.PlacedPrice * lineItem.Quantity;
            var extendedPrice             = lineItem.GetDiscountedPrice(currency);
            var discountAmount            = (totalPriceWithoutDiscount - extendedPrice);

            // Tax value
            var taxValues     = _lineItemTaxCalculator.Service.GetTaxValuesForLineItem(lineItem, market, shipment);
            var taxPercentage = taxValues
                                .Where(x => x.TaxType == taxType)
                                .Sum(x => (decimal)x.Percentage);

            // Using ITaxCalculator instead of ILineItemCalculator because ILineItemCalculator
            // calculates tax from the price which includes order discount amount and line item discount amount
            // but should use only line item discount amount
            var salesTax =
                _taxCalculator.Service.GetSalesTax(lineItem, market, shipment.ShippingAddress, extendedPrice);

            // Includes tax, excludes discount. (max value: 100000000)
            var unitPriceIncludingTax = AmountHelper.GetAmount(
                _lineItemTaxCalculator.Service.PriceIncludingTaxPercent(unitPrice, taxPercentage, market));
            // Non - negative minor units. Includes tax
            var totalDiscountAmount = AmountHelper.GetAmount(
                _lineItemTaxCalculator.Service.PriceIncludingTaxPercent(discountAmount, taxPercentage, market));
            // Includes tax and discount. Must match (quantity * unit_price) - total_discount_amount within quantity. (max value: 100000000)
            var totalAmount = AmountHelper.GetAmount(
                _lineItemTaxCalculator.Service.PriceIncludingTaxAmount(extendedPrice, salesTax.Amount, market));
            // Non-negative. In percent, two implicit decimals. I.e 2500 = 25%.
            var taxRate = AmountHelper.GetAmount(taxPercentage);
            // Must be within 1 of total_amount - total_amount * 10000 / (10000 + tax_rate). Negative when type is discount.
            var totalTaxAmount = AmountHelper.GetAmount(salesTax.Amount);

            return(new Prices(unitPriceIncludingTax, taxRate, totalDiscountAmount, totalAmount, totalTaxAmount));
        }
Ejemplo n.º 24
0
        public static SwapViewModel CreateSwapViewModel(Swap swap, ICurrencies currencies)
        {
            try
            {
                var soldCurrency      = currencies.GetByName(swap.SoldCurrency);
                var purchasedCurrency = currencies.GetByName(swap.PurchasedCurrency);

                var fromCurrencyViewModel = CurrencyViewModelCreator.CreateViewModel(
                    currencyConfig: soldCurrency,
                    subscribeToUpdates: false);

                var toCurrencyViewModel = CurrencyViewModelCreator.CreateViewModel(
                    currencyConfig: purchasedCurrency,
                    subscribeToUpdates: false);

                var fromAmount = AmountHelper.QtyToAmount(swap.Side, swap.Qty, swap.Price, soldCurrency.DigitsMultiplier);
                var toAmount   = AmountHelper.QtyToAmount(swap.Side.Opposite(), swap.Qty, swap.Price, purchasedCurrency.DigitsMultiplier);

                var quoteCurrency = swap.Symbol.QuoteCurrency() == swap.SoldCurrency
                    ? soldCurrency
                    : purchasedCurrency;

                return(new SwapViewModel
                {
                    Id = swap.Id.ToString(),
                    CompactState = CompactStateBySwap(swap),
                    Mode = ModeBySwap(swap),
                    Time = swap.TimeStamp,

                    FromBrush = new SolidColorBrush(fromCurrencyViewModel.AmountColor),
                    FromAmount = fromAmount,
                    FromAmountFormat = fromCurrencyViewModel.CurrencyFormat,
                    FromCurrencyCode = fromCurrencyViewModel.CurrencyCode,

                    ToBrush = new SolidColorBrush(toCurrencyViewModel.AmountColor),
                    ToAmount = toAmount,
                    ToAmountFormat = toCurrencyViewModel.CurrencyFormat,
                    ToCurrencyCode = toCurrencyViewModel.CurrencyCode,

                    Price = swap.Price,
                    PriceFormat = $"F{quoteCurrency.Digits}"
                });
            }
            catch (Exception e)
            {
                Log.Error(e, $"Error while create SwapViewModel for {swap.Symbol} swap with id {swap.Id}");

                return(null);
            }
        }
Ejemplo n.º 25
0
        public Task <IBitcoinBasedTransaction> CreateSwapRefundTxAsync(
            IBitcoinBasedTransaction paymentTx,
            ClientSwap swap,
            string refundAddress,
            DateTimeOffset lockTime)
        {
            var currency    = (BitcoinBasedCurrency)paymentTx.Currency;
            var orderAmount = (long)(AmountHelper.QtyToAmount(swap.Side, swap.Qty, swap.Price) *
                                     currency.DigitsMultiplier);

            var swapOutputs = paymentTx.Outputs
                              .Cast <BitcoinBasedTxOutput>()
                              .Where(o => o.Value == orderAmount && o.IsSwapPayment)
                              .ToList();

            if (swapOutputs.Count != 1)
            {
                throw new Exception("Payment tx must have only one swap payment output");
            }

            var estimatedSigSize = EstimateSigSize(swapOutputs, forRefund: true);

            var txSize = currency
                         .CreateSwapRefundTx(
                unspentOutputs: swapOutputs,
                destinationAddress: refundAddress,
                changeAddress: refundAddress,
                amount: orderAmount,
                fee: 0,
                lockTime: lockTime)
                         .VirtualSize();

            var fee = (long)(currency.FeeRate * (txSize + estimatedSigSize));

            if (orderAmount - fee < 0)
            {
                throw new Exception($"Insufficient funds for fee. Available {orderAmount}, required {fee}");
            }

            var tx = currency.CreateSwapRefundTx(
                unspentOutputs: swapOutputs,
                destinationAddress: refundAddress,
                changeAddress: refundAddress,
                amount: orderAmount - fee,
                fee: fee,
                lockTime: lockTime);

            return(Task.FromResult(tx));
        }
Ejemplo n.º 26
0
#pragma warning restore 649

        public static OrderLine GetOrderLine(this IShipment shipment, ICart cart, OrderGroupTotals totals, bool includeTaxes)
        {
            var total          = AmountHelper.GetAmount(totals.ShippingTotal);
            var totalTaxAmount = 0;
            var taxRate        = 0;

            if (includeTaxes)
            {
                var market           = _marketService.Service.GetMarket(cart.MarketId);
                var shippingTaxTotal = _shippingCalculator.Service.GetShippingTax(shipment, market, cart.Currency);

                if (shippingTaxTotal.Amount > 0)
                {
                    totalTaxAmount = AmountHelper.GetAmount(shippingTaxTotal.Amount);

                    var shippingTotalExcludingTax = market.PricesIncludeTax
                        ? totals.ShippingTotal.Amount - shippingTaxTotal.Amount
                        : totals.ShippingTotal.Amount;
                    taxRate = AmountHelper.GetAmount(shippingTaxTotal.Amount * 100 / shippingTotalExcludingTax);

                    if (!market.PricesIncludeTax)
                    {
                        total = total + totalTaxAmount;
                    }
                }
            }

            var shipmentOrderLine = new OrderLine
            {
                Name           = shipment.ShippingMethodName,
                Quantity       = 1,
                UnitPrice      = total,
                TotalAmount    = total,
                TaxRate        = taxRate,
                TotalTaxAmount = totalTaxAmount,
                Type           = OrderLineType.shipping_fee
            };

            if (string.IsNullOrEmpty(shipmentOrderLine.Name))
            {
                var shipmentMethod = Mediachase.Commerce.Orders.Managers.ShippingManager.GetShippingMethod(shipment.ShippingMethodId)
                                     .ShippingMethod.FirstOrDefault();
                if (shipmentMethod != null)
                {
                    shipmentOrderLine.Name = shipmentMethod.DisplayName;
                }
            }
            return(shipmentOrderLine);
        }
        public void GetAmount_Should_ReturnDynamicRewardForFriendMention()
        {
            _statServiceMock.Setup(x => x.GetPreviousDayStat()).Returns(new Stat
            {
                Id = 1,
                TotalWithdrawals = 333,
                NewUsers         = 190,
                WithdrawalAmount = 2233.5m
            });

            var amountHelper = new AmountHelper(_appSettings, _statServiceMock.Object);
            var reward       = amountHelper.GetAmount(RewardType.FriendMention);

            Assert.True(reward < _appSettings.BotSettings.AmountForTweetWithFriendMention);
        }
        public void GetAmount_Should_ReturnFixedRewardForTag()
        {
            _statServiceMock.Setup(x => x.GetPreviousDayStat()).Returns(new Stat
            {
                Id = 1,
                TotalWithdrawals = 1,
                NewUsers         = 190,
                WithdrawalAmount = 12.5m
            });

            var amountHelper = new AmountHelper(_appSettings, _statServiceMock.Object);
            var reward       = amountHelper.GetAmount(RewardType.Tag);

            Assert.True(reward == _appSettings.BotSettings.AmountForTweetWithTag);
        }
Ejemplo n.º 29
0
        public List <ExchangesCurrency> GetExchangePrice(string currency, List <Exchanges> extList = null)
        {
            List <Exchanges> exchanges = extList;

            if (exchanges == null)
            {
                exchanges = GetExchanges();
            }
            var tm             = AmountHelper.DateTimeToUnixTimestamp(DateTime.UtcNow);
            var exchange_stats = _dtoMain.mainDb.GetCollection <ExchangeTicker>("aaexchanges_real");
            var exchangeStats  = exchange_stats.Find(m => m.InCurrency == currency && m.OutCurrency == "BTC").SortByDescending(s => s.Volume).ToList();
            var lst            = new List <ExchangesCurrency>();

            if (exchangeStats.Count == 0)
            {
                return(lst);
            }
            var trends = GetTrendByMarkets(currency);

            foreach (var ex in exchangeStats)
            {
                var exchange = exchanges.FirstOrDefault(m => m.MarketId == ex.MarketID);
                if (exchange == null)
                {
                    continue;
                }
                string exchangeUrlCoin = currency;
                if (exchange.ExchangeDirectUrlParam == "lower")
                {
                    exchangeUrlCoin = exchangeUrlCoin.ToLower();
                }
                var directUrl = string.Format(exchange.ExchangeDirectUrl, exchangeUrlCoin);
                lst.Add(new ExchangesCurrency()
                {
                    Buy               = ex.Buy,
                    Sell              = ex.Sell,
                    Last              = ex.Last,
                    Volume            = ex.Volume,
                    Change            = trends.ContainsKey(ex.MarketID) ? trends[ex.MarketID] : 0.0m,
                    Exchange          = exchange.Exchange,
                    ExchangeUrl       = exchange.ExchangeUrl,
                    ExchangeDirectUrl = directUrl,
                    Time              = ex.Time,
                    MarketID          = ex.MarketID
                });
            }
            return(lst);
        }
Ejemplo n.º 30
0
        public (decimal, decimal) EstimateOrderPrices(
            Side side,
            decimal amount,
            decimal amountDigitsMultiplier,
            decimal qtyDigitsMultiplier)
        {
            var requiredAmount = amount;

            lock (SyncRoot)
            {
                var book = side == Side.Buy
                    ? Sells
                    : Buys;

                if (amount == 0)
                {
                    return(book.Any()
                        ? (book.First().Key, book.First().Key)
                        : (0m, 0m));
                }

                var totalUsedQuoteAmount = 0m;
                var totalUsedQty         = 0m;

                foreach (var entryPair in book)
                {
                    var qty   = entryPair.Value.Qty();
                    var price = entryPair.Key;

                    var availableAmount = AmountHelper.QtyToAmount(side, qty, price, amountDigitsMultiplier);

                    var usedAmount = Math.Min(requiredAmount, availableAmount);
                    var usedQty    = AmountHelper.AmountToQty(side, usedAmount, price, qtyDigitsMultiplier);

                    totalUsedQuoteAmount += usedQty * price;
                    totalUsedQty         += usedQty;

                    requiredAmount -= usedAmount;

                    if (requiredAmount <= 0)
                    {
                        return(price, totalUsedQuoteAmount / totalUsedQty);
                    }
                }
            }

            return(0m, 0m);
        }