Exemplo n.º 1
0
        private JObject CallSmartContract(IEnumerable <string> parameters, string id, JObject response)
        {
            if (parameters == null || !parameters.Any())
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The to is not specified"));
            }

            IEnumerable <byte> callToPayload   = null;
            IEnumerable <byte> callFromPayload = null;
            IEnumerable <byte> callDataPayload = null;
            double             callGas         = 0,
                               callGasPrice = 0,
                               callScValue  = 0;

            try
            {
                callToPayload = parameters.First().FromHexString(); // TO
            }
            catch (Exception)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The to cannot be decoded"));
            }

            if (parameters.Count() > 2)
            {
                try
                {
                    callFromPayload = parameters.ElementAt(1).FromHexString(); // FROM
                }
                catch (Exception)
                {
                    return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The from cannot be decoded"));
                }
            }

            if (parameters.Count() >= 3)
            {
                try
                {
                    callDataPayload = parameters.ElementAt(2).FromHexString(); // DATA
                }
                catch (Exception)
                {
                    return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_INVALID_PARAMS, "The data cannot be decoded"));
                }
            }

            if (parameters.Count() >= 4)
            {
                try
                {
                    callGas = double.Parse(parameters.ElementAt(3)); // GAS
                }
                catch (Exception) { }
            }

            if (parameters.Count() >= 5)
            {
                try
                {
                    callGasPrice = double.Parse(parameters.ElementAt(4)); // GASPRICE
                }
                catch (Exception) { }
            }

            if (parameters.Count() >= 6)
            {
                try
                {
                    callScValue = double.Parse(parameters.ElementAt(5)); // VALUE
                }
                catch (Exception) { }
            }

            var callSmartContractTx = new SmartContractTransaction
            {
                Data     = callDataPayload,
                From     = callFromPayload,
                To       = callToPayload,
                Gas      = callGas,
                GasPrice = callGasPrice,
                Value    = callScValue
            };

            try
            {
                _transactionValidator.Check(callSmartContractTx);
                var executor = _solidityExecutor.Execute(callToPayload, callFromPayload, callDataPayload, true).Rollback();
                var result   = executor.GetProgram().GetResult().GetHReturn().ToHexString();
                response["result"] = result;
                return(response);
            }
            catch (ValidationException ex)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_VERIFY_ERROR, ex.Message));
            }
            catch (Exception)
            {
                return(CreateErrorResponse(id, (int)RpcErrorCodes.RPC_VERIFY_ERROR, ErrorCodes.ErrorExecutionContract));
            }
        }