public IActionResult CreatePriceLock([FromBody] CreatePriceLockRequest priceLockRequest) { try { var result = this.xServerManager.CreatePriceLock(priceLockRequest); return(Json(result)); } catch (Exception e) { this.logger.LogError("Exception occurred: {0}", e.ToString()); return(ErrorHelpers.BuildErrorResponse(HttpStatusCode.BadRequest, e.Message, e.ToString())); } }
public async Task <IActionResult> CreatePriceLock([FromBody] CreatePriceLockRequest priceLockRequest) { xServer.Stats.IncrementPublicRequest(); if (xServer.Stats.TierLevel == ServerNode.Tier.TierLevel.Three) { var priceLockResult = await priceFeature.CreatePriceLock(priceLockRequest); return(Json(priceLockResult)); } else { return(ErrorHelpers.BuildErrorResponse(HttpStatusCode.BadRequest, "Tier 3 requirement not meet", "The node you requested is not a tier 3 node.")); } }
public async Task <bool> UpdatePriceLock(PriceLockResult priceLockData) { bool result = false; if (Guid.TryParse(priceLockData.PriceLockId, out Guid validPriceLockId)) { // Create price lock if it doesn't exist. var priceLock = networkFeatures.GetPriceLockData(validPriceLockId); if (priceLock == null) { var priceLockCreateRequest = new CreatePriceLockRequest() { DestinationAddress = priceLockData.DestinationAddress, ExpireBlock = priceLockData.ExpireBlock, RequestAmount = priceLockData.RequestAmount, RequestAmountPair = priceLockData.RequestAmountPair }; var createResult = await CreatePriceLock(priceLockCreateRequest, validPriceLockId.ToString()); if (!createResult.Success) { return(false); } } // Update payment information. if (!string.IsNullOrEmpty(priceLockData.TransactionId) && !string.IsNullOrEmpty(priceLockData.PayeeSignature)) { var paymentSubmit = new SubmitPaymentRequest() { PayeeSignature = priceLockData.PayeeSignature, PriceLockId = priceLockData.PriceLockId, TransactionId = priceLockData.TransactionId }; var submitPaymentResult = await SubmitPayment(paymentSubmit); if (!submitPaymentResult.Success) { result = true; } } } return(result); }
/// <inheritdoc /> public PriceLockResult CreatePriceLock(CreatePriceLockRequest priceLockRequest) { var result = new PriceLockResult(); var t3Nodes = this.xServerPeerList.GetPeers().Where(n => n.Tier == (int)TierLevel.Three).OrderBy(n => n.ResponseTime); foreach (var t3Node in t3Nodes) { string xServerURL = Utils.GetServerUrl(t3Node.NetworkProtocol, t3Node.NetworkAddress, t3Node.NetworkPort); var client = new RestClient(xServerURL); client.UseNewtonsoftJson(); var createPriceLockRequest = new RestRequest("/createpricelock", Method.POST); var request = JsonConvert.SerializeObject(priceLockRequest); createPriceLockRequest.AddParameter("application/json; charset=utf-8", request, ParameterType.RequestBody); createPriceLockRequest.RequestFormat = DataFormat.Json; var createPLResult = client.Execute <PriceLockResult>(createPriceLockRequest); if (createPLResult.StatusCode == HttpStatusCode.OK) { result = createPLResult.Data; if (result.Success) { return(result); } } else { var errorResponse = JsonConvert.DeserializeObject <ErrorResponse>(createPLResult.Content); if (errorResponse != null) { result.ResultMessage = errorResponse.errors[0].message; } else { result.ResultMessage = "Failed to access xServer"; } result.Success = false; } } if (t3Nodes.Count() == 0) { result.ResultMessage = "Not connected to any tier 3 servers"; } return(result); }
/// <summary> /// Register a new profile. /// </summary> public async Task <ReserveProfileResult> ReserveProfile(ProfileReserveRequest profileRegisterRequest) { ReserveProfileResult result = new ReserveProfileResult(); if (!networkFeatures.ProfileExists(profileRegisterRequest.Name, profileRegisterRequest.KeyAddress)) { bool isProfileKeyValid = await networkFeatures.IsProfileKeyValid(profileRegisterRequest.Name, profileRegisterRequest.KeyAddress, profileRegisterRequest.ReturnAddress, profileRegisterRequest.Signature); if (!isProfileKeyValid) { result.Success = false; result.ResultMessage = "Profile validation failed."; return(result); } // Price Lock ID does not exist, this is a new request, so let's create a price lock ID for it, and reserve the name. var profilePriceLockRequest = new CreatePriceLockRequest() { DestinationAddress = networkFeatures.GetMyFeeAddress(), RequestAmount = 5, // $5 RequestAmountPair = 1, // USD ExpireBlock = 15 }; var newPriceLock = await networkFeatures.CreateNewPriceLock(profilePriceLockRequest); if (newPriceLock == null || string.IsNullOrEmpty(newPriceLock?.PriceLockId) || newPriceLock?.ExpireBlock <= 0) { result.Success = false; result.ResultMessage = "Failed to acquire a price lock"; return(result); } int status = (int)Status.Reserved; var newProfile = new ProfileReservationData() { Name = profileRegisterRequest.Name, KeyAddress = profileRegisterRequest.KeyAddress, ReturnAddress = profileRegisterRequest.ReturnAddress, PriceLockId = newPriceLock.PriceLockId, Signature = profileRegisterRequest.Signature, Status = status, ReservationExpirationBlock = newPriceLock.ExpireBlock, Relayed = false }; using (X42DbContext dbContext = new X42DbContext(databaseSettings.ConnectionString)) { var newRecord = dbContext.ProfileReservations.Add(newProfile); if (newRecord.State == EntityState.Added) { dbContext.SaveChanges(); result.PriceLockId = newPriceLock.PriceLockId; result.Status = status; result.Success = true; } else { result.Status = (int)Status.Rejected; result.ResultMessage = "Failed to add profile."; result.Success = false; } } } else { result.Status = (int)Status.Rejected; result.Success = false; result.ResultMessage = "Profile already exists."; } return(result); }
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); }