Exemplo n.º 1
0
            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);
            }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
 /// <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]);
 }
Exemplo n.º 7
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);