public async Task <IMulticallInputOutput[]> MultiCallAsync(BlockParameter block, params IMulticallInputOutput[] multiCalls) { var contractCalls = new List <Call>(); foreach (var multiCall in multiCalls) { contractCalls.Add(new Call { CallData = multiCall.GetCallData(), Target = multiCall.Target }); } var aggregateFunction = new AggregateFunction(); aggregateFunction.Calls = contractCalls; var returnCalls = await _multiQueryToDtoHandler .QueryAsync(ContractAddress, aggregateFunction, block) .ConfigureAwait(false); for (var i = 0; i < returnCalls.ReturnData.Count; i++) { multiCalls[i].Decode(returnCalls.ReturnData[i]); } return(multiCalls); }
/// <summary> /// Queries some data from an ethereum contract. /// </summary> /// <typeparam name="TFunc"> The type of the function to send. </typeparam> /// <typeparam name="TOut"> The return type of the contract query. </typeparam> /// <param name="function"> The function containing the data to query. </param> /// <param name="contractAddress"> The address of the contract to query data from. </param> /// <param name="senderAddress"> The address of the sender which is querying data. </param> /// <returns> Task returning the return type of the query. </returns> public static Task <TOut> QueryContract <TFunc, TOut>(TFunc function, string contractAddress, string senderAddress) where TFunc : FunctionMessage, new() where TOut : IFunctionOutputDTO, new() { function.SetDefaultFromAddressIfNotSet(senderAddress); var queryHandler = new QueryToDTOHandler <TFunc, TOut>(NetworkProvider.GetWeb3().Client, senderAddress); return(queryHandler.QueryAsync(contractAddress, function)); }