Esempio n. 1
0
 protected QueryHandlerBase(IEthCall ethCall, string defaultAddressFrom = null, BlockParameter defaultBlockParameter = null)
 {
     EthCall               = ethCall;
     DefaultAddressFrom    = defaultAddressFrom;
     DefaultBlockParameter = defaultBlockParameter ?? BlockParameter.CreateLatest();
     _contractCall         = new ContractCall(EthCall, DefaultBlockParameter);
 }
Esempio n. 2
0
 public ContractCall(IEthCall ethCall, BlockParameter defaulBlock)
 {
     _ethCall     = ethCall;
     _defaulBlock = defaulBlock;
     if (_defaulBlock == null)
     {
         _defaulBlock = BlockParameter.CreateLatest();
     }
 }
Esempio n. 3
0
 public QueryToDTOHandler(IEthCall ethCall, string defaultAddressFrom = null, BlockParameter defaultBlockParameter = null) : base(ethCall, defaultAddressFrom, defaultBlockParameter)
 {
     QueryRawHandler = new QueryRawHandler <TFunctionMessage>(ethCall, defaultAddressFrom, defaultBlockParameter);
 }
Esempio n. 4
0
        public static async Task <HttpResponseMessage> CreateRespone(HttpRequestMessage req, string functionName)
        {
            // Get request body
            var jsonBody = await req.Content.ReadAsStringAsync();

            if (string.IsNullOrWhiteSpace(jsonBody))
            {
                jsonBody = @"{}";
            }
            var body = JsonConvert.DeserializeObject <JObject>(jsonBody);

            // Get parameters
            var inputParameters = body.Values();
            var arguments       = new object[inputParameters.Count()];
            var i = 0;

            foreach (var p in inputParameters.Values())
            {
                arguments[i++] = p.Value <string>();
            }

            var web3     = new Nethereum.Web3.Web3(SmartContract.BlockchainRpcEndpoint);
            var contract = web3.Eth.GetContract(SmartContract.Abi, SmartContract.ContractAddress);

            var functionABI = contract.ContractBuilder.ContractABI.Functions
                              .FirstOrDefault(f => f.Name == functionName);

            if (functionABI == null)
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, "Function not found!"));
            }

            var functionParameters = functionABI.InputParameters;

            if (functionParameters?.Count() != inputParameters.Count())
            {
                return(req.CreateResponse(HttpStatusCode.BadRequest, "Parameters do not match!"));
            }

            Function function   = contract.GetFunction(functionName);
            Type     returnType = GetFunctionReturnType(functionABI);
            IEthCall ethCall    = contract.Eth.Transactions.Call;
            var      result     = await ethCall.SendRequestAsync(function.CreateCallInput(arguments), contract.Eth.DefaultBlock)
                                  .ConfigureAwait(false);

            FunctionBase functionBase        = function;
            PropertyInfo builderBaseProperty = functionBase.GetType()
                                               .GetProperty("FunctionBuilderBase", BindingFlags.Instance | BindingFlags.NonPublic);

            if (builderBaseProperty != null)
            {
                FunctionBuilderBase builderBase             = (FunctionBuilderBase)builderBaseProperty.GetValue(functionBase);
                PropertyInfo        funcCallDecoderProperty = builderBase.GetType()
                                                              .GetProperty("FunctionCallDecoder", BindingFlags.Instance | BindingFlags.NonPublic);
                if (funcCallDecoderProperty != null)
                {
                    ParameterDecoder decoder = (ParameterDecoder)funcCallDecoderProperty.GetValue(builderBase);
                    var results = decoder.DecodeDefaultData(result, functionABI.OutputParameters);

                    if (results.Count == 1)
                    {
                        var resultValue = JsonConvert.SerializeObject(results[0].Result);
                        return(req.CreateResponse(HttpStatusCode.OK, resultValue));
                    }

                    var resultMultiValue = Activator.CreateInstance(returnType, results.Select(r => r.Result).ToArray());
                    return(req.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(resultMultiValue)));
                }
            }

            return(req.CreateResponse(HttpStatusCode.InternalServerError));
        }
Esempio n. 5
0
 public QueryRawHandler(IEthCall ethCall, string defaultAddressFrom = null, BlockParameter defaultBlockParameter = null) : base(ethCall, defaultAddressFrom, defaultBlockParameter)
 {
 }
Esempio n. 6
0
 public ContractQueryEthCallHandler(IEthCall ethCall, string defaultAddressFrom = null, BlockParameter defaultBlockParameter = null)
 {
     DefaultAddressFrom    = defaultAddressFrom;
     DefaultBlockParameter = defaultBlockParameter;
     EthCall = ethCall;
 }