public override object Decode(byte[] encoded, Type type) { if (!IsSupportedType(type)) { throw new NotSupportedException(type + " is not supported"); } return(System.Text.Encoding.UTF8.GetString(encoded, 32, EncoderDecoderHelpers.GetNumberOfBytes(encoded))); }
public List <ParameterOutput> DecodeOutput(byte[] outputBytes, params ParameterOutput[] outputParameters) { var currentIndex = 0; // discard initial offset if (outputParameters.Count() > 1 && outputParameters.Any(oP => oP.Parameter.ABIType.Name == "tuple[]")) { // remove the starting 0x20 currentIndex = 32; } foreach (var outputParam in outputParameters) { var param = outputParam.Parameter; if (param.ABIType.IsDynamic()) { outputParam.DataIndexStart = EncoderDecoderHelpers.GetNumberOfBytes(outputBytes.Skip(currentIndex).ToArray()); // should only happen on tuples, as we look for their location if (currentIndex != 0 && (outputParam.Parameter.ABIType.Name == "tuple" || outputParam.Parameter.ABIType.Name == "tuple[]")) { outputParam.DataIndexStart = outputParam.DataIndexStart + 32; //including its current index 32 bytes } currentIndex = currentIndex + 32; } else { var bytes = outputBytes.Skip(currentIndex).Take(param.ABIType.FixedSize).ToArray(); outputParam.Result = param.ABIType.Decode(bytes, outputParam.Parameter.DecodedType); currentIndex = currentIndex + param.ABIType.FixedSize; } } ParameterOutput currentDataItem = null; foreach ( var nextDataItem in outputParameters.Where(outputParam => outputParam.Parameter.ABIType.IsDynamic())) { if (currentDataItem != null) { var bytes = outputBytes.Skip(currentDataItem.DataIndexStart).Take(nextDataItem.DataIndexStart - currentDataItem.DataIndexStart).ToArray(); currentDataItem.Result = currentDataItem.Parameter.ABIType.Decode(bytes, currentDataItem.Parameter.DecodedType); } currentDataItem = nextDataItem; } if (currentDataItem != null) { var bytes = outputBytes.Skip(currentDataItem.DataIndexStart).ToArray(); currentDataItem.Result = currentDataItem.Parameter.ABIType.Decode(bytes, currentDataItem.Parameter.DecodedType); } return(outputParameters.ToList()); }
public override object Decode(byte[] encoded, Type type) { if (!IsSupportedType(type)) { throw new NotSupportedException(type + " is not supported"); } if (type == typeof(string)) { return(_stringTypeDecoder.Decode(encoded, type)); } return(encoded.Skip(32).Take(EncoderDecoderHelpers.GetNumberOfBytes(encoded)).ToArray()); }
public List <ParameterOutput> DecodeOutput(byte[] outputBytes, params ParameterOutput[] outputParameters) { var currentIndex = 0; Array.Sort(outputParameters, (x, y) => x.Parameter.Order.CompareTo(y.Parameter.Order)); foreach (var outputParam in outputParameters) { var param = outputParam.Parameter; if (param.ABIType.IsDynamic()) { outputParam.DataIndexStart = EncoderDecoderHelpers.GetNumberOfBytes(outputBytes.Skip(currentIndex).ToArray()); currentIndex = currentIndex + 32; } else { var bytes = outputBytes.Skip(currentIndex).Take(param.ABIType.FixedSize).ToArray(); outputParam.Result = param.ABIType.Decode(bytes, outputParam.Parameter.DecodedType); currentIndex = currentIndex + param.ABIType.FixedSize; } } ParameterOutput currentDataItem = null; foreach ( var nextDataItem in outputParameters.Where(outputParam => outputParam.Parameter.ABIType.IsDynamic())) { if (currentDataItem != null) { var bytes = outputBytes.Skip(currentDataItem.DataIndexStart).Take(nextDataItem.DataIndexStart - currentDataItem.DataIndexStart).ToArray(); currentDataItem.Result = currentDataItem.Parameter.ABIType.Decode(bytes, currentDataItem.Parameter.DecodedType); } currentDataItem = nextDataItem; } if (currentDataItem != null) { var bytes = outputBytes.Skip(currentDataItem.DataIndexStart).ToArray(); currentDataItem.Result = currentDataItem.Parameter.ABIType.Decode(bytes, currentDataItem.Parameter.DecodedType); } return(outputParameters.ToList()); }