diff --git a/src/Neo/Cryptography/Helper.cs b/src/Neo/Cryptography/Helper.cs
index 41e89f5a49..5ec4ea38d7 100644
--- a/src/Neo/Cryptography/Helper.cs
+++ b/src/Neo/Cryptography/Helper.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Network.P2P.Payloads;
using Neo.Wallets;
using Org.BouncyCastle.Crypto.Digests;
diff --git a/src/Neo/Cryptography/MerkleTree.cs b/src/Neo/Cryptography/MerkleTree.cs
index ed25171ef8..09afa29277 100644
--- a/src/Neo/Cryptography/MerkleTree.cs
+++ b/src/Neo/Cryptography/MerkleTree.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using System;
using System.Collections;
using System.Collections.Generic;
diff --git a/src/Neo/Extensions/ByteExtensions.cs b/src/Neo/Extensions/ByteExtensions.cs
new file mode 100644
index 0000000000..7bacd33f42
--- /dev/null
+++ b/src/Neo/Extensions/ByteExtensions.cs
@@ -0,0 +1,66 @@
+// Copyright (C) 2015-2024 The Neo Project.
+//
+// ByteExtensions.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.IO;
+using System;
+
+namespace Neo.Extensions
+{
+ public static class ByteExtensions
+ {
+ ///
+ /// Compresses the specified data using the LZ4 algorithm.
+ ///
+ /// The data to be compressed.
+ /// The compressed data.
+ public static ReadOnlyMemory CompressLz4(this byte[] data)
+ {
+ return data.AsSpan().CompressLz4();
+ }
+
+ ///
+ /// Decompresses the specified data using the LZ4 algorithm.
+ ///
+ /// The compressed data.
+ /// The maximum data size after decompression.
+ /// The original data.
+ public static byte[] DecompressLz4(this byte[] data, int maxOutput)
+ {
+ return data.AsSpan().DecompressLz4(maxOutput);
+ }
+
+ ///
+ /// Converts a byte array to an object.
+ ///
+ /// The type to convert to.
+ /// The byte array to be converted.
+ /// The offset into the byte array from which to begin using data.
+ /// The converted object.
+ public static T AsSerializable(this byte[] value, int start = 0) where T : ISerializable, new()
+ {
+ MemoryReader reader = new(value.AsMemory(start));
+ return reader.ReadSerializable();
+ }
+
+ ///
+ /// Converts a byte array to an array.
+ ///
+ /// The type of the array element.
+ /// The byte array to be converted.
+ /// The maximum number of elements contained in the converted array.
+ /// The converted array.
+ public static T[] AsSerializableArray(this byte[] value, int max = 0x1000000) where T : ISerializable, new()
+ {
+ MemoryReader reader = new(value);
+ return reader.ReadSerializableArray(max);
+ }
+ }
+}
diff --git a/src/Neo/Extensions/IO/BinaryReaderExtensions.cs b/src/Neo/Extensions/IO/BinaryReaderExtensions.cs
new file mode 100644
index 0000000000..f3448d96e1
--- /dev/null
+++ b/src/Neo/Extensions/IO/BinaryReaderExtensions.cs
@@ -0,0 +1,79 @@
+// Copyright (C) 2015-2024 The Neo Project.
+//
+// BinaryReaderExtensions.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 System;
+using System.IO;
+
+namespace Neo.Extensions
+{
+ public static class BinaryReaderExtensions
+ {
+ ///
+ /// Reads a byte array of the specified size from a .
+ ///
+ /// The for reading data.
+ /// The size of the byte array.
+ /// The byte array read from the .
+ public static byte[] ReadFixedBytes(this BinaryReader reader, int size)
+ {
+ var index = 0;
+ var data = new byte[size];
+
+ while (size > 0)
+ {
+ var bytesRead = reader.Read(data, index, size);
+
+ if (bytesRead <= 0)
+ {
+ throw new FormatException();
+ }
+
+ size -= bytesRead;
+ index += bytesRead;
+ }
+
+ return data;
+ }
+
+ ///
+ /// Reads a byte array from a .
+ ///
+ /// The for reading data.
+ /// The maximum size of the byte array.
+ /// The byte array read from the .
+ public static byte[] ReadVarBytes(this BinaryReader reader, int max = 0x1000000)
+ {
+ return reader.ReadFixedBytes((int)reader.ReadVarInt((ulong)max));
+ }
+
+ ///
+ /// Reads an integer from a .
+ ///
+ /// The for reading data.
+ /// The maximum value of the integer.
+ /// The integer read from the .
+ public static ulong ReadVarInt(this BinaryReader reader, ulong max = ulong.MaxValue)
+ {
+ var fb = reader.ReadByte();
+ ulong value;
+ if (fb == 0xFD)
+ value = reader.ReadUInt16();
+ else if (fb == 0xFE)
+ value = reader.ReadUInt32();
+ else if (fb == 0xFF)
+ value = reader.ReadUInt64();
+ else
+ value = fb;
+ if (value > max) throw new FormatException();
+ return value;
+ }
+ }
+}
diff --git a/src/Neo/Extensions/IO/BinaryWriterExtensions.cs b/src/Neo/Extensions/IO/BinaryWriterExtensions.cs
new file mode 100644
index 0000000000..665eae1a69
--- /dev/null
+++ b/src/Neo/Extensions/IO/BinaryWriterExtensions.cs
@@ -0,0 +1,137 @@
+// Copyright (C) 2015-2024 The Neo Project.
+//
+// BinaryWriterExtensions.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.IO;
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace Neo.Extensions
+{
+ public static class BinaryWriterExtensions
+ {
+ ///
+ /// Writes an object into a .
+ ///
+ /// The for writing data.
+ /// The object to be written.
+ public static void Write(this BinaryWriter writer, ISerializable value)
+ {
+ value.Serialize(writer);
+ }
+
+ ///
+ /// Writes an array into a .
+ ///
+ /// The type of the array element.
+ /// The for writing data.
+ /// The array to be written.
+ public static void Write(this BinaryWriter writer, IReadOnlyCollection value)
+ where T : ISerializable
+ {
+ writer.WriteVarInt(value.Count);
+ foreach (T item in value)
+ {
+ item.Serialize(writer);
+ }
+ }
+
+ ///
+ /// Writes a into a .
+ ///
+ /// The for writing data.
+ /// The to be written.
+ /// The fixed size of the .
+ public static void WriteFixedString(this BinaryWriter writer, string value, int length)
+ {
+ if (value == null)
+ throw new ArgumentNullException(nameof(value));
+ if (value.Length > length)
+ throw new ArgumentException(null, nameof(value));
+ var bytes = Utility.StrictUTF8.GetBytes(value);
+ if (bytes.Length > length)
+ throw new ArgumentException(null, nameof(value));
+ writer.Write(bytes);
+ if (bytes.Length < length)
+ writer.Write(stackalloc byte[length - bytes.Length]);
+ }
+
+ ///
+ /// Writes an array into a .
+ ///
+ /// The type of the array element.
+ /// The for writing data.
+ /// The array to be written.
+ public static void WriteNullableArray(this BinaryWriter writer, T[] value)
+ where T : class, ISerializable
+ {
+ writer.WriteVarInt(value.Length);
+ foreach (var item in value)
+ {
+ var isNull = item is null;
+ writer.Write(!isNull);
+ if (isNull) continue;
+ item.Serialize(writer);
+ }
+ }
+
+ ///
+ /// Writes a byte array into a .
+ ///
+ /// The for writing data.
+ /// The byte array to be written.
+ public static void WriteVarBytes(this BinaryWriter writer, ReadOnlySpan value)
+ {
+ writer.WriteVarInt(value.Length);
+ writer.Write(value);
+ }
+
+ ///
+ /// Writes an integer into a .
+ ///
+ /// The for writing data.
+ /// The integer to be written.
+ public static void WriteVarInt(this BinaryWriter writer, long value)
+ {
+ if (value < 0)
+ throw new ArgumentOutOfRangeException(nameof(value));
+ if (value < 0xFD)
+ {
+ writer.Write((byte)value);
+ }
+ else if (value <= 0xFFFF)
+ {
+ writer.Write((byte)0xFD);
+ writer.Write((ushort)value);
+ }
+ else if (value <= 0xFFFFFFFF)
+ {
+ writer.Write((byte)0xFE);
+ writer.Write((uint)value);
+ }
+ else
+ {
+ writer.Write((byte)0xFF);
+ writer.Write(value);
+ }
+ }
+
+ ///
+ /// Writes a into a .
+ ///
+ /// The for writing data.
+ /// The to be written.
+ public static void WriteVarString(this BinaryWriter writer, string value)
+ {
+ writer.WriteVarBytes(Utility.StrictUTF8.GetBytes(value));
+ }
+ }
+}
diff --git a/src/Neo/Extensions/IO/ISerializableExtensions.cs b/src/Neo/Extensions/IO/ISerializableExtensions.cs
new file mode 100644
index 0000000000..67b4f39519
--- /dev/null
+++ b/src/Neo/Extensions/IO/ISerializableExtensions.cs
@@ -0,0 +1,33 @@
+// Copyright (C) 2015-2024 The Neo Project.
+//
+// ISerializableExtensions.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.IO;
+using System.IO;
+
+namespace Neo.Extensions
+{
+ public static class ISerializableExtensions
+ {
+ ///
+ /// Converts an object to a byte array.
+ ///
+ /// The object to be converted.
+ /// The converted byte array.
+ public static byte[] ToArray(this ISerializable value)
+ {
+ using MemoryStream ms = new();
+ using BinaryWriter writer = new(ms, Utility.StrictUTF8, true);
+ value.Serialize(writer);
+ writer.Flush();
+ return ms.ToArray();
+ }
+ }
+}
diff --git a/src/Neo/Extensions/IO/MemoryReaderExtensions.cs b/src/Neo/Extensions/IO/MemoryReaderExtensions.cs
new file mode 100644
index 0000000000..5591724b80
--- /dev/null
+++ b/src/Neo/Extensions/IO/MemoryReaderExtensions.cs
@@ -0,0 +1,70 @@
+// Copyright (C) 2015-2024 The Neo Project.
+//
+// MemoryReaderExtensions.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.IO;
+
+namespace Neo.Extensions
+{
+ ///
+ /// A helper class for serialization of NEO objects.
+ ///
+ public static class MemoryReaderExtensions
+ {
+ ///
+ /// Reads an array from a .
+ ///
+ /// The type of the array element.
+ /// The for reading data.
+ /// The maximum number of elements in the array.
+ /// The array read from the .
+ public static T[] ReadNullableArray(this ref MemoryReader reader, int max = 0x1000000)
+ where T : class, ISerializable, new()
+ {
+ var array = new T[reader.ReadVarInt((ulong)max)];
+ for (var i = 0; i < array.Length; i++)
+ array[i] = reader.ReadBoolean() ? reader.ReadSerializable() : null;
+ return array;
+ }
+
+ ///
+ /// Reads an object from a .
+ ///
+ /// The type of the object.
+ /// The for reading data.
+ /// The object read from the .
+ public static T ReadSerializable(this ref MemoryReader reader)
+ where T : ISerializable, new()
+ {
+ T obj = new();
+ obj.Deserialize(ref reader);
+ return obj;
+ }
+
+ ///
+ /// Reads an array from a .
+ ///
+ /// The type of the array element.
+ /// The for reading data.
+ /// The maximum number of elements in the array.
+ /// The array read from the .
+ public static T[] ReadSerializableArray(this ref MemoryReader reader, int max = 0x1000000)
+ where T : ISerializable, new()
+ {
+ var array = new T[reader.ReadVarInt((ulong)max)];
+ for (var i = 0; i < array.Length; i++)
+ {
+ array[i] = new T();
+ array[i].Deserialize(ref reader);
+ }
+ return array;
+ }
+ }
+}
diff --git a/src/Neo/Extensions/MemoryExtensions.cs b/src/Neo/Extensions/MemoryExtensions.cs
index f6576387de..c1331a5998 100644
--- a/src/Neo/Extensions/MemoryExtensions.cs
+++ b/src/Neo/Extensions/MemoryExtensions.cs
@@ -17,6 +17,20 @@ namespace Neo.Extensions
{
public static class MemoryExtensions
{
+ ///
+ /// Converts a byte array to an array.
+ ///
+ /// The type of the array element.
+ /// The byte array to be converted.
+ /// The maximum number of elements contained in the converted array.
+ /// The converted array.
+ public static T[] AsSerializableArray(this ReadOnlyMemory value, int max = 0x1000000) where T : ISerializable, new()
+ {
+ if (value.IsEmpty) throw new FormatException();
+ MemoryReader reader = new(value);
+ return reader.ReadSerializableArray(max);
+ }
+
///
/// Converts a byte array to an object.
///
diff --git a/src/Neo/Extensions/SpanExtensions.cs b/src/Neo/Extensions/SpanExtensions.cs
new file mode 100644
index 0000000000..3bc650cbb8
--- /dev/null
+++ b/src/Neo/Extensions/SpanExtensions.cs
@@ -0,0 +1,80 @@
+// Copyright (C) 2015-2024 The Neo Project.
+//
+// SpanExtensions.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 K4os.Compression.LZ4;
+using System;
+using System.Buffers.Binary;
+
+namespace Neo.Extensions
+{
+ public static class SpanExtensions
+ {
+ ///
+ /// Compresses the specified data using the LZ4 algorithm.
+ ///
+ /// The data to be compressed.
+ /// The compressed data.
+ public static ReadOnlyMemory CompressLz4(this ReadOnlySpan data)
+ {
+ var maxLength = LZ4Codec.MaximumOutputSize(data.Length);
+ var buffer = new byte[sizeof(uint) + maxLength];
+ BinaryPrimitives.WriteInt32LittleEndian(buffer, data.Length);
+ var length = LZ4Codec.Encode(data, buffer.AsSpan(sizeof(uint)));
+ return buffer.AsMemory(0, sizeof(uint) + length);
+ }
+
+ ///
+ /// Compresses the specified data using the LZ4 algorithm.
+ ///
+ /// The data to be compressed.
+ /// The compressed data.
+ public static ReadOnlyMemory CompressLz4(this Span data)
+ {
+ var maxLength = LZ4Codec.MaximumOutputSize(data.Length);
+ var buffer = new byte[sizeof(uint) + maxLength];
+ BinaryPrimitives.WriteInt32LittleEndian(buffer, data.Length);
+ var length = LZ4Codec.Encode(data, buffer.AsSpan(sizeof(uint)));
+ return buffer.AsMemory(0, sizeof(uint) + length);
+ }
+
+ ///
+ /// Decompresses the specified data using the LZ4 algorithm.
+ ///
+ /// The compressed data.
+ /// The maximum data size after decompression.
+ /// The original data.
+ public static byte[] DecompressLz4(this ReadOnlySpan data, int maxOutput)
+ {
+ var length = BinaryPrimitives.ReadInt32LittleEndian(data);
+ if (length < 0 || length > maxOutput) throw new FormatException();
+ var result = new byte[length];
+ if (LZ4Codec.Decode(data[4..], result) != length)
+ throw new FormatException();
+ return result;
+ }
+
+ ///
+ /// Decompresses the specified data using the LZ4 algorithm.
+ ///
+ /// The compressed data.
+ /// The maximum data size after decompression.
+ /// The original data.
+ public static byte[] DecompressLz4(this Span data, int maxOutput)
+ {
+ var length = BinaryPrimitives.ReadInt32LittleEndian(data);
+ if (length < 0 || length > maxOutput) throw new FormatException();
+ var result = new byte[length];
+ if (LZ4Codec.Decode(data[4..], result) != length)
+ throw new FormatException();
+ return result;
+ }
+ }
+}
diff --git a/src/Neo/IO/Helper.cs b/src/Neo/IO/Helper.cs
deleted file mode 100644
index d0e5a00ec9..0000000000
--- a/src/Neo/IO/Helper.cs
+++ /dev/null
@@ -1,329 +0,0 @@
-// Copyright (C) 2015-2024 The Neo Project.
-//
-// Helper.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 K4os.Compression.LZ4;
-using System;
-using System.Buffers.Binary;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Neo.IO
-{
- ///
- /// A helper class for serialization of NEO objects.
- ///
- public static class Helper
- {
- ///
- /// Converts a byte array to an object.
- ///
- /// The type to convert to.
- /// The byte array to be converted.
- /// The offset into the byte array from which to begin using data.
- /// The converted object.
- public static T AsSerializable(this byte[] value, int start = 0) where T : ISerializable, new()
- {
- MemoryReader reader = new(value.AsMemory(start));
- return reader.ReadSerializable();
- }
-
- ///
- /// Converts a byte array to an array.
- ///
- /// The type of the array element.
- /// The byte array to be converted.
- /// The maximum number of elements contained in the converted array.
- /// The converted array.
- public static T[] AsSerializableArray(this byte[] value, int max = 0x1000000) where T : ISerializable, new()
- {
- MemoryReader reader = new(value);
- return reader.ReadSerializableArray(max);
- }
-
- ///
- /// Converts a byte array to an array.
- ///
- /// The type of the array element.
- /// The byte array to be converted.
- /// The maximum number of elements contained in the converted array.
- /// The converted array.
- public static T[] AsSerializableArray(this ReadOnlyMemory value, int max = 0x1000000) where T : ISerializable, new()
- {
- if (value.IsEmpty) throw new FormatException();
- MemoryReader reader = new(value);
- return reader.ReadSerializableArray(max);
- }
-
- ///
- /// Compresses the specified data using the LZ4 algorithm.
- ///
- /// The data to be compressed.
- /// The compressed data.
- public static ReadOnlyMemory CompressLz4(this ReadOnlySpan data)
- {
- int maxLength = LZ4Codec.MaximumOutputSize(data.Length);
- byte[] buffer = new byte[sizeof(uint) + maxLength];
- BinaryPrimitives.WriteInt32LittleEndian(buffer, data.Length);
- int length = LZ4Codec.Encode(data, buffer.AsSpan(sizeof(uint)));
- return buffer.AsMemory(0, sizeof(uint) + length);
- }
-
- ///
- /// Decompresses the specified data using the LZ4 algorithm.
- ///
- /// The compressed data.
- /// The maximum data size after decompression.
- /// The original data.
- public static byte[] DecompressLz4(this ReadOnlySpan data, int maxOutput)
- {
- int length = BinaryPrimitives.ReadInt32LittleEndian(data);
- if (length < 0 || length > maxOutput) throw new FormatException();
- byte[] result = new byte[length];
- if (LZ4Codec.Decode(data[4..], result) != length)
- throw new FormatException();
- return result;
- }
-
- ///
- /// Reads a byte array of the specified size from a .
- ///
- /// The for reading data.
- /// The size of the byte array.
- /// The byte array read from the .
- public static byte[] ReadFixedBytes(this BinaryReader reader, int size)
- {
- var index = 0;
- var data = new byte[size];
-
- while (size > 0)
- {
- var bytesRead = reader.Read(data, index, size);
-
- if (bytesRead <= 0)
- {
- throw new FormatException();
- }
-
- size -= bytesRead;
- index += bytesRead;
- }
-
- return data;
- }
-
- ///
- /// Reads an array from a .
- ///
- /// The type of the array element.
- /// The for reading data.
- /// The maximum number of elements in the array.
- /// The array read from the .
- public static T[] ReadNullableArray(this ref MemoryReader reader, int max = 0x1000000) where T : class, ISerializable, new()
- {
- T[] array = new T[reader.ReadVarInt((ulong)max)];
- for (int i = 0; i < array.Length; i++)
- array[i] = reader.ReadBoolean() ? reader.ReadSerializable() : null;
- return array;
- }
-
- ///
- /// Reads an object from a .
- ///
- /// The type of the object.
- /// The for reading data.
- /// The object read from the .
- public static T ReadSerializable(this ref MemoryReader reader) where T : ISerializable, new()
- {
- T obj = new();
- obj.Deserialize(ref reader);
- return obj;
- }
-
- ///
- /// Reads an array from a .
- ///
- /// The type of the array element.
- /// The for reading data.
- /// The maximum number of elements in the array.
- /// The array read from the .
- public static T[] ReadSerializableArray(this ref MemoryReader reader, int max = 0x1000000) where T : ISerializable, new()
- {
- T[] array = new T[reader.ReadVarInt((ulong)max)];
- for (int i = 0; i < array.Length; i++)
- {
- array[i] = new T();
- array[i].Deserialize(ref reader);
- }
- return array;
- }
-
- ///
- /// Reads a byte array from a .
- ///
- /// The for reading data.
- /// The maximum size of the byte array.
- /// The byte array read from the .
- public static byte[] ReadVarBytes(this BinaryReader reader, int max = 0x1000000)
- {
- return reader.ReadFixedBytes((int)reader.ReadVarInt((ulong)max));
- }
-
- ///
- /// Reads an integer from a .
- ///
- /// The for reading data.
- /// The maximum value of the integer.
- /// The integer read from the .
- public static ulong ReadVarInt(this BinaryReader reader, ulong max = ulong.MaxValue)
- {
- byte fb = reader.ReadByte();
- ulong value;
- if (fb == 0xFD)
- value = reader.ReadUInt16();
- else if (fb == 0xFE)
- value = reader.ReadUInt32();
- else if (fb == 0xFF)
- value = reader.ReadUInt64();
- else
- value = fb;
- if (value > max) throw new FormatException();
- return value;
- }
-
- ///
- /// Converts an object to a byte array.
- ///
- /// The object to be converted.
- /// The converted byte array.
- public static byte[] ToArray(this ISerializable value)
- {
- using MemoryStream ms = new();
- using BinaryWriter writer = new(ms, Utility.StrictUTF8, true);
- value.Serialize(writer);
- writer.Flush();
- return ms.ToArray();
- }
-
- ///
- /// Writes an object into a .
- ///
- /// The for writing data.
- /// The object to be written.
- public static void Write(this BinaryWriter writer, ISerializable value)
- {
- value.Serialize(writer);
- }
-
- ///
- /// Writes an array into a .
- ///
- /// The type of the array element.
- /// The for writing data.
- /// The array to be written.
- public static void Write(this BinaryWriter writer, IReadOnlyCollection value) where T : ISerializable
- {
- writer.WriteVarInt(value.Count);
- foreach (T item in value)
- {
- item.Serialize(writer);
- }
- }
-
- ///
- /// Writes a into a .
- ///
- /// The for writing data.
- /// The to be written.
- /// The fixed size of the .
- public static void WriteFixedString(this BinaryWriter writer, string value, int length)
- {
- if (value == null)
- throw new ArgumentNullException(nameof(value));
- if (value.Length > length)
- throw new ArgumentException(null, nameof(value));
- byte[] bytes = Utility.StrictUTF8.GetBytes(value);
- if (bytes.Length > length)
- throw new ArgumentException(null, nameof(value));
- writer.Write(bytes);
- if (bytes.Length < length)
- writer.Write(stackalloc byte[length - bytes.Length]);
- }
-
- ///
- /// Writes an array into a .
- ///
- /// The type of the array element.
- /// The for writing data.
- /// The array to be written.
- public static void WriteNullableArray(this BinaryWriter writer, T[] value) where T : class, ISerializable
- {
- writer.WriteVarInt(value.Length);
- foreach (var item in value)
- {
- bool isNull = item is null;
- writer.Write(!isNull);
- if (isNull) continue;
- item.Serialize(writer);
- }
- }
-
- ///
- /// Writes a byte array into a .
- ///
- /// The for writing data.
- /// The byte array to be written.
- public static void WriteVarBytes(this BinaryWriter writer, ReadOnlySpan value)
- {
- writer.WriteVarInt(value.Length);
- writer.Write(value);
- }
-
- ///
- /// Writes an integer into a .
- ///
- /// The for writing data.
- /// The integer to be written.
- public static void WriteVarInt(this BinaryWriter writer, long value)
- {
- if (value < 0)
- throw new ArgumentOutOfRangeException(nameof(value));
- if (value < 0xFD)
- {
- writer.Write((byte)value);
- }
- else if (value <= 0xFFFF)
- {
- writer.Write((byte)0xFD);
- writer.Write((ushort)value);
- }
- else if (value <= 0xFFFFFFFF)
- {
- writer.Write((byte)0xFE);
- writer.Write((uint)value);
- }
- else
- {
- writer.Write((byte)0xFF);
- writer.Write(value);
- }
- }
-
- ///
- /// Writes a into a .
- ///
- /// The for writing data.
- /// The to be written.
- public static void WriteVarString(this BinaryWriter writer, string value)
- {
- writer.WriteVarBytes(Utility.StrictUTF8.GetBytes(value));
- }
- }
-}
diff --git a/src/Neo/Network/P2P/Helper.cs b/src/Neo/Network/P2P/Helper.cs
index f171a7b0a3..ffbbc6a702 100644
--- a/src/Neo/Network/P2P/Helper.cs
+++ b/src/Neo/Network/P2P/Helper.cs
@@ -10,7 +10,7 @@
// modifications are permitted.
using Neo.Cryptography;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Network.P2P.Payloads;
using System.IO;
diff --git a/src/Neo/Network/P2P/Payloads/Conditions/CalledByContractCondition.cs b/src/Neo/Network/P2P/Payloads/Conditions/CalledByContractCondition.cs
index b27c66931d..12dc13df6f 100644
--- a/src/Neo/Network/P2P/Payloads/Conditions/CalledByContractCondition.cs
+++ b/src/Neo/Network/P2P/Payloads/Conditions/CalledByContractCondition.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.SmartContract;
diff --git a/src/Neo/Network/P2P/Payloads/Conditions/CalledByGroupCondition.cs b/src/Neo/Network/P2P/Payloads/Conditions/CalledByGroupCondition.cs
index 652eabd105..33ad9c2a03 100644
--- a/src/Neo/Network/P2P/Payloads/Conditions/CalledByGroupCondition.cs
+++ b/src/Neo/Network/P2P/Payloads/Conditions/CalledByGroupCondition.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.SmartContract;
diff --git a/src/Neo/Network/P2P/Payloads/Conditions/GroupCondition.cs b/src/Neo/Network/P2P/Payloads/Conditions/GroupCondition.cs
index be26fc0863..383eb30d9f 100644
--- a/src/Neo/Network/P2P/Payloads/Conditions/GroupCondition.cs
+++ b/src/Neo/Network/P2P/Payloads/Conditions/GroupCondition.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.SmartContract;
diff --git a/src/Neo/Network/P2P/Payloads/Conditions/NotCondition.cs b/src/Neo/Network/P2P/Payloads/Conditions/NotCondition.cs
index 74ab01d21b..6e594beb90 100644
--- a/src/Neo/Network/P2P/Payloads/Conditions/NotCondition.cs
+++ b/src/Neo/Network/P2P/Payloads/Conditions/NotCondition.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.SmartContract;
diff --git a/src/Neo/Network/P2P/Payloads/Conditions/ScriptHashCondition.cs b/src/Neo/Network/P2P/Payloads/Conditions/ScriptHashCondition.cs
index 5d648efbc0..ca757e3515 100644
--- a/src/Neo/Network/P2P/Payloads/Conditions/ScriptHashCondition.cs
+++ b/src/Neo/Network/P2P/Payloads/Conditions/ScriptHashCondition.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.SmartContract;
diff --git a/src/Neo/Network/P2P/Payloads/Conflicts.cs b/src/Neo/Network/P2P/Payloads/Conflicts.cs
index 082de2014d..a876468828 100644
--- a/src/Neo/Network/P2P/Payloads/Conflicts.cs
+++ b/src/Neo/Network/P2P/Payloads/Conflicts.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Persistence;
diff --git a/src/Neo/Network/P2P/Payloads/GetBlocksPayload.cs b/src/Neo/Network/P2P/Payloads/GetBlocksPayload.cs
index d12c8ae2cd..ccff8206c2 100644
--- a/src/Neo/Network/P2P/Payloads/GetBlocksPayload.cs
+++ b/src/Neo/Network/P2P/Payloads/GetBlocksPayload.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using System;
using System.IO;
diff --git a/src/Neo/Network/P2P/Payloads/Header.cs b/src/Neo/Network/P2P/Payloads/Header.cs
index 9e1d77fb8a..8b3eda0e28 100644
--- a/src/Neo/Network/P2P/Payloads/Header.cs
+++ b/src/Neo/Network/P2P/Payloads/Header.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Ledger;
diff --git a/src/Neo/Network/P2P/Payloads/WitnessRule.cs b/src/Neo/Network/P2P/Payloads/WitnessRule.cs
index 8552f0798e..07bd786c26 100644
--- a/src/Neo/Network/P2P/Payloads/WitnessRule.cs
+++ b/src/Neo/Network/P2P/Payloads/WitnessRule.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P.Payloads.Conditions;
diff --git a/src/Neo/Network/P2P/RemoteNode.cs b/src/Neo/Network/P2P/RemoteNode.cs
index a4bf0cc089..e570afeb13 100644
--- a/src/Neo/Network/P2P/RemoteNode.cs
+++ b/src/Neo/Network/P2P/RemoteNode.cs
@@ -13,6 +13,7 @@
using Akka.Configuration;
using Akka.IO;
using Neo.Cryptography;
+using Neo.Extensions;
using Neo.IO;
using Neo.IO.Actors;
using Neo.IO.Caching;
diff --git a/src/Neo/Persistence/SnapshotCache.cs b/src/Neo/Persistence/SnapshotCache.cs
index 6731e5342f..07afdccfab 100644
--- a/src/Neo/Persistence/SnapshotCache.cs
+++ b/src/Neo/Persistence/SnapshotCache.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.SmartContract;
using System;
using System.Collections.Generic;
diff --git a/src/Neo/Plugins/PluginSettings.cs b/src/Neo/Plugins/PluginSettings.cs
index 66549a390e..64efbfc8f7 100644
--- a/src/Neo/Plugins/PluginSettings.cs
+++ b/src/Neo/Plugins/PluginSettings.cs
@@ -13,21 +13,22 @@
using Org.BouncyCastle.Security;
using System;
-namespace Neo.Plugins;
-
-public abstract class PluginSettings(IConfigurationSection section)
+namespace Neo.Plugins
{
- public UnhandledExceptionPolicy ExceptionPolicy
+ public abstract class PluginSettings(IConfigurationSection section)
{
- get
+ public UnhandledExceptionPolicy ExceptionPolicy
{
- var policyString = section.GetValue(nameof(UnhandledExceptionPolicy), nameof(UnhandledExceptionPolicy.StopNode));
- if (Enum.TryParse(policyString, true, out UnhandledExceptionPolicy policy))
+ get
{
- return policy;
- }
+ var policyString = section.GetValue(nameof(UnhandledExceptionPolicy), nameof(UnhandledExceptionPolicy.StopNode));
+ if (Enum.TryParse(policyString, true, out UnhandledExceptionPolicy policy))
+ {
+ return policy;
+ }
- throw new InvalidParameterException($"{policyString} is not a valid UnhandledExceptionPolicy");
+ throw new InvalidParameterException($"{policyString} is not a valid UnhandledExceptionPolicy");
+ }
}
}
}
diff --git a/src/Neo/SmartContract/ApplicationEngine.cs b/src/Neo/SmartContract/ApplicationEngine.cs
index 38430f3632..da2c7ba362 100644
--- a/src/Neo/SmartContract/ApplicationEngine.cs
+++ b/src/Neo/SmartContract/ApplicationEngine.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P.Payloads;
diff --git a/src/Neo/SmartContract/BinarySerializer.cs b/src/Neo/SmartContract/BinarySerializer.cs
index b77a998d6e..46b2a644a1 100644
--- a/src/Neo/SmartContract/BinarySerializer.cs
+++ b/src/Neo/SmartContract/BinarySerializer.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.VM;
using Neo.VM.Types;
diff --git a/src/Neo/SmartContract/ContractState.cs b/src/Neo/SmartContract/ContractState.cs
index cd065cb8c3..8acb6504a8 100644
--- a/src/Neo/SmartContract/ContractState.cs
+++ b/src/Neo/SmartContract/ContractState.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Json;
using Neo.SmartContract.Manifest;
using Neo.VM;
diff --git a/src/Neo/SmartContract/Manifest/ContractGroup.cs b/src/Neo/SmartContract/Manifest/ContractGroup.cs
index 8796c0f07a..3b8dc8ef20 100644
--- a/src/Neo/SmartContract/Manifest/ContractGroup.cs
+++ b/src/Neo/SmartContract/Manifest/ContractGroup.cs
@@ -11,7 +11,7 @@
using Neo.Cryptography;
using Neo.Cryptography.ECC;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Json;
using Neo.VM;
using Neo.VM.Types;
diff --git a/src/Neo/SmartContract/Manifest/ContractPermission.cs b/src/Neo/SmartContract/Manifest/ContractPermission.cs
index cf4d5078c5..1888963672 100644
--- a/src/Neo/SmartContract/Manifest/ContractPermission.cs
+++ b/src/Neo/SmartContract/Manifest/ContractPermission.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Json;
using Neo.VM;
using Neo.VM.Types;
diff --git a/src/Neo/SmartContract/Manifest/ContractPermissionDescriptor.cs b/src/Neo/SmartContract/Manifest/ContractPermissionDescriptor.cs
index d950d25c62..6cebaa99ee 100644
--- a/src/Neo/SmartContract/Manifest/ContractPermissionDescriptor.cs
+++ b/src/Neo/SmartContract/Manifest/ContractPermissionDescriptor.cs
@@ -10,7 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.ECC;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Json;
using Neo.VM.Types;
using System;
diff --git a/src/Neo/SmartContract/Native/ContractManagement.cs b/src/Neo/SmartContract/Native/ContractManagement.cs
index 6fefd2d05f..9fb66a063c 100644
--- a/src/Neo/SmartContract/Native/ContractManagement.cs
+++ b/src/Neo/SmartContract/Native/ContractManagement.cs
@@ -11,7 +11,7 @@
#pragma warning disable IDE0051
-using Neo.IO;
+using Neo.Extensions;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
using Neo.SmartContract.Iterators;
diff --git a/src/Neo/SmartContract/Native/FungibleToken.cs b/src/Neo/SmartContract/Native/FungibleToken.cs
index 21de0a5644..ab6ed8f9c0 100644
--- a/src/Neo/SmartContract/Native/FungibleToken.cs
+++ b/src/Neo/SmartContract/Native/FungibleToken.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Persistence;
using Neo.SmartContract.Manifest;
using Neo.VM.Types;
diff --git a/src/Neo/SmartContract/Native/HashIndexState.cs b/src/Neo/SmartContract/Native/HashIndexState.cs
index 4ab7a991cf..16c051e4aa 100644
--- a/src/Neo/SmartContract/Native/HashIndexState.cs
+++ b/src/Neo/SmartContract/Native/HashIndexState.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.VM;
using Neo.VM.Types;
diff --git a/src/Neo/SmartContract/Native/OracleContract.cs b/src/Neo/SmartContract/Native/OracleContract.cs
index 54156a0029..c142b98ce1 100644
--- a/src/Neo/SmartContract/Native/OracleContract.cs
+++ b/src/Neo/SmartContract/Native/OracleContract.cs
@@ -12,7 +12,7 @@
#pragma warning disable IDE0051
using Neo.Cryptography;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
using Neo.VM;
diff --git a/src/Neo/SmartContract/Native/OracleRequest.cs b/src/Neo/SmartContract/Native/OracleRequest.cs
index cd4962b1cb..746fada4e5 100644
--- a/src/Neo/SmartContract/Native/OracleRequest.cs
+++ b/src/Neo/SmartContract/Native/OracleRequest.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.VM;
using Neo.VM.Types;
using Array = Neo.VM.Types.Array;
diff --git a/src/Neo/SmartContract/Native/RoleManagement.cs b/src/Neo/SmartContract/Native/RoleManagement.cs
index e57f3f3e83..b11eeaf0dd 100644
--- a/src/Neo/SmartContract/Native/RoleManagement.cs
+++ b/src/Neo/SmartContract/Native/RoleManagement.cs
@@ -10,7 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.ECC;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Persistence;
using Neo.VM;
using Neo.VM.Types;
diff --git a/src/Neo/SmartContract/NotifyEventArgs.cs b/src/Neo/SmartContract/NotifyEventArgs.cs
index 8d8542bca9..2fe37affb3 100644
--- a/src/Neo/SmartContract/NotifyEventArgs.cs
+++ b/src/Neo/SmartContract/NotifyEventArgs.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Network.P2P.Payloads;
using Neo.VM;
using Neo.VM.Types;
diff --git a/src/Neo/VM/Helper.cs b/src/Neo/VM/Helper.cs
index 6964747473..1060378080 100644
--- a/src/Neo/VM/Helper.cs
+++ b/src/Neo/VM/Helper.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.SmartContract;
diff --git a/src/Plugins/ApplicationLogs/Store/LogStorageStore.cs b/src/Plugins/ApplicationLogs/Store/LogStorageStore.cs
index 147a80034b..433359e261 100644
--- a/src/Plugins/ApplicationLogs/Store/LogStorageStore.cs
+++ b/src/Plugins/ApplicationLogs/Store/LogStorageStore.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Persistence;
using Neo.Plugins.ApplicationLogs.Store.States;
using Neo.SmartContract;
diff --git a/src/Plugins/DBFTPlugin/Consensus/ConsensusContext.cs b/src/Plugins/DBFTPlugin/Consensus/ConsensusContext.cs
index d6a4340544..ef26fc4130 100644
--- a/src/Plugins/DBFTPlugin/Consensus/ConsensusContext.cs
+++ b/src/Plugins/DBFTPlugin/Consensus/ConsensusContext.cs
@@ -11,6 +11,7 @@
using Neo.Cryptography;
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Ledger;
using Neo.Network.P2P.Payloads;
diff --git a/src/Plugins/DBFTPlugin/Messages/PrepareResponse.cs b/src/Plugins/DBFTPlugin/Messages/PrepareResponse.cs
index b4608ff9af..3c49693c69 100644
--- a/src/Plugins/DBFTPlugin/Messages/PrepareResponse.cs
+++ b/src/Plugins/DBFTPlugin/Messages/PrepareResponse.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Plugins.DBFTPlugin.Types;
using System.IO;
diff --git a/src/Plugins/MPTTrie/Cryptography/MPTTrie/Cache.cs b/src/Plugins/MPTTrie/Cryptography/MPTTrie/Cache.cs
index d8baef8529..e832e8994b 100644
--- a/src/Plugins/MPTTrie/Cryptography/MPTTrie/Cache.cs
+++ b/src/Plugins/MPTTrie/Cryptography/MPTTrie/Cache.cs
@@ -9,7 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
-using Neo.IO;
+using Neo.Extensions;
using Neo.Persistence;
using System.Collections.Generic;
using System.IO;
diff --git a/src/Plugins/MPTTrie/Cryptography/MPTTrie/Node.Hash.cs b/src/Plugins/MPTTrie/Cryptography/MPTTrie/Node.Hash.cs
index e0190dd146..dc58535fb3 100644
--- a/src/Plugins/MPTTrie/Cryptography/MPTTrie/Node.Hash.cs
+++ b/src/Plugins/MPTTrie/Cryptography/MPTTrie/Node.Hash.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using System;
using System.IO;
diff --git a/src/Plugins/RpcServer/RpcServer.Node.cs b/src/Plugins/RpcServer/RpcServer.Node.cs
index 23c731d01e..cfc66e932a 100644
--- a/src/Plugins/RpcServer/RpcServer.Node.cs
+++ b/src/Plugins/RpcServer/RpcServer.Node.cs
@@ -10,7 +10,7 @@
// modifications are permitted.
using Akka.Actor;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Json;
using Neo.Ledger;
using Neo.Network.P2P;
diff --git a/src/Plugins/RpcServer/RpcServer.Wallet.cs b/src/Plugins/RpcServer/RpcServer.Wallet.cs
index 25a7333aac..61dd03675b 100644
--- a/src/Plugins/RpcServer/RpcServer.Wallet.cs
+++ b/src/Plugins/RpcServer/RpcServer.Wallet.cs
@@ -10,7 +10,7 @@
// modifications are permitted.
using Akka.Actor;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Json;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
diff --git a/src/Plugins/SQLiteWallet/SQLiteWallet.cs b/src/Plugins/SQLiteWallet/SQLiteWallet.cs
index a4004dcff0..65f86ea8ff 100644
--- a/src/Plugins/SQLiteWallet/SQLiteWallet.cs
+++ b/src/Plugins/SQLiteWallet/SQLiteWallet.cs
@@ -11,7 +11,7 @@
using Microsoft.EntityFrameworkCore;
using Neo.Cryptography;
-using Neo.IO;
+using Neo.Extensions;
using Neo.SmartContract;
using Neo.Wallets.NEP6;
using System.Buffers.Binary;
diff --git a/src/Plugins/StateService/Network/StateRoot.cs b/src/Plugins/StateService/Network/StateRoot.cs
index 5b4e8610f2..7b3b7e9706 100644
--- a/src/Plugins/StateService/Network/StateRoot.cs
+++ b/src/Plugins/StateService/Network/StateRoot.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P;
diff --git a/src/Plugins/StateService/StatePlugin.cs b/src/Plugins/StateService/StatePlugin.cs
index 03dcc55aac..a514f22ce7 100644
--- a/src/Plugins/StateService/StatePlugin.cs
+++ b/src/Plugins/StateService/StatePlugin.cs
@@ -12,8 +12,8 @@
using Akka.Actor;
using Neo.ConsoleService;
using Neo.Cryptography.MPTTrie;
+using Neo.Extensions;
using Neo.IEventHandlers;
-using Neo.IO;
using Neo.Json;
using Neo.Ledger;
using Neo.Network.P2P.Payloads;
diff --git a/src/Plugins/StateService/Storage/StateSnapshot.cs b/src/Plugins/StateService/Storage/StateSnapshot.cs
index 70ec006227..6dc1b323fd 100644
--- a/src/Plugins/StateService/Storage/StateSnapshot.cs
+++ b/src/Plugins/StateService/Storage/StateSnapshot.cs
@@ -10,7 +10,7 @@
// modifications are permitted.
using Neo.Cryptography.MPTTrie;
-using Neo.IO;
+using Neo.Extensions;
using Neo.Persistence;
using Neo.Plugins.StateService.Network;
using System;
diff --git a/src/Plugins/StorageDumper/StorageDumper.cs b/src/Plugins/StorageDumper/StorageDumper.cs
index 6f5498b3a2..184b6f61ac 100644
--- a/src/Plugins/StorageDumper/StorageDumper.cs
+++ b/src/Plugins/StorageDumper/StorageDumper.cs
@@ -10,8 +10,8 @@
// modifications are permitted.
using Neo.ConsoleService;
+using Neo.Extensions;
using Neo.IEventHandlers;
-using Neo.IO;
using Neo.Json;
using Neo.Ledger;
using Neo.Network.P2P.Payloads;
diff --git a/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11BalanceKey.cs b/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11BalanceKey.cs
index 1f375f33d9..2965985653 100644
--- a/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11BalanceKey.cs
+++ b/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11BalanceKey.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.VM.Types;
using System;
diff --git a/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11TransferKey.cs b/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11TransferKey.cs
index 5c999e8e00..9248267785 100644
--- a/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11TransferKey.cs
+++ b/src/Plugins/TokensTracker/Trackers/NEP-11/Nep11TransferKey.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.VM.Types;
using System;
diff --git a/src/Plugins/TokensTracker/Trackers/NEP-17/Nep17BalanceKey.cs b/src/Plugins/TokensTracker/Trackers/NEP-17/Nep17BalanceKey.cs
index bbceabec2b..817d789e5c 100644
--- a/src/Plugins/TokensTracker/Trackers/NEP-17/Nep17BalanceKey.cs
+++ b/src/Plugins/TokensTracker/Trackers/NEP-17/Nep17BalanceKey.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using System;
using System.IO;
diff --git a/src/Plugins/TokensTracker/Trackers/TokenBalance.cs b/src/Plugins/TokensTracker/Trackers/TokenBalance.cs
index f54a7c9856..a171fa40d7 100644
--- a/src/Plugins/TokensTracker/Trackers/TokenBalance.cs
+++ b/src/Plugins/TokensTracker/Trackers/TokenBalance.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using System.IO;
using System.Numerics;
diff --git a/src/Plugins/TokensTracker/Trackers/TokenTransfer.cs b/src/Plugins/TokensTracker/Trackers/TokenTransfer.cs
index 0a221850fc..9bb389b516 100644
--- a/src/Plugins/TokensTracker/Trackers/TokenTransfer.cs
+++ b/src/Plugins/TokensTracker/Trackers/TokenTransfer.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using System.IO;
using System.Numerics;
diff --git a/src/Plugins/TokensTracker/Trackers/TokenTransferKey.cs b/src/Plugins/TokensTracker/Trackers/TokenTransferKey.cs
index 252eb20af0..3c59131749 100644
--- a/src/Plugins/TokensTracker/Trackers/TokenTransferKey.cs
+++ b/src/Plugins/TokensTracker/Trackers/TokenTransferKey.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using System;
using System.Buffers.Binary;
diff --git a/src/Plugins/TokensTracker/Trackers/TrackerBase.cs b/src/Plugins/TokensTracker/Trackers/TrackerBase.cs
index 471362b019..40009e6d85 100644
--- a/src/Plugins/TokensTracker/Trackers/TrackerBase.cs
+++ b/src/Plugins/TokensTracker/Trackers/TrackerBase.cs
@@ -9,6 +9,7 @@
// Redistribution and use in source and binary forms with or without
// modifications are permitted.
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Ledger;
diff --git a/tests/Neo.Extensions.Tests/UT_StringExtensions.cs b/tests/Neo.Extensions.Tests/UT_StringExtensions.cs
index 6e823d2493..05e5388dfa 100644
--- a/tests/Neo.Extensions.Tests/UT_StringExtensions.cs
+++ b/tests/Neo.Extensions.Tests/UT_StringExtensions.cs
@@ -42,5 +42,156 @@ public void TestGetVarSizeString()
int result = "AA".GetVarSize();
Assert.AreEqual(3, result);
}
+
+ [TestMethod]
+ public void TestGetVarSizeInt()
+ {
+ for (int i = 0; i < 3; i++)
+ {
+ if (i == 0)
+ {
+ int result = UnsafeData.GetVarSize(1);
+ Assert.AreEqual(1, result);
+ }
+ else if (i == 1)
+ {
+ int result = UnsafeData.GetVarSize(0xFFFF);
+ Assert.AreEqual(3, result);
+ }
+ else
+ {
+ int result = UnsafeData.GetVarSize(0xFFFFFF);
+ Assert.AreEqual(5, result);
+ }
+ }
+ }
+
+ [TestMethod]
+ public void TestGetVarSizeGeneric()
+ {
+ for (int i = 0; i < 9; i++)
+ {
+ if (i == 0)
+ {
+ int result = new UInt160[] { UInt160.Zero }.GetVarSize();
+ Assert.AreEqual(21, result);
+ }
+ else if (i == 1)//sbyte
+ {
+ List initList = new()
+ {
+ TestEnum0.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(2, result);
+ }
+ else if (i == 2)//byte
+ {
+ List initList = new()
+ {
+ TestEnum1.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(2, result);
+ }
+ else if (i == 3)//short
+ {
+ List initList = new()
+ {
+ TestEnum2.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(3, result);
+ }
+ else if (i == 4)//ushort
+ {
+ List initList = new()
+ {
+ TestEnum3.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(3, result);
+ }
+ else if (i == 5)//int
+ {
+ List initList = new()
+ {
+ TestEnum4.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(5, result);
+ }
+ else if (i == 6)//uint
+ {
+ List initList = new()
+ {
+ TestEnum5.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(5, result);
+ }
+ else if (i == 7)//long
+ {
+ List initList = new()
+ {
+ TestEnum6.case1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(9, result);
+ }
+ else if (i == 8)
+ {
+ List initList = new()
+ {
+ 1
+ };
+ IReadOnlyCollection testList = initList.AsReadOnly();
+ int result = testList.GetVarSize();
+ Assert.AreEqual(5, result);
+ }
+ }
+ }
+
+ enum TestEnum0 : sbyte
+ {
+ case1 = 1, case2 = 2
+ }
+
+ enum TestEnum1 : byte
+ {
+ case1 = 1, case2 = 2
+ }
+
+ enum TestEnum2 : short
+ {
+ case1 = 1, case2 = 2
+ }
+
+ enum TestEnum3 : ushort
+ {
+ case1 = 1, case2 = 2
+ }
+
+ enum TestEnum4 : int
+ {
+ case1 = 1, case2 = 2
+ }
+
+ enum TestEnum5 : uint
+ {
+ case1 = 1, case2 = 2
+ }
+
+ enum TestEnum6 : long
+ {
+ case1 = 1, case2 = 2
+ }
}
}
diff --git a/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs b/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs
index b87960e76d..e0c4751bac 100644
--- a/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs
+++ b/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs
@@ -13,6 +13,7 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Moq.Protected;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P.Payloads;
diff --git a/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs b/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs
index f7e2e2bdad..59671cd43b 100644
--- a/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs
+++ b/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs
@@ -13,6 +13,7 @@
using Akka.Util;
using Microsoft.AspNetCore.Authorization;
using Neo.Cryptography;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Ledger;
diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs
index b04b5e33d4..4a42d084d1 100644
--- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs
+++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs
@@ -14,6 +14,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Ledger;
diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs
index 042bde0d30..c4ab013021 100644
--- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs
+++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs
@@ -12,6 +12,7 @@
using Akka.Actor;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P;
diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs
index 9a8b87da9a..8946d140ff 100644
--- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs
+++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs
@@ -14,6 +14,7 @@
using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P.Payloads;
@@ -30,205 +31,207 @@
using System.Text;
using System.Threading;
-namespace Neo.Plugins.RpcServer.Tests;
-
-public partial class UT_RpcServer
+namespace Neo.Plugins.RpcServer.Tests
{
- static readonly string NeoTotalSupplyScript = "wh8MC3RvdGFsU3VwcGx5DBT1Y\u002BpAvCg9TQ4FxI6jBbPyoHNA70FifVtS";
- static readonly string NeoTransferScript = "CxEMFPlu76Cuc\u002BbgteStE4ozsOWTNUdrDBQtYNweHko3YcnMFOes3ceblcI/lRTAHwwIdHJhbnNmZXIMFPVj6kC8KD1NDgXEjqMFs/Kgc0DvQWJ9W1I=";
- static readonly UInt160 ValidatorScriptHash = Contract
- .CreateSignatureRedeemScript(TestProtocolSettings.SoleNode.StandbyCommittee[0])
- .ToScriptHash();
- static readonly string ValidatorAddress = ValidatorScriptHash.ToAddress(ProtocolSettings.Default.AddressVersion);
- static readonly UInt160 MultisigScriptHash = Contract
- .CreateMultiSigRedeemScript(1, TestProtocolSettings.SoleNode.StandbyCommittee)
- .ToScriptHash();
- static readonly string MultisigAddress = MultisigScriptHash.ToAddress(ProtocolSettings.Default.AddressVersion);
-
- static readonly JArray validatorSigner = [new JObject()
- {
- ["account"] = ValidatorScriptHash.ToString(),
- ["scopes"] = nameof(WitnessScope.CalledByEntry),
- ["allowedcontracts"] = new JArray([NeoToken.NEO.Hash.ToString(), GasToken.GAS.Hash.ToString()]),
- ["allowedgroups"] = new JArray([TestProtocolSettings.SoleNode.StandbyCommittee[0].ToString()]),
- ["rules"] = new JArray([new JObject() { ["action"] = nameof(WitnessRuleAction.Allow), ["condition"] = new JObject { ["type"] = nameof(WitnessConditionType.CalledByEntry) } }]),
- }];
- static readonly JArray multisigSigner = [new JObject()
- {
- ["account"] = MultisigScriptHash.ToString(),
- ["scopes"] = nameof(WitnessScope.CalledByEntry),
- }];
-
- [TestMethod]
- public void TestInvokeFunction()
+ public partial class UT_RpcServer
{
- _rpcServer.wallet = _wallet;
-
- JObject resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "totalSupply", new JArray([]), validatorSigner, true));
- Assert.AreEqual(resp.Count, 8);
- Assert.AreEqual(resp["script"], NeoTotalSupplyScript);
- Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
- Assert.IsTrue(resp.ContainsProperty("diagnostics"));
- Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], NeoToken.NEO.Hash.ToString());
- Assert.IsTrue(((JArray)resp["diagnostics"]["storagechanges"]).Count == 0);
- Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
- Assert.AreEqual(resp["exception"], null);
- Assert.AreEqual(((JArray)resp["notifications"]).Count, 0);
- Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.Integer));
- Assert.AreEqual(resp["stack"][0]["value"], "100000000");
- Assert.IsTrue(resp.ContainsProperty("tx"));
-
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "symbol"));
- Assert.AreEqual(resp.Count, 6);
- Assert.IsTrue(resp.ContainsProperty("script"));
- Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
- Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
- Assert.AreEqual(resp["exception"], null);
- Assert.AreEqual(((JArray)resp["notifications"]).Count, 0);
- Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.ByteString));
- Assert.AreEqual(resp["stack"][0]["value"], Convert.ToBase64String(Encoding.UTF8.GetBytes("NEO")));
-
- // This call triggers not only NEO but also unclaimed GAS
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "transfer", new JArray([
- new JObject() { ["type"] = nameof(ContractParameterType.Hash160), ["value"] = MultisigScriptHash.ToString() },
- new JObject() { ["type"] = nameof(ContractParameterType.Hash160), ["value"] = ValidatorScriptHash.ToString() },
- new JObject() { ["type"] = nameof(ContractParameterType.Integer), ["value"] = "1" },
- new JObject() { ["type"] = nameof(ContractParameterType.Any) },
- ]), multisigSigner, true));
- Assert.AreEqual(resp.Count, 7);
- Assert.AreEqual(resp["script"], NeoTransferScript);
- Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
- Assert.IsTrue(resp.ContainsProperty("diagnostics"));
- Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], NeoToken.NEO.Hash.ToString());
- Assert.IsTrue(((JArray)resp["diagnostics"]["storagechanges"]).Count == 4);
- Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
- Assert.AreEqual(resp["exception"], $"The smart contract or address {MultisigScriptHash} ({MultisigAddress}) is not found. " +
- $"If this is your wallet address and you want to sign a transaction with it, make sure you have opened this wallet.");
- JArray notifications = (JArray)resp["notifications"];
- Assert.AreEqual(notifications.Count, 2);
- Assert.AreEqual(notifications[0]["eventname"].AsString(), "Transfer");
- Assert.AreEqual(notifications[0]["contract"].AsString(), NeoToken.NEO.Hash.ToString());
- Assert.AreEqual(notifications[0]["state"]["value"][2]["value"], "1");
- Assert.AreEqual(notifications[1]["eventname"].AsString(), "Transfer");
- Assert.AreEqual(notifications[1]["contract"].AsString(), GasToken.GAS.Hash.ToString());
- Assert.AreEqual(notifications[1]["state"]["value"][2]["value"], "50000000");
-
- _rpcServer.wallet = null;
- }
-
- [TestMethod]
- public void TestInvokeScript()
- {
- JObject resp = (JObject)_rpcServer.InvokeScript(new JArray(NeoTotalSupplyScript, validatorSigner, true));
- Assert.AreEqual(resp.Count, 7);
- Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
- Assert.IsTrue(resp.ContainsProperty("diagnostics"));
- Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], NeoToken.NEO.Hash.ToString());
- Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
- Assert.AreEqual(resp["exception"], null);
- Assert.AreEqual(((JArray)resp["notifications"]).Count, 0);
- Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.Integer));
- Assert.AreEqual(resp["stack"][0]["value"], "100000000");
-
- resp = (JObject)_rpcServer.InvokeScript(new JArray(NeoTransferScript));
- Assert.AreEqual(resp.Count, 6);
- Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.Boolean));
- Assert.AreEqual(resp["stack"][0]["value"], false);
- }
+ static readonly string NeoTotalSupplyScript = "wh8MC3RvdGFsU3VwcGx5DBT1Y\u002BpAvCg9TQ4FxI6jBbPyoHNA70FifVtS";
+ static readonly string NeoTransferScript = "CxEMFPlu76Cuc\u002BbgteStE4ozsOWTNUdrDBQtYNweHko3YcnMFOes3ceblcI/lRTAHwwIdHJhbnNmZXIMFPVj6kC8KD1NDgXEjqMFs/Kgc0DvQWJ9W1I=";
+ static readonly UInt160 ValidatorScriptHash = Contract
+ .CreateSignatureRedeemScript(TestProtocolSettings.SoleNode.StandbyCommittee[0])
+ .ToScriptHash();
+ static readonly string ValidatorAddress = ValidatorScriptHash.ToAddress(ProtocolSettings.Default.AddressVersion);
+ static readonly UInt160 MultisigScriptHash = Contract
+ .CreateMultiSigRedeemScript(1, TestProtocolSettings.SoleNode.StandbyCommittee)
+ .ToScriptHash();
+ static readonly string MultisigAddress = MultisigScriptHash.ToAddress(ProtocolSettings.Default.AddressVersion);
+
+ static readonly JArray validatorSigner = [new JObject()
+ {
+ ["account"] = ValidatorScriptHash.ToString(),
+ ["scopes"] = nameof(WitnessScope.CalledByEntry),
+ ["allowedcontracts"] = new JArray([NeoToken.NEO.Hash.ToString(), GasToken.GAS.Hash.ToString()]),
+ ["allowedgroups"] = new JArray([TestProtocolSettings.SoleNode.StandbyCommittee[0].ToString()]),
+ ["rules"] = new JArray([new JObject() { ["action"] = nameof(WitnessRuleAction.Allow), ["condition"] = new JObject { ["type"] = nameof(WitnessConditionType.CalledByEntry) } }]),
+ }];
+ static readonly JArray multisigSigner = [new JObject()
+ {
+ ["account"] = MultisigScriptHash.ToString(),
+ ["scopes"] = nameof(WitnessScope.CalledByEntry),
+ }];
- [TestMethod]
- public void TestTraverseIterator()
- {
- // GetAllCandidates that should return 0 candidates
- JObject resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
- string sessionId = resp["session"].AsString();
- string iteratorId = resp["stack"][0]["id"].AsString();
- JArray respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]);
- Assert.AreEqual(respArray.Count, 0);
- _rpcServer.TerminateSession([sessionId]);
- Assert.ThrowsException(() => (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]), "Unknown session");
-
- // register candidate in snapshot
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "registerCandidate",
- new JArray([new JObject()
+ [TestMethod]
+ public void TestInvokeFunction()
+ {
+ _rpcServer.wallet = _wallet;
+
+ JObject resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "totalSupply", new JArray([]), validatorSigner, true));
+ Assert.AreEqual(resp.Count, 8);
+ Assert.AreEqual(resp["script"], NeoTotalSupplyScript);
+ Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
+ Assert.IsTrue(resp.ContainsProperty("diagnostics"));
+ Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], NeoToken.NEO.Hash.ToString());
+ Assert.IsTrue(((JArray)resp["diagnostics"]["storagechanges"]).Count == 0);
+ Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
+ Assert.AreEqual(resp["exception"], null);
+ Assert.AreEqual(((JArray)resp["notifications"]).Count, 0);
+ Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.Integer));
+ Assert.AreEqual(resp["stack"][0]["value"], "100000000");
+ Assert.IsTrue(resp.ContainsProperty("tx"));
+
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "symbol"));
+ Assert.AreEqual(resp.Count, 6);
+ Assert.IsTrue(resp.ContainsProperty("script"));
+ Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
+ Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
+ Assert.AreEqual(resp["exception"], null);
+ Assert.AreEqual(((JArray)resp["notifications"]).Count, 0);
+ Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.ByteString));
+ Assert.AreEqual(resp["stack"][0]["value"], Convert.ToBase64String(Encoding.UTF8.GetBytes("NEO")));
+
+ // This call triggers not only NEO but also unclaimed GAS
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "transfer", new JArray([
+ new JObject() { ["type"] = nameof(ContractParameterType.Hash160), ["value"] = MultisigScriptHash.ToString() },
+ new JObject() { ["type"] = nameof(ContractParameterType.Hash160), ["value"] = ValidatorScriptHash.ToString() },
+ new JObject() { ["type"] = nameof(ContractParameterType.Integer), ["value"] = "1" },
+ new JObject() { ["type"] = nameof(ContractParameterType.Any) },
+ ]), multisigSigner, true));
+ Assert.AreEqual(resp.Count, 7);
+ Assert.AreEqual(resp["script"], NeoTransferScript);
+ Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
+ Assert.IsTrue(resp.ContainsProperty("diagnostics"));
+ Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], NeoToken.NEO.Hash.ToString());
+ Assert.IsTrue(((JArray)resp["diagnostics"]["storagechanges"]).Count == 4);
+ Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
+ Assert.AreEqual(resp["exception"], $"The smart contract or address {MultisigScriptHash} ({MultisigAddress}) is not found. " +
+ $"If this is your wallet address and you want to sign a transaction with it, make sure you have opened this wallet.");
+ JArray notifications = (JArray)resp["notifications"];
+ Assert.AreEqual(notifications.Count, 2);
+ Assert.AreEqual(notifications[0]["eventname"].AsString(), "Transfer");
+ Assert.AreEqual(notifications[0]["contract"].AsString(), NeoToken.NEO.Hash.ToString());
+ Assert.AreEqual(notifications[0]["state"]["value"][2]["value"], "1");
+ Assert.AreEqual(notifications[1]["eventname"].AsString(), "Transfer");
+ Assert.AreEqual(notifications[1]["contract"].AsString(), GasToken.GAS.Hash.ToString());
+ Assert.AreEqual(notifications[1]["state"]["value"][2]["value"], "50000000");
+
+ _rpcServer.wallet = null;
+ }
+
+ [TestMethod]
+ public void TestInvokeScript()
+ {
+ JObject resp = (JObject)_rpcServer.InvokeScript(new JArray(NeoTotalSupplyScript, validatorSigner, true));
+ Assert.AreEqual(resp.Count, 7);
+ Assert.IsTrue(resp.ContainsProperty("gasconsumed"));
+ Assert.IsTrue(resp.ContainsProperty("diagnostics"));
+ Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], NeoToken.NEO.Hash.ToString());
+ Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
+ Assert.AreEqual(resp["exception"], null);
+ Assert.AreEqual(((JArray)resp["notifications"]).Count, 0);
+ Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.Integer));
+ Assert.AreEqual(resp["stack"][0]["value"], "100000000");
+
+ resp = (JObject)_rpcServer.InvokeScript(new JArray(NeoTransferScript));
+ Assert.AreEqual(resp.Count, 6);
+ Assert.AreEqual(resp["stack"][0]["type"], nameof(Neo.VM.Types.Boolean));
+ Assert.AreEqual(resp["stack"][0]["value"], false);
+ }
+
+ [TestMethod]
+ public void TestTraverseIterator()
+ {
+ // GetAllCandidates that should return 0 candidates
+ JObject resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
+ string sessionId = resp["session"].AsString();
+ string iteratorId = resp["stack"][0]["id"].AsString();
+ JArray respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]);
+ Assert.AreEqual(respArray.Count, 0);
+ _rpcServer.TerminateSession([sessionId]);
+ Assert.ThrowsException(() => (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]), "Unknown session");
+
+ // register candidate in snapshot
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "registerCandidate",
+ new JArray([new JObject()
+ {
+ ["type"] = nameof(ContractParameterType.PublicKey),
+ ["value"] = TestProtocolSettings.SoleNode.StandbyCommittee[0].ToString(),
+ }]), validatorSigner, true));
+ Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
+ SnapshotCache snapshot = _neoSystem.GetSnapshotCache();
+ Transaction? tx = new Transaction
{
- ["type"] = nameof(ContractParameterType.PublicKey),
- ["value"] = TestProtocolSettings.SoleNode.StandbyCommittee[0].ToString(),
- }]), validatorSigner, true));
- Assert.AreEqual(resp["state"], nameof(VM.VMState.HALT));
- SnapshotCache snapshot = _neoSystem.GetSnapshotCache();
- Transaction? tx = new Transaction
+ Nonce = 233,
+ ValidUntilBlock = NativeContract.Ledger.CurrentIndex(snapshot) + _neoSystem.Settings.MaxValidUntilBlockIncrement,
+ Signers = [new Signer() { Account = ValidatorScriptHash, Scopes = WitnessScope.CalledByEntry }],
+ Attributes = Array.Empty(),
+ Script = Convert.FromBase64String(resp["script"].AsString()),
+ Witnesses = null,
+ };
+ ApplicationEngine engine = ApplicationEngine.Run(tx.Script, snapshot, container: tx, settings: _neoSystem.Settings, gas: 1200_0000_0000);
+ engine.SnapshotCache.Commit();
+
+ // GetAllCandidates that should return 1 candidate
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
+ sessionId = resp["session"].AsString();
+ iteratorId = resp["stack"][0]["id"].AsString();
+ respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]);
+ Assert.AreEqual(respArray.Count, 1);
+ Assert.AreEqual(respArray[0]["type"], nameof(Neo.VM.Types.Struct));
+ JArray value = (JArray)respArray[0]["value"];
+ Assert.AreEqual(value.Count, 2);
+ Assert.AreEqual(value[0]["type"], nameof(Neo.VM.Types.ByteString));
+ Assert.AreEqual(value[0]["value"], Convert.ToBase64String(TestProtocolSettings.SoleNode.StandbyCommittee[0].ToArray()));
+ Assert.AreEqual(value[1]["type"], nameof(Neo.VM.Types.Integer));
+ Assert.AreEqual(value[1]["value"], "0");
+
+ // No result when traversed again
+ respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]);
+ Assert.AreEqual(respArray.Count, 0);
+
+ // GetAllCandidates again
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
+ sessionId = resp["session"].AsString();
+ iteratorId = resp["stack"][0]["id"].AsString();
+
+ // Insufficient result count limit
+ respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 0]);
+ Assert.AreEqual(respArray.Count, 0);
+ respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 1]);
+ Assert.AreEqual(respArray.Count, 1);
+ respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 1]);
+ Assert.AreEqual(respArray.Count, 0);
+
+ // Mocking session timeout
+ Thread.Sleep((int)_rpcServerSettings.SessionExpirationTime.TotalMilliseconds + 1);
+ // build another session that did not expire
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
+ string notExpiredSessionId = resp["session"].AsString();
+ string notExpiredIteratorId = resp["stack"][0]["id"].AsString();
+ _rpcServer.OnTimer(new object());
+ Assert.ThrowsException(() => (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]), "Unknown session");
+ // If you want to run the following line without exception,
+ // DO NOT BREAK IN THE DEBUGGER, because the session expires quickly
+ respArray = (JArray)_rpcServer.TraverseIterator([notExpiredSessionId, notExpiredIteratorId, 1]);
+ Assert.AreEqual(respArray.Count, 1);
+
+ // Mocking disposal
+ resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
+ sessionId = resp["session"].AsString();
+ iteratorId = resp["stack"][0]["id"].AsString();
+ _rpcServer.Dispose_SmartContract();
+ Assert.ThrowsException(() => (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]), "Unknown session");
+ }
+
+ [TestMethod]
+ public void TestGetUnclaimedGas()
{
- Nonce = 233,
- ValidUntilBlock = NativeContract.Ledger.CurrentIndex(snapshot) + _neoSystem.Settings.MaxValidUntilBlockIncrement,
- Signers = [new Signer() { Account = ValidatorScriptHash, Scopes = WitnessScope.CalledByEntry }],
- Attributes = Array.Empty(),
- Script = Convert.FromBase64String(resp["script"].AsString()),
- Witnesses = null,
- };
- ApplicationEngine engine = ApplicationEngine.Run(tx.Script, snapshot, container: tx, settings: _neoSystem.Settings, gas: 1200_0000_0000);
- engine.SnapshotCache.Commit();
-
- // GetAllCandidates that should return 1 candidate
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
- sessionId = resp["session"].AsString();
- iteratorId = resp["stack"][0]["id"].AsString();
- respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]);
- Assert.AreEqual(respArray.Count, 1);
- Assert.AreEqual(respArray[0]["type"], nameof(Neo.VM.Types.Struct));
- JArray value = (JArray)respArray[0]["value"];
- Assert.AreEqual(value.Count, 2);
- Assert.AreEqual(value[0]["type"], nameof(Neo.VM.Types.ByteString));
- Assert.AreEqual(value[0]["value"], Convert.ToBase64String(TestProtocolSettings.SoleNode.StandbyCommittee[0].ToArray()));
- Assert.AreEqual(value[1]["type"], nameof(Neo.VM.Types.Integer));
- Assert.AreEqual(value[1]["value"], "0");
-
- // No result when traversed again
- respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]);
- Assert.AreEqual(respArray.Count, 0);
-
- // GetAllCandidates again
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
- sessionId = resp["session"].AsString();
- iteratorId = resp["stack"][0]["id"].AsString();
-
- // Insufficient result count limit
- respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 0]);
- Assert.AreEqual(respArray.Count, 0);
- respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 1]);
- Assert.AreEqual(respArray.Count, 1);
- respArray = (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 1]);
- Assert.AreEqual(respArray.Count, 0);
-
- // Mocking session timeout
- Thread.Sleep((int)_rpcServerSettings.SessionExpirationTime.TotalMilliseconds + 1);
- // build another session that did not expire
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
- string notExpiredSessionId = resp["session"].AsString();
- string notExpiredIteratorId = resp["stack"][0]["id"].AsString();
- _rpcServer.OnTimer(new object());
- Assert.ThrowsException(() => (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]), "Unknown session");
- // If you want to run the following line without exception,
- // DO NOT BREAK IN THE DEBUGGER, because the session expires quickly
- respArray = (JArray)_rpcServer.TraverseIterator([notExpiredSessionId, notExpiredIteratorId, 1]);
- Assert.AreEqual(respArray.Count, 1);
-
- // Mocking disposal
- resp = (JObject)_rpcServer.InvokeFunction(new JArray(NeoToken.NEO.Hash.ToString(), "getAllCandidates", new JArray([]), validatorSigner, true));
- sessionId = resp["session"].AsString();
- iteratorId = resp["stack"][0]["id"].AsString();
- _rpcServer.Dispose_SmartContract();
- Assert.ThrowsException(() => (JArray)_rpcServer.TraverseIterator([sessionId, iteratorId, 100]), "Unknown session");
+ JObject resp = (JObject)_rpcServer.GetUnclaimedGas([MultisigAddress]);
+ Assert.AreEqual(resp["unclaimed"], "50000000");
+ Assert.AreEqual(resp["address"], MultisigAddress);
+ resp = (JObject)_rpcServer.GetUnclaimedGas([ValidatorAddress]);
+ Assert.AreEqual(resp["unclaimed"], "0");
+ Assert.AreEqual(resp["address"], ValidatorAddress);
+ }
}
- [TestMethod]
- public void TestGetUnclaimedGas()
- {
- JObject resp = (JObject)_rpcServer.GetUnclaimedGas([MultisigAddress]);
- Assert.AreEqual(resp["unclaimed"], "50000000");
- Assert.AreEqual(resp["address"], MultisigAddress);
- resp = (JObject)_rpcServer.GetUnclaimedGas([ValidatorAddress]);
- Assert.AreEqual(resp["unclaimed"], "0");
- Assert.AreEqual(resp["address"], ValidatorAddress);
- }
}
diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs
index 0897a12804..80dadff027 100644
--- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs
+++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P.Payloads;
diff --git a/tests/Neo.UnitTests/Cryptography/UT_MerkleTree.cs b/tests/Neo.UnitTests/Cryptography/UT_MerkleTree.cs
index f8a6b19b34..edcea4dd75 100644
--- a/tests/Neo.UnitTests/Cryptography/UT_MerkleTree.cs
+++ b/tests/Neo.UnitTests/Cryptography/UT_MerkleTree.cs
@@ -12,6 +12,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Cryptography;
+using Neo.Extensions;
using Neo.IO;
using System;
using System.Collections;
diff --git a/tests/Neo.UnitTests/Extensions/NativeContractExtensions.cs b/tests/Neo.UnitTests/Extensions/NativeContractExtensions.cs
index c205a7e4bd..10c0f64019 100644
--- a/tests/Neo.UnitTests/Extensions/NativeContractExtensions.cs
+++ b/tests/Neo.UnitTests/Extensions/NativeContractExtensions.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using FluentAssertions;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
diff --git a/tests/Neo.UnitTests/IO/Caching/UT_DataCache.cs b/tests/Neo.UnitTests/IO/Caching/UT_DataCache.cs
index 224b1cc3f6..3c5e8e6e7d 100644
--- a/tests/Neo.UnitTests/IO/Caching/UT_DataCache.cs
+++ b/tests/Neo.UnitTests/IO/Caching/UT_DataCache.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Persistence;
using Neo.SmartContract;
diff --git a/tests/Neo.UnitTests/IO/UT_IOHelper.cs b/tests/Neo.UnitTests/IO/UT_IOHelper.cs
index d9d753e292..514a8daaf5 100644
--- a/tests/Neo.UnitTests/IO/UT_IOHelper.cs
+++ b/tests/Neo.UnitTests/IO/UT_IOHelper.cs
@@ -31,7 +31,7 @@ public void TestAsSerializableGeneric()
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00 };
- UInt160 result = Neo.IO.Helper.AsSerializable(caseArray);
+ UInt160 result = caseArray.AsSerializable();
Assert.AreEqual(UInt160.Zero, result);
}
@@ -44,7 +44,7 @@ public void TestReadFixedBytes()
using (BinaryReader reader = new(new MemoryStream(data), Encoding.UTF8, false))
{
- byte[] result = Neo.IO.Helper.ReadFixedBytes(reader, 3);
+ byte[] result = reader.ReadFixedBytes(3);
Assert.AreEqual("010203", result.ToHexString());
Assert.AreEqual(3, reader.BaseStream.Position);
@@ -54,7 +54,7 @@ public void TestReadFixedBytes()
using (BinaryReader reader = new(new MemoryStream(data), Encoding.UTF8, false))
{
- byte[] result = Neo.IO.Helper.ReadFixedBytes(reader, 4);
+ byte[] result = reader.ReadFixedBytes(4);
Assert.AreEqual("01020304", result.ToHexString());
Assert.AreEqual(4, reader.BaseStream.Position);
@@ -64,7 +64,7 @@ public void TestReadFixedBytes()
using (BinaryReader reader = new(new MemoryStream(data), Encoding.UTF8, false))
{
- Assert.ThrowsException(() => Neo.IO.Helper.ReadFixedBytes(reader, 5));
+ Assert.ThrowsException(() => reader.ReadFixedBytes(5));
Assert.AreEqual(4, reader.BaseStream.Position);
}
}
@@ -87,7 +87,7 @@ public void TestNullableArray()
using (MemoryStream stream = new())
using (BinaryWriter writter = new(stream))
{
- Neo.IO.Helper.WriteNullableArray(writter, caseArray);
+ writter.WriteNullableArray(caseArray);
data = stream.ToArray();
}
@@ -103,14 +103,33 @@ public void TestNullableArray()
// Read 100%
MemoryReader reader = new(data);
- var read = Neo.IO.Helper.ReadNullableArray(ref reader);
+ var read = reader.ReadNullableArray();
CollectionAssert.AreEqual(caseArray, read);
}
[TestMethod]
public void TestAsSerializable()
{
- byte[] caseArray = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
+ byte[] caseArray = [0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00];
ISerializable result = caseArray.AsSerializable();
Assert.AreEqual(UInt160.Zero, result);
}
@@ -119,8 +138,8 @@ public void TestAsSerializable()
public void TestCompression()
{
var data = new byte[] { 1, 2, 3, 4 };
- var byteArray = Neo.IO.Helper.CompressLz4(data);
- var result = Neo.IO.Helper.DecompressLz4(byteArray.Span, byte.MaxValue);
+ var byteArray = data.CompressLz4();
+ var result = byteArray.Span.DecompressLz4(byte.MaxValue);
CollectionAssert.AreEqual(result, data);
@@ -129,29 +148,29 @@ public void TestCompression()
data = new byte[255];
for (int x = 0; x < data.Length; x++) data[x] = 1;
- byteArray = Neo.IO.Helper.CompressLz4(data);
- result = Neo.IO.Helper.DecompressLz4(byteArray.Span, byte.MaxValue);
+ byteArray = data.CompressLz4();
+ result = byteArray.Span.DecompressLz4(byte.MaxValue);
Assert.IsTrue(byteArray.Length < result.Length);
CollectionAssert.AreEqual(result, data);
// Error max length
- Assert.ThrowsException(() => Neo.IO.Helper.DecompressLz4(byteArray.Span, byte.MaxValue - 1));
- Assert.ThrowsException(() => Neo.IO.Helper.DecompressLz4(byteArray.Span, -1));
+ Assert.ThrowsException(() => byteArray.Span.DecompressLz4(byte.MaxValue - 1));
+ Assert.ThrowsException(() => byteArray.Span.DecompressLz4(-1));
// Error length
byte[] data_wrong = byteArray.ToArray();
data_wrong[0]++;
- Assert.ThrowsException(() => Neo.IO.Helper.DecompressLz4(data_wrong, byte.MaxValue));
+ Assert.ThrowsException(() => data_wrong.DecompressLz4(byte.MaxValue));
}
[TestMethod]
public void TestAsSerializableArray()
{
byte[] byteArray = new UInt160[] { UInt160.Zero }.ToByteArray();
- UInt160[] result = Neo.IO.Helper.AsSerializableArray(byteArray);
+ UInt160[] result = byteArray.AsSerializableArray();
Assert.AreEqual(1, result.Length);
Assert.AreEqual(UInt160.Zero, result[0]);
}
@@ -161,9 +180,9 @@ public void TestReadSerializable()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.Write(writer, UInt160.Zero);
+ writer.Write(UInt160.Zero);
MemoryReader reader = new(stream.ToArray());
- UInt160 result = Neo.IO.Helper.ReadSerializable(ref reader);
+ UInt160 result = reader.ReadSerializable();
Assert.AreEqual(UInt160.Zero, result);
}
@@ -172,9 +191,9 @@ public void TestReadSerializableArray()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.Write(writer, new UInt160[] { UInt160.Zero });
+ writer.Write(new UInt160[] { UInt160.Zero });
MemoryReader reader = new(stream.ToArray());
- UInt160[] resultArray = Neo.IO.Helper.ReadSerializableArray(ref reader);
+ UInt160[] resultArray = reader.ReadSerializableArray();
Assert.AreEqual(1, resultArray.Length);
Assert.AreEqual(UInt160.Zero, resultArray[0]);
}
@@ -184,10 +203,10 @@ public void TestReadVarBytes()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarBytes(writer, new byte[] { 0xAA, 0xAA });
+ writer.WriteVarBytes(new byte[] { 0xAA, 0xAA });
stream.Seek(0, SeekOrigin.Begin);
BinaryReader reader = new(stream);
- byte[] byteArray = Neo.IO.Helper.ReadVarBytes(reader, 10);
+ byte[] byteArray = reader.ReadVarBytes(10);
Assert.AreEqual(Encoding.Default.GetString(new byte[] { 0xAA, 0xAA }), Encoding.Default.GetString(byteArray));
}
@@ -200,30 +219,30 @@ public void TestReadVarInt()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xFFFF);
+ writer.WriteVarInt(0xFFFF);
stream.Seek(0, SeekOrigin.Begin);
BinaryReader reader = new(stream);
- ulong result = Neo.IO.Helper.ReadVarInt(reader, 0xFFFF);
+ ulong result = reader.ReadVarInt(0xFFFF);
Assert.AreEqual((ulong)0xFFFF, result);
}
else if (i == 1)
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xFFFFFFFF);
+ writer.WriteVarInt(0xFFFFFFFF);
stream.Seek(0, SeekOrigin.Begin);
BinaryReader reader = new(stream);
- ulong result = Neo.IO.Helper.ReadVarInt(reader, 0xFFFFFFFF);
+ ulong result = reader.ReadVarInt(0xFFFFFFFF);
Assert.AreEqual(0xFFFFFFFF, result);
}
else
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xFFFFFFFFFF);
+ writer.WriteVarInt(0xFFFFFFFFFF);
stream.Seek(0, SeekOrigin.Begin);
BinaryReader reader = new(stream);
- Action action = () => Neo.IO.Helper.ReadVarInt(reader, 0xFFFFFFFF);
+ Action action = () => reader.ReadVarInt(0xFFFFFFFF);
action.Should().Throw();
}
}
@@ -232,7 +251,7 @@ public void TestReadVarInt()
[TestMethod]
public void TestToArray()
{
- byte[] byteArray = Neo.IO.Helper.ToArray(UInt160.Zero);
+ byte[] byteArray = UInt160.Zero.ToArray();
Assert.AreEqual(Encoding.Default.GetString(new byte[] { 0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,
@@ -254,7 +273,7 @@ public void TestWrite()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.Write(writer, UInt160.Zero);
+ writer.Write(UInt160.Zero);
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -269,7 +288,7 @@ public void TestWriteGeneric()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.Write(writer, new UInt160[] { UInt160.Zero });
+ writer.Write(new UInt160[] { UInt160.Zero });
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -288,28 +307,28 @@ public void TestWriteFixedString()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Action action = () => Neo.IO.Helper.WriteFixedString(writer, null, 0);
+ Action action = () => writer.WriteFixedString(null, 0);
action.Should().Throw();
}
else if (i == 1)
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Action action = () => Neo.IO.Helper.WriteFixedString(writer, "AA", Encoding.UTF8.GetBytes("AA").Length - 1);
+ Action action = () => writer.WriteFixedString("AA", Encoding.UTF8.GetBytes("AA").Length - 1);
action.Should().Throw();
}
else if (i == 2)
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Action action = () => Neo.IO.Helper.WriteFixedString(writer, "拉拉", Encoding.UTF8.GetBytes("拉拉").Length - 1);
+ Action action = () => writer.WriteFixedString("拉拉", Encoding.UTF8.GetBytes("拉拉").Length - 1);
action.Should().Throw();
}
else if (i == 3)
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteFixedString(writer, "AA", Encoding.UTF8.GetBytes("AA").Length + 1);
+ writer.WriteFixedString("AA", Encoding.UTF8.GetBytes("AA").Length + 1);
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -325,7 +344,7 @@ public void TestWriteVarBytes()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarBytes(writer, new byte[] { 0xAA });
+ writer.WriteVarBytes(new byte[] { 0xAA });
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -341,14 +360,14 @@ public void TestWriteVarInt()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Action action = () => Neo.IO.Helper.WriteVarInt(writer, -1);
+ Action action = () => writer.WriteVarInt(-1);
action.Should().Throw();
}
else if (i == 1)
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xFC);
+ writer.WriteVarInt(0xFC);
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -358,7 +377,7 @@ public void TestWriteVarInt()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xFFFF);
+ writer.WriteVarInt(0xFFFF);
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -369,7 +388,7 @@ public void TestWriteVarInt()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xFFFFFFFF);
+ writer.WriteVarInt(0xFFFFFFFF);
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -380,7 +399,7 @@ public void TestWriteVarInt()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarInt(writer, 0xAEFFFFFFFF);
+ writer.WriteVarInt(0xAEFFFFFFFF);
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
@@ -395,7 +414,7 @@ public void TestWriteVarString()
{
MemoryStream stream = new();
BinaryWriter writer = new(stream);
- Neo.IO.Helper.WriteVarString(writer, "a");
+ writer.WriteVarString("a");
stream.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
diff --git a/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_FullNodeCapability.cs b/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_FullNodeCapability.cs
index c3c5c2c86f..fbb2ca5106 100644
--- a/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_FullNodeCapability.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_FullNodeCapability.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Capabilities;
diff --git a/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_ServerCapability.cs b/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_ServerCapability.cs
index b113d59da7..cb538771dc 100644
--- a/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_ServerCapability.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Capabilities/UT_ServerCapability.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Capabilities;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_AddrPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_AddrPayload.cs
index 6e189ad3ec..1308909d73 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_AddrPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_AddrPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Conflicts.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Conflicts.cs
index a0dac53fbe..219c8cc684 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Conflicts.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Conflicts.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.SmartContract;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_ExtensiblePayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_ExtensiblePayload.cs
index 1a0ad19a9a..28fdcaf068 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_ExtensiblePayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_ExtensiblePayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.SmartContract;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterAddPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterAddPayload.cs
index 76eff8e198..ae5a0e7758 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterAddPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterAddPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterLoadPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterLoadPayload.cs
index f73e9b5595..0661649215 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterLoadPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_FilterLoadPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlockByIndexPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlockByIndexPayload.cs
index 3aa4049d87..5859d974ce 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlockByIndexPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlockByIndexPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlocksPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlocksPayload.cs
index 6752525ac0..ccd4e7aaed 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlocksPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_GetBlocksPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HeadersPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HeadersPayload.cs
index 9ecdd7f5e4..1c11871225 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HeadersPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HeadersPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HighPriorityAttribute.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HighPriorityAttribute.cs
index 09454d298f..0bdb4982c8 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HighPriorityAttribute.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_HighPriorityAttribute.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.SmartContract.Native;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_InvPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_InvPayload.cs
index 4735fddfe1..c799ff8289 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_InvPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_InvPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_MerkleBlockPayload.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_MerkleBlockPayload.cs
index f491d46749..b1849f1332 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_MerkleBlockPayload.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_MerkleBlockPayload.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using System;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_NotValidBefore.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_NotValidBefore.cs
index bff21a4e5e..193f14902d 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_NotValidBefore.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_NotValidBefore.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.SmartContract.Native;
diff --git a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs
index dc910c5142..97bb61a98a 100644
--- a/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs
+++ b/tests/Neo.UnitTests/Network/P2P/Payloads/UT_Transaction.cs
@@ -825,7 +825,7 @@ public void Transaction_Serialize_Deserialize_Simple()
"010000"); // empty witnesses
// try to deserialize
- var tx2 = sTx.AsSerializable();
+ Transaction tx2 = sTx.AsSerializable();
tx2.Version.Should().Be(0x00);
tx2.Nonce.Should().Be(0x01020304);
@@ -887,7 +887,7 @@ public void Transaction_Serialize_Deserialize_DistinctCosigners()
// back to transaction (should fail, due to non-distinct cosigners)
Transaction tx2 = null;
Assert.ThrowsException(() =>
- tx2 = Neo.IO.Helper.AsSerializable(sTx)
+ tx2 = sTx.AsSerializable()
);
Assert.IsNull(tx2);
}
diff --git a/tests/Neo.UnitTests/Network/P2P/UT_Message.cs b/tests/Neo.UnitTests/Network/P2P/UT_Message.cs
index 35f99fc44f..7a43cf89a4 100644
--- a/tests/Neo.UnitTests/Network/P2P/UT_Message.cs
+++ b/tests/Neo.UnitTests/Network/P2P/UT_Message.cs
@@ -12,6 +12,7 @@
using Akka.IO;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P;
using Neo.Network.P2P.Payloads;
diff --git a/tests/Neo.UnitTests/Network/P2P/UT_RemoteNode.cs b/tests/Neo.UnitTests/Network/P2P/UT_RemoteNode.cs
index 9f114e2708..cfa94a3113 100644
--- a/tests/Neo.UnitTests/Network/P2P/UT_RemoteNode.cs
+++ b/tests/Neo.UnitTests/Network/P2P/UT_RemoteNode.cs
@@ -13,6 +13,7 @@
using Akka.TestKit.Xunit2;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P;
using Neo.Network.P2P.Capabilities;
diff --git a/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs b/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs
index 4473ae63a8..07f8740776 100644
--- a/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs
+++ b/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Persistence;
using Neo.SmartContract;
diff --git a/tests/Neo.UnitTests/SmartContract/Native/UT_GasToken.cs b/tests/Neo.UnitTests/SmartContract/Native/UT_GasToken.cs
index a7d087fa86..b6e41c559f 100644
--- a/tests/Neo.UnitTests/SmartContract/Native/UT_GasToken.cs
+++ b/tests/Neo.UnitTests/SmartContract/Native/UT_GasToken.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
diff --git a/tests/Neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs b/tests/Neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs
index 745670977e..d5e6f22800 100644
--- a/tests/Neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs
+++ b/tests/Neo.UnitTests/SmartContract/Native/UT_PolicyContract.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.Persistence;
diff --git a/tests/Neo.UnitTests/SmartContract/UT_MethodToken.cs b/tests/Neo.UnitTests/SmartContract/UT_MethodToken.cs
index 9d687e1053..b6be60cdab 100644
--- a/tests/Neo.UnitTests/SmartContract/UT_MethodToken.cs
+++ b/tests/Neo.UnitTests/SmartContract/UT_MethodToken.cs
@@ -10,6 +10,7 @@
// modifications are permitted.
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.SmartContract;
using System;
diff --git a/tests/Neo.UnitTests/SmartContract/UT_NefFile.cs b/tests/Neo.UnitTests/SmartContract/UT_NefFile.cs
index 40142e93be..b5fb90fe22 100644
--- a/tests/Neo.UnitTests/SmartContract/UT_NefFile.cs
+++ b/tests/Neo.UnitTests/SmartContract/UT_NefFile.cs
@@ -11,6 +11,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Neo.Extensions;
using Neo.IO;
using Neo.SmartContract;
using System;
diff --git a/tests/Neo.UnitTests/SmartContract/UT_Syscalls.cs b/tests/Neo.UnitTests/SmartContract/UT_Syscalls.cs
index a864c5d427..e2f89751c1 100644
--- a/tests/Neo.UnitTests/SmartContract/UT_Syscalls.cs
+++ b/tests/Neo.UnitTests/SmartContract/UT_Syscalls.cs
@@ -12,6 +12,7 @@
using Akka.TestKit.Xunit2;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Network.P2P.Payloads;
using Neo.SmartContract;
diff --git a/tests/Neo.UnitTests/TestUtils.cs b/tests/Neo.UnitTests/TestUtils.cs
index a9ad4d8ff7..3b768940e8 100644
--- a/tests/Neo.UnitTests/TestUtils.cs
+++ b/tests/Neo.UnitTests/TestUtils.cs
@@ -13,6 +13,7 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Cryptography;
using Neo.Cryptography.ECC;
+using Neo.Extensions;
using Neo.IO;
using Neo.Json;
using Neo.Network.P2P.Payloads;
diff --git a/tests/Neo.UnitTests/UT_Helper.cs b/tests/Neo.UnitTests/UT_Helper.cs
index 6cf1605a24..ae446503e6 100644
--- a/tests/Neo.UnitTests/UT_Helper.cs
+++ b/tests/Neo.UnitTests/UT_Helper.cs
@@ -77,5 +77,77 @@ public void TestRemoveHashsetHashSetCache()
CollectionAssert.AreEqual(new int[] { 3 }, a.ToArray());
}
+
+ [TestMethod]
+ public void TestToHexString()
+ {
+ byte[] nullStr = null;
+ Assert.ThrowsException(() => nullStr.ToHexString());
+ byte[] empty = Array.Empty();
+ empty.ToHexString().Should().Be("");
+ empty.ToHexString(false).Should().Be("");
+ empty.ToHexString(true).Should().Be("");
+
+ byte[] str1 = new byte[] { (byte)'n', (byte)'e', (byte)'o' };
+ str1.ToHexString().Should().Be("6e656f");
+ str1.ToHexString(false).Should().Be("6e656f");
+ str1.ToHexString(true).Should().Be("6f656e");
+ }
+
+ [TestMethod]
+ public void TestGetVersion()
+ {
+ // assembly without version
+
+ var asm = AppDomain.CurrentDomain.GetAssemblies()
+ .Where(u => u.FullName == "Anonymously Hosted DynamicMethods Assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")
+ .FirstOrDefault();
+ string version = asm?.GetVersion() ?? "";
+ version.Should().Be("0.0.0");
+ }
+
+ [TestMethod]
+ public void TestToByteArrayStandard()
+ {
+ BigInteger number = BigInteger.Zero;
+ Assert.AreEqual("", number.ToByteArrayStandard().ToHexString());
+
+ number = BigInteger.One;
+ Assert.AreEqual("01", number.ToByteArrayStandard().ToHexString());
+ }
+
+ [TestMethod]
+ public void TestNextBigIntegerForRandom()
+ {
+ Random ran = new();
+ Action action1 = () => ran.NextBigInteger(-1);
+ action1.Should().Throw();
+
+ ran.NextBigInteger(0).Should().Be(0);
+ ran.NextBigInteger(8).Should().NotBeNull();
+ ran.NextBigInteger(9).Should().NotBeNull();
+ }
+
+ [TestMethod]
+ public void TestUnmapForIPAddress()
+ {
+ var addr = new IPAddress(new byte[] { 127, 0, 0, 1 });
+ addr.UnMap().Should().Be(addr);
+
+ var addr2 = addr.MapToIPv6();
+ addr2.UnMap().Should().Be(addr);
+ }
+
+ [TestMethod]
+ public void TestUnmapForIPEndPoin()
+ {
+ var addr = new IPAddress(new byte[] { 127, 0, 0, 1 });
+ var endPoint = new IPEndPoint(addr, 8888);
+ endPoint.UnMap().Should().Be(endPoint);
+
+ var addr2 = addr.MapToIPv6();
+ var endPoint2 = new IPEndPoint(addr2, 8888);
+ endPoint2.UnMap().Should().Be(endPoint);
+ }
}
}
diff --git a/tests/Neo.UnitTests/Wallets/UT_Wallets_Helper.cs b/tests/Neo.UnitTests/Wallets/UT_Wallets_Helper.cs
index 843eeae192..055ea193f7 100644
--- a/tests/Neo.UnitTests/Wallets/UT_Wallets_Helper.cs
+++ b/tests/Neo.UnitTests/Wallets/UT_Wallets_Helper.cs
@@ -12,6 +12,7 @@
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Neo.Cryptography;
+using Neo.Extensions;
using Neo.IO;
using Neo.Wallets;
using System;