public JsonResult Transfer([FromBody] JObject jsonData)
        {
            return(DoWithRetry(GetRetryValueFromJson(jsonData), (retryCount) =>
            {
                /** Get transfer data */
                var toAddress = jsonData.GetValue("recipientAddress").Value <string>();

                /** Get the type of currency */
                var amount = jsonData.GetValue("amount").Value <decimal>();
                var asset = jsonData.GetValue("asset").Value <string>();

                /* Get owner data from private key */
                var fromPrivateKey = jsonData.GetValue("ownerPrivateKeyHash").Value <string>();
                var fromKeyPair = new KeyPair(LuxUtils.HexToBytes(fromPrivateKey));

                try
                {
                    var transactionResult = LuxApiFactory.GetLuxApi().SendAsset(fromKeyPair, toAddress, asset, amount);
                    if (transactionResult != null)
                    {
                        dynamic result = new JObject();
                        result.result = transactionResult.ToString();
                        result.retries = retryCount;
                        return Json(result);
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.Message + "\n" + e.StackTrace);
                }

                return null;
            }));
        }
示例#2
0
        public JsonResult GenerateTo([FromBody] JObject jsonData)
        {
            return(DoWithRetry(GetRetryValueFromJson(jsonData), retryCount =>
            {
                /** Get transfer data */
                var contractScripHash = jsonData.GetValue("contractScriptHash").Value <string>();
                var toAddress = jsonData.GetValue("recipientAddress").Value <string>();
                var amount = jsonData.GetValue("amount").Value <double>();
                Log.Debug($"GenerateTo called with recipient {toAddress} and value {amount}");
                /* Get owner data from private key */
                var fromPrivateKey = jsonData.GetValue("ownerPrivateKeyHash").Value <string>();
                var fromKeyPair = new KeyPair(LuxUtils.HexToBytes(fromPrivateKey));

                var token = new NeoFluxNEP5(LuxApiFactory.GetLuxApi(), contractScripHash, null,
                                            GetDecimalsValueFromJson(jsonData));
                try
                {
                    Log.Debug($"Running transaction for recipient {toAddress}");
                    var transactionResult = token.GenerateTo(fromKeyPair, toAddress, new BigInteger(amount));
                    if (transactionResult != null)
                    {
                        dynamic result = new JObject();
                        result.result = transactionResult.ToString();
                        result.retries = retryCount;
                        Log.Debug($"Sent {amount} to {toAddress}");
                        return Json(result);
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.Message + "\n" + e.StackTrace);
                }
                return null;
            }));
        }
        public JsonResult GetBestBlock([FromBody] JObject jsonData)
        {
            try
            {
                var bestBlockIndex = LuxApiFactory.GetLuxApi().GetBlockHeight() - 1;
                var blockResult    = LuxApiFactory.GetLuxApi().GetBlock(bestBlockIndex);
                if (blockResult != null)
                {
                    dynamic result = new JObject();
                    result.version      = blockResult.Version;
                    result.height       = blockResult.Height;
                    result.merkleRoot   = blockResult.MerkleRoot;
                    result.timestamp    = blockResult.Timestamp;
                    result.timestamp    = blockResult.Timestamp;
                    result.previousHash = blockResult.PreviousHash.ToString();
                    dynamic transactionIds = new JArray();
                    foreach (var transaction in blockResult.transactions)
                    {
                        string key = transaction.Hash.ToString();
                        transactionIds.Add(key);
                    }
                    result.transactions = transactionIds;
                    return(Json(result));
                }

                return(null);
            }
            catch (Exception e)
            {
                Log.Error(e.Message + "\n" + e.StackTrace);
                return(JsonError($"Unable to get block information, {e.Message}"));
            }
        }
示例#4
0
 public JsonResult GetTransferTransactionInfo([FromBody] JObject jsonData)
 {
     return(DoWithRetry(GetRetryValueFromJson(jsonData), retryCount =>
     {
         try
         {
             var txId = jsonData.GetValue("txId").Value <string>();
             bool findBlock = jsonData.ContainsKey("findBlock") && jsonData.GetValue("findBlock").Value <bool>();
             LuxApiExtensions api = new LuxApiExtensions((NeoRPC)LuxApiFactory.GetLuxApi());
             RawTransaction transaction = api.GetTransferTransaction(txId, findBlock);
             if (transaction != null)
             {
                 dynamic result = new JObject();
                 result.txId = transaction.TxID;
                 result.block = transaction.Block;
                 result.asset = transaction.Contract;
                 result.addrFrom = transaction.From;
                 result.addrTo = transaction.To;
                 result.amount = transaction.Amount;
                 return JsonResultObject(result);
             }
         }
         catch (Exception e)
         {
             Log.Error(e.Message + "\n" + e.StackTrace);
             return JsonError($"Unable to get transaction information, {e.Message}");
         }
         return null;
     }));
 }
示例#5
0
        public JsonResult TotalSupply([FromBody] JObject jsonData)
        {
            var contractScripHash = jsonData.GetValue("contractScriptHash").Value <string>();
            var token             = new NeoFluxNEP5(LuxApiFactory.GetLuxApi(), contractScripHash, null,
                                                    GetDecimalsValueFromJson(jsonData));

            return(JsonResultObject((long)token.TotalSupply));
        }
 public JsonResult GetBlockCount([FromBody] JObject jsonData)
 {
     try
     {
         var bestBlockIndex = LuxApiFactory.GetLuxApi().GetBlockHeight();
         return(JsonResultObject(bestBlockIndex));
     }
     catch (Exception e)
     {
         Log.Error(e.Message + "\n" + e.StackTrace);
         return(JsonError($"Unable to get block information, {e.Message}"));
     }
 }
示例#7
0
        private void CheckNodes()
        {
            var toProcess    = baseNodes.Length;
            var nodes        = baseNodes;
            var enabledNodes = new List <NeoNode>();
            var slowNodes    = new List <NeoNode>();

            using (ManualResetEvent resetEvent = new ManualResetEvent(false))
            {
                foreach (var nodeObj in nodes)
                {
                    ThreadPool.QueueUserWorkItem(state =>
                    {
                        var node = state as NeoNode;
                        try
                        {
                            Log.Debug($"Checking availability for {node.URL}");
                            var request     = (HttpWebRequest)WebRequest.Create(node.URL);
                            request.Timeout = 30000;
                            var timer       = new Stopwatch();
                            timer.Start();
                            var response = (HttpWebResponse)request.GetResponse();
                            response.Close();
                            timer.Stop();
                            node.Latency = timer.Elapsed.TotalMilliseconds;
                            if (timer.Elapsed.TotalMilliseconds <= 1000)
                            {
                                enabledNodes.Add(node);
                            }
                            else
                            {
                                slowNodes.Add(node);
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Error($"Failed to check, rpc node is not reachable {node.URL}: {e.Message}");
                            node.Latency = 999999999;
                            slowNodes.Add(node);
                        }

                        if (Interlocked.Decrement(ref toProcess) == 0)
                        {
                            resetEvent.Set();
                        }
                    }, nodeObj);
                }
                resetEvent.WaitOne();
                LuxApiFactory.UpdateNodes(enabledNodes.ToArray(), slowNodes.ToArray());
            }
        }
示例#8
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            LuxApiFactory.UpdateNodes(baseNodes, new NeoNode[0]);
            if (_config["CheckServersAvailability"].Equals("false"))
            {
                return;
            }

            while (!stoppingToken.IsCancellationRequested)
            {
                CheckNodes();
                await Task.Delay(20000, stoppingToken);
            }
        }
        public JsonResult GetTransaction([FromBody] JObject jsonData)
        {
            try
            {
                var txId = jsonData.GetValue("txId").Value <string>();
                var transactionResult = LuxApiFactory.GetLuxApi().GetTransaction(txId);
                if (transactionResult != null)
                {
                    dynamic result = new JObject();
                    result.hash    = transactionResult.Hash.ToString();
                    result.type    = transactionResult.type;
                    result.version = transactionResult.version;
                    result.block   = transactionResult.block;
                    dynamic inputs = new JArray();
                    foreach (var input in transactionResult.inputs)
                    {
                        dynamic inputJson = new JObject();
                        inputJson.prevHash  = input.prevHash.ToString();
                        inputJson.prevIndex = input.prevIndex;
                        inputs.Add(inputJson);
                    }
                    result.inputs = inputs;
                    dynamic outputs = new JArray();
                    foreach (var output in transactionResult.outputs)
                    {
                        dynamic outputJson = new JObject();
                        outputJson.asset   = output.assetID;
                        outputJson.address = output.scriptHash.ToAddress();
                        outputJson.value   = output.value;
                        outputs.Add(outputJson);
                    }
                    result.outputs = outputs;
                    return(Json(result));
                }

                return(null);
            }
            catch (Exception e)
            {
                Log.Error(e.Message + "\n" + e.StackTrace);
                return(JsonError($"Unable to get transaction information, {e.Message}"));
            }
        }
示例#10
0
 public JsonResult State([FromBody] JObject jsonData)
 {
     try
     {
         var     address       = jsonData.GetValue("walletAddress").Value <string>();
         var     assetBalances = LuxApiFactory.GetLuxApi().GetAssetBalancesOf(address);
         dynamic result        = new JObject();
         foreach (var asset in assetBalances.Keys)
         {
             result.Add(asset, assetBalances[asset]);
         }
         return(Json(result));
     }
     catch (Exception e)
     {
         Log.Error(e.Message + "\n" + e.StackTrace);
         return(JsonError($"Unable to get wallet state information, {e.Message}"));
     }
 }
示例#11
0
 public JsonResult BalanceOf([FromBody] JObject jsonData)
 {
     return(DoWithRetry(GetRetryValueFromJson(jsonData), retryCount =>
     {
         try
         {
             var contractScripHash = jsonData.GetValue("contractScriptHash").Value <string>();
             var targetAddress = jsonData.GetValue("targetAddress").Value <string>();
             var token = new NeoFluxNEP5(LuxApiFactory.GetLuxApi(), contractScripHash, null,
                                         GetDecimalsValueFromJson(jsonData));
             return JsonResultObject(token.BalanceForAddress(targetAddress));
         }
         catch (Exception e)
         {
             Console.WriteLine(e);
         }
         return null;
     }));
 }
示例#12
0
        public JsonResult Info([FromBody] JObject jsonData)
        {
            var contractScripHash = jsonData.GetValue("contractScriptHash").Value <string>();

            try
            {
                var token = new NeoFluxNEP5(LuxApiFactory.GetLuxApi(), contractScripHash, null,
                                            GetDecimalsValueFromJson(jsonData));
                dynamic result = new JObject();
                result.symbol      = token.Symbol;
                result.name        = token.Name;
                result.decimals    = token.Decimals;
                result.totalSupply = token.TotalSupply;
                return(Json(result));
            }
            catch (Exception e)
            {
                Log.Error(e.Message + "\n" + e.StackTrace);
                return(JsonError($"Unable to make transaction, {e.Message}"));
            }
        }
示例#13
0
        public JsonResult GetBlock([FromBody] JObject jsonData)
        {
            try
            {
                var blockIndex   = jsonData.GetValue("blockIndex").Value <uint>();
                var blockResult  = LuxApiFactory.GetLuxApi().GetBlock(blockIndex);
                var transferOnly = jsonData.ContainsKey("transferOnly") && jsonData.GetValue("transferOnly").Value <bool>();
                if (blockResult != null)
                {
                    dynamic result = new JObject();
                    result.version      = blockResult.Version;
                    result.height       = blockResult.Height;
                    result.merkleRoot   = blockResult.MerkleRoot;
                    result.timestamp    = blockResult.Timestamp;
                    result.timestamp    = blockResult.Timestamp;
                    result.previousHash = blockResult.PreviousHash.ToString();
                    dynamic transactionIds = new JArray();
                    foreach (var transaction in blockResult.transactions)
                    {
                        if (transferOnly && !TransferTransactionTypes.Contains(transaction.type))
                        {
                            continue;
                        }
                        string key = transaction.Hash.ToString();
                        transactionIds.Add(key);
                    }
                    result.transactions = transactionIds;
                    return(Json(result));
                }

                return(null);
            }
            catch (Exception e)
            {
                Log.Error(e.Message + "\n" + e.StackTrace);
                return(JsonError($"Unable to get block information, {e.Message}"));
            }
        }