private object[] Call(BlockHeader parentHeader, AbiFunctionDescription function, Address sender, params object[] arguments) { var result = CallRaw(parentHeader, function, sender, arguments); var objects = _contract.AbiEncoder.Decode(function.GetReturnInfo(), result); return(objects); }
public override AbiDefinition ReadJson(JsonReader reader, Type objectType, AbiDefinition existingValue, bool hasExistingValue, JsonSerializer serializer) { var token = JToken.Load(reader); existingValue ??= new AbiDefinition(); foreach (var definitionToken in token.Children()) { var type = Enum.Parse <AbiDescriptionType>(definitionToken[nameof(AbiBaseDescription <AbiParameter> .Type).ToLowerInvariant()].Value <string>(), true); var name = definitionToken[nameof(AbiBaseDescription <AbiParameter> .Name).ToLowerInvariant()]?.Value <string>(); if (type == AbiDescriptionType.Event) { var abiEvent = new AbiEventDescription(); serializer.Populate(definitionToken.CreateReader(), abiEvent); existingValue.Add(abiEvent); } else { var abiFunction = new AbiFunctionDescription(); serializer.Populate(definitionToken.CreateReader(), abiFunction); existingValue.Add(abiFunction); } } return(existingValue); }
/// <summary> /// Calls the function in contract, state modification is allowed. /// </summary> /// <param name="header">Header in which context the call is done.</param> /// <param name="function">Function in contract that is being called.</param> /// <param name="sender">Sender of the transaction - caller of the function.</param> /// <param name="arguments">Arguments to the function.</param> /// <returns>Deserialized return value of the <see cref="function"/> based on its definition.</returns> protected object[] Call(BlockHeader header, AbiFunctionDescription function, Address sender, params object[] arguments) { var transaction = GenerateTransaction <SystemTransaction>(function, sender, arguments); var result = Call(header, transaction); var objects = AbiEncoder.Decode(function.GetReturnInfo(), result); return(objects); }
public override AbiDefinition ReadJson( JsonReader reader, Type objectType, AbiDefinition existingValue, bool hasExistingValue, JsonSerializer serializer) { JToken topLevelToken = JToken.Load(reader); existingValue ??= new AbiDefinition(); JToken abiToken; if (topLevelToken.Type == JTokenType.Object) { abiToken = topLevelToken["abi"]; byte[] bytecode = Bytes.FromHexString(topLevelToken["bytecode"]?.Value <string>() ?? string.Empty); existingValue.SetBytecode(bytecode); } else { abiToken = topLevelToken; } foreach (var definitionToken in abiToken?.Children() ?? Enumerable.Empty <JToken>()) { string name = definitionToken[_nameTokenName]?.Value <string>(); JToken typeToken = definitionToken[_typeTokenName]; if (typeToken == null) { continue; } AbiDescriptionType type = Enum.Parse <AbiDescriptionType>( typeToken.Value <string>(), true); if (type == AbiDescriptionType.Event) { AbiEventDescription abiEvent = new AbiEventDescription(); serializer.Populate(definitionToken.CreateReader(), abiEvent); existingValue.Add(abiEvent); } else { AbiFunctionDescription abiFunction = new AbiFunctionDescription(); serializer.Populate(definitionToken.CreateReader(), abiFunction); existingValue.Add(abiFunction); } } return(existingValue); }
/// <summary> /// Same as <see cref="Call(Nethermind.Core.BlockHeader,AbiFunctionDescription,Address,object[])"/> but returns false instead of throwing <see cref="AuRaException"/>. /// </summary> /// <param name="header">Header in which context the call is done.</param> /// <param name="function">Function in contract that is being called.</param> /// <param name="sender">Sender of the transaction - caller of the function.</param> /// <param name="result">Deserialized return value of the <see cref="function"/> based on its definition.</param> /// <param name="arguments">Arguments to the function.</param> /// <returns>true if function was <see cref="StatusCode.Success"/> otherwise false.</returns> protected bool TryCall(BlockHeader header, AbiFunctionDescription function, Address sender, out object[] result, params object[] arguments) { var transaction = GenerateTransaction <SystemTransaction>(function, sender, arguments); if (TryCall(header, transaction, out var bytes)) { result = AbiEncoder.Decode(function.GetReturnInfo(), bytes); return(true); } result = null; return(false); }
/// <summary> /// /// </summary> /// <param name="parentHeader"></param> /// <param name="function"></param> /// <param name="sender"></param> /// <param name="arguments"></param> /// <typeparam name="T"></typeparam> /// <returns></returns> public T Call <T>(BlockHeader parentHeader, AbiFunctionDescription function, Address sender, params object[] arguments) { return((T)Call(parentHeader, function, sender, arguments)[0]); }
/// <summary> /// Generates transaction. /// That transaction can be added to a produced block or broadcasted - if <see cref="GeneratedTransaction"/> is used as <see cref="T"/>. /// That transaction can be used in <see cref="Call(Nethermind.Core.BlockHeader,Nethermind.Core.Transaction)"/> if <see cref="SystemTransaction"/> is used as <see cref="T"/>. /// </summary> /// <param name="function">Function in contract that is called by the transaction.</param> /// <param name="sender">Sender of the transaction - caller of the function.</param> /// <param name="arguments">Arguments to the function.</param> /// <typeparam name="T">Type of <see cref="Transaction"/>.</typeparam> /// <returns>Transaction.</returns> protected Transaction GenerateTransaction <T>(AbiFunctionDescription function, Address sender, params object[] arguments) where T : Transaction, new() => GenerateTransaction <T>(AbiEncoder.Encode(function.GetCallInfo(), arguments), sender);