diff --git a/src/Neo/Cryptography/Helper.cs b/src/Neo/Cryptography/Helper.cs
index f398612e61..3a89ecba75 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 4ce1e2dc1f..9cccec95cc 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 ac233a156a..d4a3b74800 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 18e94fbc40..6e76309432 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 fd813c7230..c8fd2baf69 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 a9cf1de0e9..cde011c116 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 08ab3911b2..2cdb236402 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/SmartContract/ApplicationEngine.cs b/src/Neo/SmartContract/ApplicationEngine.cs
index 7808baae5e..f8f2332b4e 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 fd95467da1..0a9a106e1f 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 7b270ec81b..d7d4fab9d6 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 5f2ad3c18f..3b204cc53f 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;
diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs
index 801938903a..ad35975352 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;