Example #1
0
        private object RouteConfirmSellNFT(HTTPRequest request)
        {
            var chainName    = request.GetVariable("chain");
            var contractName = request.GetVariable("contract");
            var methodName   = request.GetVariable("method");

            var param = request.GetVariable("params");
            var id    = request.GetVariable("id");

            if (param == null)
            {
                PushError(request, "Parameters cannot be null!");
                return(null);
            }

            List <object> paramList = SendUtils.BuildParamList(param);

            var keyPair = GetLoginKey(request);

            InvalidateCache(keyPair.Address);
            string result;

            result = AccountController.ConfirmSellNFT(keyPair, chainName, contractName, methodName, paramList.ToArray(), id).Result;

            ResetSessionSendFields(request);

            if (!SendUtils.IsTxHashValid(result))
            {
                PushError(request, result);
                Log.Information("No valid result");
                return("");
            }

            return(result);
        }
Example #2
0
        private object RouteCosmicFixed(HTTPRequest request)
        {
            var context = InitContext(request);

            if (context["holdings"] is Holding[] balance)
            {
                var keyPair = GetLoginKey(request);
                InvalidateCache(keyPair.Address);
                var result = AccountController.CosmicFixed(keyPair).Result;

                if (result.GetType() == typeof(ErrorRes))
                {
                    return(JsonConvert.SerializeObject(result, Formatting.Indented));
                }

                var contractTx = (string)result;

                if (SendUtils.IsTxHashValid(contractTx))
                {
                    request.session.SetString("confirmedHash", contractTx);
                    return(contractTx);
                }
            }
            return(null);
        }
Example #3
0
        private object RouteInvokeContract(HTTPRequest request)
        {
            var contract = request.GetVariable("contract");
            var method   = request.GetVariable("method");
            var context  = InitContext(request);

            // TODO check if contract exists
            if (context["holdings"] is Holding[] balance)
            {
                var soulBalance = balance.SingleOrDefault(b => b.Symbol == "SOUL");
                if (soulBalance.Amount > 0.1m)
                {
                    var keyPair    = GetLoginKey(request);
                    var contractTx = AccountController.InvokeContractGeneric(keyPair, contract, method).Result;
                    if (SendUtils.IsTxHashValid(contractTx))
                    {
                        return(contractTx);
                    }

                    PushError(request, contractTx);
                }
                else
                {
                    PushError(request, "You need a small drop of SOUL (+0.1) to call a contract.");
                }
            }
            return("");
        }
Example #4
0
        private object RouteSendMultipleNFT(HTTPRequest request)
        {
            var addressTo = request.GetVariable("dest");

            var chainName        = request.GetVariable("chain");
            var destinationChain = request.GetVariable("destChain");

            var symbol = request.GetVariable("token");
            var id     = request.GetVariable("id");

            var isName = bool.Parse(request.GetVariable("isName"));

            var keyPair = GetLoginKey(request);

            InvalidateCache(keyPair.Address);
            string result;

            result = AccountController.TransferMultipleNFT(keyPair, addressTo, chainName, symbol, id, isName).Result;

            ResetSessionSendFields(request);

            if (!SendUtils.IsTxHashValid(result))
            {
                PushError(request, result);
                Log.Information("No valid result");
                return("");
            }

            return(result);
        }
Example #5
0
        private object RouteInvokeContract(HTTPRequest request)
        {
            var chain    = request.GetVariable("chain");
            var contract = request.GetVariable("contract");
            var method   = request.GetVariable("method");
            var param    = request.GetVariable("params");
            var context  = InitContext(request);

            if (param == null)
            {
                PushError(request, "Parameters cannot be null!");
                return(null);
            }

            List <object> paramList = SendUtils.BuildParamList(param);

            var keyPair = GetLoginKey(request);

            InvalidateCache(keyPair.Address);
            var result = AccountController.InvokeContractGeneric(keyPair, chain, contract, method, paramList.ToArray()).Result;

            if (result != null && result.GetType() == typeof(BigInteger))
            {
                return(result.ToString());
            }

            return(JsonConvert.SerializeObject(result, Formatting.Indented));
        }
Example #6
0
        private object RouteRegisterName(HTTPRequest request)
        {
            var name    = request.GetVariable("name");
            var context = InitContext(request);

            if (context["holdings"] is Holding[] balance)
            {
                var keyPair = GetLoginKey(request);
                InvalidateCache(keyPair.Address);
                var result = AccountController.RegisterName(keyPair, name).Result;

                if (result.GetType() == typeof(ErrorRes))
                {
                    return(JsonConvert.SerializeObject(result, Formatting.Indented));
                }

                var registerTx = (string)result;

                if (SendUtils.IsTxHashValid(registerTx))
                {
                    request.session.SetString("confirmedHash", registerTx);
                    return(registerTx);
                }

                PushError(request, registerTx);
            }

            else
            {
                PushError(request, "Error while registering name.");
            }
            return("");
        }
Example #7
0
        private object RouteRegisterName(HTTPRequest request)
        {
            var name    = request.GetVariable("name");
            var context = InitContext(request);

            if (AccountContract.ValidateName(name))
            {
                if (context["holdings"] is Holding[] balance)
                {
                    var soulBalance = balance.SingleOrDefault(b => b.Symbol == "SOUL");
                    if (soulBalance.Amount > 0.1m) //RegistrationCost
                    {
                        var keyPair    = GetLoginKey(request);
                        var registerTx = AccountController.RegisterName(keyPair, name).Result;
                        if (SendUtils.IsTxHashValid(registerTx))
                        {
                            return(registerTx);
                        }

                        PushError(request, registerTx);
                    }
                    else
                    {
                        PushError(request, "You need a small drop of SOUL (+0.1) to register a name.");
                    }
                }
            }
            else
            {
                PushError(request, "Error while registering name.");
            }
            return("");
        }
Example #8
0
        private object RouteSendRawTxCustomNFT(HTTPRequest request)
        {
            var addressTo = request.GetVariable("dest");
            var chainName = request.GetVariable("chain");
            var symbol    = request.GetVariable("token");
            var amount    = request.GetVariable("amount");
            var payload   = request.GetVariable("payload");
            var donation  = bool.Parse(request.GetVariable("donation"));

            var    keyPair = GetLoginKey(request);
            string result;

            result = AccountController.TransferTokensCustomNFT(keyPair, addressTo, chainName, symbol, amount, payload, donation).Result;

            ResetSessionSendFields(request);

            if (!SendUtils.IsTxHashValid(result))
            {
                PushError(request, result);
                Log.Information("No valid result");
                return("");
            }

            return(result);
        }
Example #9
0
 public void Apply(WebSocket webSocket, JObject messageJson)
 {
     doApply(webSocket);
     SendUtils.sendAsJson(webSocket, new BasicCommandOutput()
     {
         type = messageJson["type"].ToString()
     });
 }
Example #10
0
        private object RouteConfirmations(HTTPRequest request)
        {
            if (!HasLogin(request))
            {
                return(HTTPResponse.Redirect("/login"));
            }

            var context = InitContext(request);
            var txHash  = request.GetVariable("txhash");

            request.session.SetStruct <ErrorContext>("error", new ErrorContext {
                ErrorCode = "", ErrorDescription = $"{txHash} is still not confirmed."
            });
            var result = AccountController.GetTxConfirmations(txHash).Result;

            if (result.GetType() == typeof(ErrorRes))
            {
                return(JsonConvert.SerializeObject(result, Formatting.Indented));
            }

            var txObject = (TransactionDto)result;

            request.session.SetString("confirmedHash", txHash);
            if (request.session.GetBool("isCrossTransfer"))
            {
                var settle = request.session.GetStruct <SettleTx>("settleTx");

                var settleTx = AccountController.SettleBlockTransfer(
                    GetLoginKey(request),
                    settle.ChainAddress,
                    txObject.Txid, settle.DestinationChainAddress).Result;

                // clear
                request.session.SetBool("isCrossTransfer", false);

                if (SendUtils.IsTxHashValid(settleTx))
                {
                    context["confirmingTxHash"] = settleTx;
                    return("settling");
                }
                PushError(request, settleTx);
                return("unconfirmed");
            }
            else
            {
                if (request.session.GetInt("txNumber") > 2)
                {
                    return("continue");
                }

                //if it gets here, there are no more txs to process
                var keyPair = GetLoginKey(request);
                InvalidateCache(keyPair.Address);

                ResetSessionSendFields(request);
                return("confirmed");
            }
        }
Example #11
0
        private object RouteConfirmations(HTTPRequest request)
        {
            if (!HasLogin(request))
            {
                return(HTTPResponse.Redirect("/login"));
            }

            var context = InitContext(request);
            var txHash  = request.GetVariable("txhash");

            request.session.SetStruct <ErrorContext>("error", new ErrorContext {
                ErrorCode = "", ErrorDescription = $"{txHash} is still not confirmed."
            });
            var transactionDto = AccountController.GetTxConfirmations(txHash).Result;

            // hack, transactionDto.Result might contain the confirmations, but that's empty
            // so we check if the txid != null for now
            if (transactionDto.Txid != null)
            {
                request.session.SetString("confirmedHash", txHash);
                if (request.session.GetBool("isCrossTransfer"))
                {
                    var settle = request.session.GetStruct <SettleTx>("settleTx");

                    var settleTx = AccountController.SettleBlockTransfer(
                        GetLoginKey(request),
                        settle.ChainAddress,
                        transactionDto.Txid, settle.DestinationChainAddress).Result;

                    // clear
                    request.session.SetBool("isCrossTransfer", false);

                    if (SendUtils.IsTxHashValid(settleTx))
                    {
                        context["confirmingTxHash"] = settleTx;
                        return("settling");
                    }
                    PushError(request, settleTx);
                    return("unconfirmed");
                }
                else
                {
                    if (request.session.GetInt("txNumber") > 2)
                    {
                        return("continue");
                    }

                    //if it gets here, there are no more txs to process
                    var keyPair = GetLoginKey(request);
                    InvalidateCache(keyPair.Address);

                    ResetSessionSendFields(request);
                    return("confirmed");
                }
            }
            PushError(request, "Error sending tx.");
            return("unconfirmed");
        }
Example #12
0
        private object RouteMarketBuyCustomModal(HTTPRequest request)
        {
            var chain          = request.GetVariable("chain");
            var contract       = request.GetVariable("contract");
            var method         = request.GetVariable("method");
            var param          = request.GetVariable("params");
            var id             = request.GetVariable("id");
            var quotesymbol    = request.GetVariable("quoteSymbol");
            var pricenft       = request.GetVariable("priceNFT");
            var creatoraddress = request.GetVariable("creatorAddress");
            var context        = InitContext(request);

            if (param == null)
            {
                PushError(request, "Parameters cannot be null!");
                return(null);
            }

            List <object> paramList = SendUtils.BuildParamList(param);

            if (context["holdings"] is Holding[] balance)
            {
                var kcalBalance = balance.SingleOrDefault(b => b.Symbol == "KCAL" && b.Chain == chain);
                if (kcalBalance.Amount > 0.1m)
                {
                    var keyPair = GetLoginKey(request);
                    InvalidateCache(keyPair.Address);
                    var result = AccountController.MarketBuyCustomModal(
                        keyPair, chain, contract, method, paramList.ToArray(), id, quotesymbol, pricenft, creatoraddress
                        ).Result;

                    if (result.GetType() == typeof(ErrorRes))
                    {
                        return(JsonConvert.SerializeObject(result, Formatting.Indented));
                    }

                    var contractTx = (string)result;

                    if (SendUtils.IsTxHashValid(contractTx))
                    {
                        request.session.SetString("confirmedHash", contractTx);
                        return(contractTx);
                    }

                    PushError(request, contractTx);
                }
                else
                {
                    PushError(request, "You need a small drop of KCAL to call a contract.");
                }
            }
            return(null);
        }
Example #13
0
        public void Apply(WebSocket webSocket, JObject messageJson)
        {
            int percentOccupiedMemory = getOccupiedMemoryPercentage();

            SendUtils.sendAsJson(webSocket,
                                 new MonitorCommandOutput()
            {
                type       = messageJson["type"].ToString(),
                value      = percentOccupiedMemory + "%",
                sequenceId = Convert.ToInt64(messageJson["sequenceId"].ToString()) + 1
            });
        }
        public void Apply(WebSocket webSocket, JObject messageJson)
        {
            PerformanceCounter cpuCounter = new PerformanceCounter("Processor Information", "% Processor Utility", "_Total", true);

            cpuCounter.NextValue();
            Thread.Sleep(500);
            SendUtils.sendAsJson(webSocket,
                                 new MonitorCommandOutput()
            {
                type       = messageJson["type"].ToString(),
                value      = (int)cpuCounter.NextValue() + "%",
                sequenceId = Convert.ToInt64(messageJson["sequenceId"].ToString()) + 1
            });
        }
Example #15
0
 private static void TestFunc(string[] obj)
 {
     var           json2 = @"{ 'parameters': [  { 'name': 'address', 'vmtype': 'Object', 'type': 'Phantasma.Cryptography.Address', 'input': 'P5ySorAXMaJLwe6AqTsshW3XD8ahkwNpWHU9KLX9CwkYd', 'info': 'info1' }, 
                                      { 'name': 'address', 'vmtype': 'Enum', 'type': 'Phantasma.Blockchain.ArchiveFlags', 'input': '1', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Enum', 'type': 'Phantasma.Blockchain.ArchiveFlags', 'input': '1', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Enum', 'type': 'Phantasma.Blockchain.Contracts.Native.ExchangeOrderSide', 'input': '1', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Enum', 'type': 'Phantasma.Blockchain.Contracts.Native.ExchangeOrderSide', 'input': '2', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Enum', 'type': 'Phantasma.Blockchain.Contracts.Native.ExchangeOrderType', 'input': '3', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Enum', 'type': 'Phantasma.Blockchain.Contracts.Native.ExchangeOrderType', 'input': '4', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Timestamp', 'type': 'Phantasma.Core.Types.Timestamp', 'input': '07/20/2019 20:04:30', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Bool', 'type': 'System.Boolean', 'input': 'False', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Bool', 'type': 'System.Boolean', 'input': 'True', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'String', 'type': 'System.String', 'input': 'ThisIsAString', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Bytes', 'type': 'System.Byte[]', 'input': 'ThisIsAByteArray', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Number', 'type': 'System.Int32', 'input': '987654321', 'info': 'info1' },
                                      { 'name': 'address', 'vmtype': 'Number', 'type': 'Phantasma.Numerics.BigInteger', 'input': '12345678', 'info': 'info1' } 
                                   ] }";
     List <object> lst2  = SendUtils.BuildParamList(json2);
 }
Example #16
0
        private object RouteStake(HTTPRequest request)
        {
            var stakeAmount = request.GetVariable("stakeAmount");
            var context     = InitContext(request);

            if (stakeAmount == null)
            {
                PushError(request, "stakeAmount cannot be null!");
                return(null);
            }

            if (context["holdings"] is Holding[] balance)
            {
                var keyPair = GetLoginKey(request);
                InvalidateCache(keyPair.Address);
                var result = AccountController.CreateStakeSoulTransactionWithClaim(
                    keyPair, stakeAmount
                    ).Result;

                if (result.GetType() == typeof(ErrorRes))
                {
                    return(JsonConvert.SerializeObject(result, Formatting.Indented));
                }

                var contractTx = (string)result;

                if (SendUtils.IsTxHashValid(contractTx))
                {
                    request.session.SetString("confirmedHash", contractTx);
                    return(contractTx);
                }

                PushError(request, contractTx);
            }
            return(null);
        }
Example #17
0
        public async Task <object> CreateMultisigWallet(PhantasmaKeys keyPair, MultisigSettings settings)
        {
            try
            {
                var multisigScript = SendUtils.GenerateMultisigScript(settings);

                var script = ScriptUtils.BeginScript()
                             .AllowGas(keyPair.Address, Address.Null, MinimumFee, 800)
                             .CallContract("account", "RegisterScript", keyPair.Address, multisigScript)
                             .SpendGas(keyPair.Address)
                             .EndScript();

                var nexusName = WalletConfig.Network;
                var tx        = new Phantasma.Blockchain.Transaction(nexusName, "main", script, DateTime.UtcNow + TimeSpan.FromMinutes(30), "PHT-0-8-7");

                tx.Sign(keyPair);

                var txResult = await _phantasmaRpcService.SendRawTx.SendRequestAsync(tx.ToByteArray(true).Encode());

                return(txResult);
            }
            catch (RpcResponseException rpcEx)
            {
                Log.Error($"RPC Exception occurred: {rpcEx.RpcError.Message}");
                return(new ErrorRes {
                    error = rpcEx.RpcError.Message
                });
            }
            catch (Exception ex)
            {
                Log.Error($"Exception occurred: {ex.Message}");
                return(new ErrorRes {
                    error = ex.Message
                });
            }
        }
Example #18
0
 public List <ChainDto> GetShortestPath(string chainName, string destinationChain)
 {
     return(SendUtils.GetShortestPath(chainName, destinationChain, PhantasmaChains));
 }
Example #19
0
        private object RouteSendRawTx(HTTPRequest request)
        {
            if (!HasLogin(request))
            {
                return(HTTPResponse.Redirect("/login"));
            }

            var isFungible = bool.Parse(request.GetVariable("fungible"));
            var addressTo  = request.GetVariable("dest");

            var chainName        = request.GetVariable("chain");
            var destinationChain = request.GetVariable("destChain");

            var symbol     = request.GetVariable("token");
            var amountOrId = request.GetVariable(isFungible ? "amount" : "id");

            var isName = bool.Parse(request.GetVariable("isName"));

            var    keyPair = GetLoginKey(request);
            string result;

            // Multisig code, NOT YET DONE
            // HACK if the address has a script it's multisig
            //byte[] addressScript = AccountController.GetAddressScript(keyPair);

            //if (addressScript != null && addressScript.Length > 0)
            //{
            //    if (chainName != destinationChain)
            //    {
            //        // cross chain multisg not supported yet
            //        return null;
            //    }

            //    MultisigSettings settings = AccountController.CheckMultisig(keyPair, addressScript);
            //    result = AccountController.TransferTokens(isFungible
            //                                             ,keyPair
            //                                             ,addressTo
            //                                             ,chainName
            //                                             ,symbol
            //                                             ,amountOrId
            //                                             ,settings).Result;

            //    return "";
            //}

            if (chainName == destinationChain)
            {
                result = AccountController.TransferTokens(isFungible, keyPair, addressTo, chainName, symbol, amountOrId, isName).Result;

                ResetSessionSendFields(request);
            }
            else //cross chain requires 2 txs
            {
                var pathList = AccountController.GetShortestPath(chainName, destinationChain).ToArray();

                request.session.SetInt("txNumber", pathList.Length);

                if (pathList.Length > 2)
                {
                    chainName        = pathList[0].Name;
                    destinationChain = pathList[1].Name;

                    // save tx
                    request.session.SetStruct <TransferTx>("transferTx", new TransferTx
                    {
                        IsFungible = isFungible,
                        FromChain  = chainName,
                        ToChain    = destinationChain,
                        FinalChain = pathList[pathList.Length - 1].Name,
                        AddressTo  = addressTo,
                        Symbol     = symbol,
                        AmountOrId = amountOrId
                    });

                    result = AccountController.CrossChainTransferToken(isFungible, keyPair, keyPair.Address.Text, chainName, destinationChain, symbol, amountOrId).Result;
                }
                else
                {
                    result = AccountController.CrossChainTransferToken(isFungible, keyPair, addressTo, chainName, destinationChain, symbol, amountOrId).Result;
                }
                if (SendUtils.IsTxHashValid(result))
                {
                    request.session.SetBool("isCrossTransfer", true);
                    request.session.SetStruct <SettleTx>("settleTx",
                                                         new SettleTx
                    {
                        ChainName               = chainName,
                        ChainAddress            = AccountController.PhantasmaChains.Find(p => p.Name == chainName).Address,
                        DestinationChainAddress = AccountController.PhantasmaChains.Find(p => p.Name == destinationChain).Address,
                    });
                }
            }

            if (!SendUtils.IsTxHashValid(result))
            {
                PushError(request, result);
                Log.Information("No valid result");
                return("");
            }

            return(result);
        }
Example #20
0
        private object RouteSendRawTx(HTTPRequest request)
        {
            if (!HasLogin(request))
            {
                return(HTTPResponse.Redirect("/login"));
            }

            var isFungible = bool.Parse(request.GetVariable("fungible"));
            var addressTo  = request.GetVariable("dest");

            var chainName        = request.GetVariable("chain");
            var destinationChain = request.GetVariable("destChain");

            var symbol     = request.GetVariable("token");
            var amountOrId = request.GetVariable(isFungible ? "amount" : "id");

            var    keyPair = GetLoginKey(request);
            string result;

            if (chainName == destinationChain)
            {
                result = AccountController.TransferTokens(isFungible, keyPair, addressTo, chainName, symbol, amountOrId).Result;

                ResetSessionSendFields(request);
            }
            else //cross chain requires 2 txs
            {
                var pathList = AccountController.GetShortestPath(chainName, destinationChain).ToArray();

                request.session.SetInt("txNumber", pathList.Length);

                if (pathList.Length > 2)
                {
                    chainName        = pathList[0].Name;
                    destinationChain = pathList[1].Name;

                    // save tx
                    request.session.SetStruct <TransferTx>("transferTx", new TransferTx
                    {
                        IsFungible = isFungible,
                        FromChain  = chainName,
                        ToChain    = destinationChain,
                        FinalChain = pathList[pathList.Length - 1].Name,
                        AddressTo  = addressTo,
                        Symbol     = symbol,
                        AmountOrId = amountOrId
                    });

                    result = AccountController.CrossChainTransferToken(isFungible, keyPair, keyPair.Address.Text, chainName, destinationChain, symbol, amountOrId).Result;
                }
                else
                {
                    result = AccountController.CrossChainTransferToken(isFungible, keyPair, addressTo, chainName, destinationChain, symbol, amountOrId).Result;
                }
                if (SendUtils.IsTxHashValid(result))
                {
                    request.session.SetBool("isCrossTransfer", true);
                    request.session.SetStruct <SettleTx>("settleTx",
                                                         new SettleTx
                    {
                        ChainName               = chainName,
                        ChainAddress            = AccountController.PhantasmaChains.Find(p => p.Name == chainName).Address,
                        DestinationChainAddress = AccountController.PhantasmaChains.Find(p => p.Name == destinationChain).Address,
                    });
                }
            }

            if (!SendUtils.IsTxHashValid(result))
            {
                PushError(request, result);
                return("");
            }

            return(result);
        }