using System.Threading; using System.Threading.Tasks; using Nethereum.ABI.Decoders; using Nethereum.ABI.FunctionEncoding.Attributes; using Nethereum.Contracts.CQS; using Nethereum.Contracts.Services; using Nethereum.Hex.HexTypes; using Nethereum.RPC.Eth.DTOs; namespace Nethereum.Contracts.ContractHandlers { public class ContractHandler { public ContractHandler(string contractAddress, EthApiContractService ethApiContractService, string addressFrom = null) { ContractAddress = contractAddress; EthApiContractService = ethApiContractService; AddressFrom = addressFrom; } protected string AddressFrom { get; set; } public string ContractAddress { get; } public EthApiContractService EthApiContractService { get; } public Event GetEvent() where TEventType : IEventDTO, new() { if (!EventAttribute.IsEventType(typeof(TEventType))) return null; return new Event(EthApiContractService.Client, ContractAddress); } public Function GetFunction() where TEthereumContractFunctionMessage : new() { var contract = EthApiContractService.GetContract(ContractAddress); return contract.GetFunction(); } protected void SetAddressFrom(ContractMessageBase contractMessage) { contractMessage.FromAddress = contractMessage.FromAddress ?? AddressFrom; } #if !DOTNET35 public Task SendRequestAndWaitForReceiptAsync( TEthereumContractFunctionMessage transactionMesssage = null, CancellationTokenSource tokenSource = null) where TEthereumContractFunctionMessage : FunctionMessage, new() { if (transactionMesssage == null) transactionMesssage = new TEthereumContractFunctionMessage(); var command = EthApiContractService.GetContractTransactionHandler(); SetAddressFrom(transactionMesssage); return command.SendRequestAndWaitForReceiptAsync(ContractAddress, transactionMesssage, tokenSource); } public Task SendRequestAsync( TEthereumContractFunctionMessage transactionMesssage = null) where TEthereumContractFunctionMessage : FunctionMessage, new() { if(transactionMesssage == null) transactionMesssage = new TEthereumContractFunctionMessage(); var command = EthApiContractService.GetContractTransactionHandler(); SetAddressFrom(transactionMesssage); return command.SendRequestAsync(ContractAddress, transactionMesssage); } public Task SignTransactionAsync( TEthereumContractFunctionMessage transactionMesssage = null) where TEthereumContractFunctionMessage : FunctionMessage, new() { if (transactionMesssage == null) transactionMesssage = new TEthereumContractFunctionMessage(); var command = EthApiContractService.GetContractTransactionHandler(); SetAddressFrom(transactionMesssage); return command.SignTransactionAsync(ContractAddress, transactionMesssage); } public Task EstimateGasAsync( TEthereumContractFunctionMessage transactionMesssage = null) where TEthereumContractFunctionMessage : FunctionMessage, new() { if (transactionMesssage == null) transactionMesssage = new TEthereumContractFunctionMessage(); var command = EthApiContractService.GetContractTransactionHandler(); SetAddressFrom(transactionMesssage); return command.EstimateGasAsync(ContractAddress, transactionMesssage); } public Task QueryDeserializingToObjectAsync(TEthereumContractFunctionMessage ethereumContractFunctionMessage = null, BlockParameter blockParameter = null) where TEthereumContractFunctionMessage : FunctionMessage, new() where TEthereumFunctionReturn : IFunctionOutputDTO, new() { if (ethereumContractFunctionMessage == null) ethereumContractFunctionMessage = new TEthereumContractFunctionMessage(); SetAddressFrom(ethereumContractFunctionMessage); var queryHandler = EthApiContractService.GetContractQueryHandler(); return queryHandler.QueryDeserializingToObjectAsync( ethereumContractFunctionMessage, ContractAddress, blockParameter); } public Task QueryAsync( TEthereumContractFunctionMessage ethereumContractFunctionMessage = null, BlockParameter blockParameter = null) where TEthereumContractFunctionMessage : FunctionMessage, new() { if(ethereumContractFunctionMessage == null) ethereumContractFunctionMessage = new TEthereumContractFunctionMessage(); SetAddressFrom(ethereumContractFunctionMessage); var queryHandler = EthApiContractService.GetContractQueryHandler(); return queryHandler.QueryAsync( ContractAddress, ethereumContractFunctionMessage, blockParameter); } public Task QueryRawAsync(TEthereumContractFunctionMessage ethereumContractFunctionMessage = null, BlockParameter blockParameter = null) where TEthereumContractFunctionMessage : FunctionMessage, new() { if (ethereumContractFunctionMessage == null) ethereumContractFunctionMessage = new TEthereumContractFunctionMessage(); SetAddressFrom(ethereumContractFunctionMessage); var queryHandler = EthApiContractService.GetContractQueryHandler(); return queryHandler.QueryRawAsBytesAsync( ContractAddress, ethereumContractFunctionMessage, blockParameter); } public Task QueryRawAsync(BlockParameter blockParameter = null) where TEthereumContractFunctionMessage : FunctionMessage, new() where TCustomDecoder : ICustomRawDecoder, new() { var ethereumContractFunctionMessage = new TEthereumContractFunctionMessage(); return QueryRawAsync(ethereumContractFunctionMessage, blockParameter); } public async Task QueryRawAsync(TEthereumContractFunctionMessage ethereumContractFunctionMessage, BlockParameter blockParameter = null) where TEthereumContractFunctionMessage : FunctionMessage, new() where TCustomDecoder : ICustomRawDecoder, new() { var result = await QueryRawAsync(ethereumContractFunctionMessage, blockParameter).ConfigureAwait(false); var decoder = new TCustomDecoder(); return decoder.Decode(result); } #endif } }