Skip to content

Commit

Permalink
draft
Browse files Browse the repository at this point in the history
  • Loading branch information
shargon committed May 23, 2024
1 parent c8f9338 commit 5321e26
Show file tree
Hide file tree
Showing 3 changed files with 147 additions and 6 deletions.
28 changes: 26 additions & 2 deletions src/Neo/SmartContract/Manifest/ContractMethodDescriptor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public class ContractMethodDescriptor : ContractEventDescriptor
/// </summary>
public ContractParameterType ReturnType { get; set; }

/// <summary>
/// NEP-25 extended return type
/// </summary>
public ExtendedType? ExtendedReturnType { get; set; }

Check warning on line 33 in src/Neo/SmartContract/Manifest/ContractMethodDescriptor.cs

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 33 in src/Neo/SmartContract/Manifest/ContractMethodDescriptor.cs

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 33 in src/Neo/SmartContract/Manifest/ContractMethodDescriptor.cs

View workflow job for this annotation

GitHub Actions / Test (windows-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 33 in src/Neo/SmartContract/Manifest/ContractMethodDescriptor.cs

View workflow job for this annotation

GitHub Actions / Test (macos-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 33 in src/Neo/SmartContract/Manifest/ContractMethodDescriptor.cs

View workflow job for this annotation

GitHub Actions / Test (macos-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

/// <summary>
/// The position of the method in the contract script.
/// </summary>
Expand All @@ -45,14 +50,28 @@ public override void FromStackItem(StackItem stackItem)
ReturnType = (ContractParameterType)(byte)@struct[2].GetInteger();
Offset = (int)@struct[3].GetInteger();
Safe = @struct[4].GetBoolean();
if (@struct.Count >= 6)
{
ExtendedReturnType = new ExtendedType();
ExtendedReturnType.FromStackItem((VM.Types.Array)@struct[5], 0);
}
else
{
ExtendedReturnType = null;
}
}

public override StackItem ToStackItem(ReferenceCounter referenceCounter)
{
Struct @struct = (Struct)base.ToStackItem(referenceCounter);
var @struct = (Struct)base.ToStackItem(referenceCounter);
@struct.Add((byte)ReturnType);
@struct.Add(Offset);
@struct.Add(Safe);
if (ExtendedReturnType != null)
{
var structExtended = new Struct(referenceCounter);
@struct.Add(ExtendedReturnType.ToStackItem(referenceCounter, structExtended));
}
return @struct;
}

Expand All @@ -69,7 +88,8 @@ public override StackItem ToStackItem(ReferenceCounter referenceCounter)
Parameters = ((JArray)json["parameters"]).Select(u => ContractParameterDefinition.FromJson((JObject)u)).ToArray(),
ReturnType = Enum.Parse<ContractParameterType>(json["returntype"].GetString()),
Offset = json["offset"].GetInt32(),
Safe = json["safe"].GetBoolean()
Safe = json["safe"].GetBoolean(),
ExtendedReturnType = json["extendedreturntype"] != null ? ExtendedType.FromJson((JObject)json["extendedreturntype"]) : null
};
if (string.IsNullOrEmpty(descriptor.Name)) throw new FormatException();
_ = descriptor.Parameters.ToDictionary(p => p.Name);
Expand All @@ -88,6 +108,10 @@ public override JObject ToJson()
json["returntype"] = ReturnType.ToString();
json["offset"] = Offset;
json["safe"] = Safe;
if (ExtendedReturnType != null)
{
json["extendedreturntype"] = ExtendedReturnType.ToString();
}
return json;
}
}
Expand Down
36 changes: 32 additions & 4 deletions src/Neo/SmartContract/Manifest/ContractParameterDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,39 @@ public class ContractParameterDefinition : IInteroperable
/// </summary>
public ContractParameterType Type { get; set; }

/// <summary>
/// NEP-25 extended type
/// </summary>
public ExtendedType? ExtendedType { get; set; }

Check warning on line 37 in src/Neo/SmartContract/Manifest/ContractParameterDefinition.cs

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 37 in src/Neo/SmartContract/Manifest/ContractParameterDefinition.cs

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 37 in src/Neo/SmartContract/Manifest/ContractParameterDefinition.cs

View workflow job for this annotation

GitHub Actions / Test (windows-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 37 in src/Neo/SmartContract/Manifest/ContractParameterDefinition.cs

View workflow job for this annotation

GitHub Actions / Test (macos-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

Check warning on line 37 in src/Neo/SmartContract/Manifest/ContractParameterDefinition.cs

View workflow job for this annotation

GitHub Actions / Test (macos-latest)

The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

void IInteroperable.FromStackItem(StackItem stackItem)
{
Struct @struct = (Struct)stackItem;
var @struct = (Struct)stackItem;
Name = @struct[0].GetString();
Type = (ContractParameterType)(byte)@struct[1].GetInteger();

if (@struct.Count >= 3)
{
ExtendedType = new ExtendedType();
ExtendedType.FromStackItem((VM.Types.Array)@struct[5], 0);
}
else
{
ExtendedType = null;
}
}

public StackItem ToStackItem(ReferenceCounter referenceCounter)
{
return new Struct(referenceCounter) { Name, (byte)Type };
var @struct = new Struct(referenceCounter) { Name, (byte)Type };

if (ExtendedType != null)
{
var structExtended = new Struct(referenceCounter);
@struct.Add(ExtendedType.ToStackItem(referenceCounter, structExtended));
}

return @struct;
}

/// <summary>
Expand All @@ -50,10 +73,11 @@ public StackItem ToStackItem(ReferenceCounter referenceCounter)
/// <returns>The converted parameter.</returns>
public static ContractParameterDefinition FromJson(JObject json)
{
ContractParameterDefinition parameter = new()
var parameter = new ContractParameterDefinition()
{
Name = json["name"].GetString(),
Type = Enum.Parse<ContractParameterType>(json["type"].GetString())
Type = Enum.Parse<ContractParameterType>(json["type"].GetString()),
ExtendedType = json["extendedtype"] != null ? ExtendedType.FromJson((JObject)json["extendedtype"]) : null,
};
if (string.IsNullOrEmpty(parameter.Name))
throw new FormatException();
Expand All @@ -71,6 +95,10 @@ public JObject ToJson()
var json = new JObject();
json["name"] = Name;
json["type"] = Type.ToString();
if (ExtendedType != null)
{
json["extendedtype"] = ExtendedType.ToString();
}
return json;
}
}
Expand Down
89 changes: 89 additions & 0 deletions src/Neo/SmartContract/Manifest/ExtendedType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Copyright (C) 2015-2024 The Neo Project.
//
// ExtendedType.cs file belongs to the neo project and is free
// software distributed under the MIT software license, see the
// accompanying file LICENSE in the main directory of the
// repository or http://www.opensource.org/licenses/mit-license.php
// for more details.
//
// Redistribution and use in source and binary forms with or without
// modifications are permitted.

using Neo.Json;
using Neo.VM;
using Neo.VM.Types;
using System;

namespace Neo.SmartContract.Manifest
{
public class ExtendedType : IInteroperable
{
/// <summary>
/// The type of the parameter. It can be any value of <see cref="ContractParameterType"/> except <see cref="ContractParameterType.Void"/>.
/// </summary>
public ContractParameterType Type { get; set; }

/// <summary>
/// NamedType is used to refer to one of the types defined in the namedtypes object of Contract,
/// so namedtypes MUST contain a field named name.
/// This field is only used for structures (ordered set of named values of diffent types),
/// if used other fields MUST NOT be set, except for the type which MUST be an Array.
/// Value string MUST start with a letter and can contain alphanumeric characters and dots.
/// It MUST NOT be longer than 64 characters.
/// </summary>
public string NamedType { get; set; }

void IInteroperable.FromStackItem(StackItem stackItem)
{
FromStackItem((VM.Types.Array)stackItem, 0);
}

internal void FromStackItem(VM.Types.Array @struct, int startIndex)
{
Type = (ContractParameterType)(byte)@struct[startIndex].GetInteger();
NamedType = @struct[startIndex + 1].GetString();
}

StackItem IInteroperable.ToStackItem(ReferenceCounter referenceCounter)
{
Struct @struct = new Struct(referenceCounter);
ToStackItem(referenceCounter, @struct);
return @struct;
}

internal StackItem ToStackItem(ReferenceCounter referenceCounter, Struct @struct)
{
@struct.Add((byte)Type);
@struct.Add(NamedType);
return @struct;
}

/// <summary>
/// Converts the type from a JSON object.
/// </summary>
/// <param name="json">The method represented by a JSON object.</param>
/// <returns>The extended type.</returns>
public static ExtendedType FromJson(JObject json)
{
ExtendedType type = new()
{
Type = Enum.Parse<ContractParameterType>(json["type"].GetString()),
NamedType = json["namedtype"].GetString(),
};
if (!Enum.IsDefined(typeof(ContractParameterType), type.Type)) throw new FormatException();
return type;
}

/// <summary>
/// Converts the parameter to a JSON object.
/// </summary>
/// <returns>The parameter represented by a JSON object.</returns>
public virtual JObject ToJson()
{
var json = new JObject();
json["type"] = Type.ToString();
json["namedtype"] = NamedType;
return json;
}
}
}

0 comments on commit 5321e26

Please sign in to comment.