예제 #1
0
        public bool Set(string key, object value)
        {
            bool result = false;

            using (X42DbContext dbContext = new X42DbContext(databaseSettings.ConnectionString))
            {
                var item = dbContext.DictionaryItems.Where(d => d.Key == key).FirstOrDefault();
                if (item == null)
                {
                    var newDictionaryItem = new DictionaryData()
                    {
                        Key   = key,
                        Value = ConvertType <string>(value)
                    };
                    var addedItem = dbContext.Add(newDictionaryItem);
                    if (addedItem.State == EntityState.Added)
                    {
                        dbContext.SaveChanges();
                        result = true;
                    }
                }
                else
                {
                    item.Value = ConvertType <string>(value);
                    dbContext.SaveChanges();
                    result = true;
                }
            }
            return(result);
        }
예제 #2
0
        public async Task <PriceLockResult> CreatePriceLock(CreatePriceLockRequest priceLockRequest, string validPriceLockId = "")
        {
            var result   = new PriceLockResult();
            var fiatPair = FiatPairs.Where(f => (int)f.Currency == priceLockRequest.RequestAmountPair).FirstOrDefault();

            if (fiatPair != null)
            {
                var averagePrice = fiatPair.GetPrice();
                if (averagePrice != -1)
                {
                    var price = Math.Round(priceLockRequest.RequestAmount / averagePrice, 8).Normalize();
                    var fee   = Math.Round(price * priceLockFeePercent / 100, 8).Normalize();

                    var feeAddress  = networkFeatures.GetMyFeeAddress();
                    var signAddress = networkFeatures.GetMySignAddress();

                    if (price < 42000000)
                    {
                        var expirationBlock = Convert.ToInt32(networkFeatures.BestBlockHeight + Convert.ToInt32(priceLockRequest.ExpireBlock));
                        if (!string.IsNullOrEmpty(validPriceLockId))
                        {
                            expirationBlock = Convert.ToInt32(priceLockRequest.ExpireBlock);
                        }

                        using (X42DbContext dbContext = new X42DbContext(databaseSettings.ConnectionString))
                        {
                            var newPriceLock = new PriceLockData()
                            {
                                DestinationAddress = priceLockRequest.DestinationAddress,
                                DestinationAmount  = price,
                                FeeAmount          = fee,
                                SignAddress        = signAddress,
                                FeeAddress         = feeAddress,
                                ExpireBlock        = expirationBlock,
                                RequestAmount      = priceLockRequest.RequestAmount,
                                RequestAmountPair  = priceLockRequest.RequestAmountPair,
                                Status             = (int)Status.New
                            };
                            if (!string.IsNullOrEmpty(validPriceLockId))
                            {
                                newPriceLock.PriceLockId = new Guid(validPriceLockId);
                            }
                            var newPriceLockRecord = dbContext.Add(newPriceLock);
                            if (newPriceLockRecord.State == EntityState.Added)
                            {
                                string signature = await networkFeatures.SignPriceLock($"{newPriceLock.PriceLockId}{newPriceLock.DestinationAddress}{newPriceLock.DestinationAmount}{newPriceLock.FeeAddress}{newPriceLock.FeeAmount}");

                                if (!string.IsNullOrEmpty(signature))
                                {
                                    newPriceLock.PriceLockSignature = signature;
                                    dbContext.SaveChanges();

                                    result.DestinationAddress = newPriceLock.DestinationAddress;
                                    result.DestinationAmount  = newPriceLock.DestinationAmount;
                                    result.FeeAddress         = newPriceLock.FeeAddress;
                                    result.SignAddress        = newPriceLock.SignAddress;
                                    result.FeeAmount          = newPriceLock.FeeAmount;
                                    result.RequestAmount      = newPriceLock.RequestAmount;
                                    result.RequestAmountPair  = newPriceLock.RequestAmountPair;
                                    result.PriceLockId        = newPriceLock.PriceLockId.ToString();
                                    result.PriceLockSignature = newPriceLock.PriceLockSignature;
                                    result.ExpireBlock        = newPriceLock.ExpireBlock;
                                    result.Status             = (int)Status.New;
                                    result.Success            = true;

                                    List <ServerNodeData> tier3Nodes = dbContext.ServerNodes.Where(s => s.Active && s.Tier == (int)TierLevel.Three).ToList();
                                    await networkFeatures.RelayPriceLock(newPriceLock, tier3Nodes, networkCancellationTokenSource.Token);
                                }
                                else
                                {
                                    result.ResultMessage = "Problem with node, Failed to sign price lock.";
                                    result.Success       = false;
                                }
                            }
                        }
                    }
                    else
                    {
                        result.ResultMessage = "Price not valid, max cap exceeded.";
                        result.Success       = false;
                    }
                }
                else
                {
                    result.ResultMessage = "Node could not create price lock because insufficient price data.";
                    result.Success       = false;
                }
            }
            else
            {
                result.ResultMessage = "The supplied pair does not exist.";
                result.Success       = false;
            }
            return(result);
        }