From 385e08967c1d0fc1c476b949059d769425d64578 Mon Sep 17 00:00:00 2001 From: Apolixit Date: Tue, 26 Nov 2024 13:16:48 +0100 Subject: [PATCH 1/2] Handle U128 and U256 value when bytes are at the maximum --- .../TypeConverters/PrimitiveTypesTest.cs | 22 +++++++++++++++++++ .../Model/Types/Primitive/U128.cs | 4 ++-- .../Model/Types/Primitive/U256.cs | 4 ++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs b/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs index 6c554e9..4ea956f 100644 --- a/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs +++ b/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs @@ -184,6 +184,19 @@ public void PrimU128Test() Assert.AreEqual(value, primImplicit); } + /// + /// From real use case here : https://mythos.subscan.io/block/2826170?tab=event&event=2826170-189 + /// + [Test] + [TestCase("310789037729451024594500450253905211276")] + public void PrimU128_FromMaxBigIntegerValue_Test(string valueStr) + { + var value = BigInteger.Parse(valueStr); + + var prim = new U128(value); + Assert.That(prim.Value, Is.EqualTo(value)); + } + [Test] public void PrimU128CreateTest() { @@ -213,6 +226,15 @@ public void PrimU128_WithNegativeNumber_ShouldFail() Assert.Throws(() => new U128(number)); } + [Test] + public void PrimU256_MaxValue() + { + BigInteger u256Max = BigInteger.Pow(2, 256) - 1; + var u256 = new U256(u256Max); + + Assert.That(u256.Value, Is.EqualTo(u256Max)); + } + [Test] public void PrimU256Test() { diff --git a/Substrate.NetApi/Model/Types/Primitive/U128.cs b/Substrate.NetApi/Model/Types/Primitive/U128.cs index 51e3ed2..6f30959 100644 --- a/Substrate.NetApi/Model/Types/Primitive/U128.cs +++ b/Substrate.NetApi/Model/Types/Primitive/U128.cs @@ -91,13 +91,13 @@ public override void Create(BigInteger value) var byteArray = value.ToByteArray(); - if (byteArray.Length > TypeSize) + if (byteArray.Length > TypeSize + 1) { throw new NotSupportedException($"Wrong byte array size for {TypeName()}, max. {TypeSize} bytes!"); } var bytes = new byte[TypeSize]; - byteArray.CopyTo(bytes, 0); + Array.Copy(byteArray, 0, bytes, 0, TypeSize); Bytes = bytes; Value = value; } diff --git a/Substrate.NetApi/Model/Types/Primitive/U256.cs b/Substrate.NetApi/Model/Types/Primitive/U256.cs index 633174c..6b1f762 100644 --- a/Substrate.NetApi/Model/Types/Primitive/U256.cs +++ b/Substrate.NetApi/Model/Types/Primitive/U256.cs @@ -93,13 +93,13 @@ public override void Create(BigInteger value) var byteArray = value.ToByteArray(); - if (byteArray.Length > TypeSize) + if (byteArray.Length > TypeSize + 1) { throw new NotSupportedException($"Wrong byte array size for {TypeName()}, max. {TypeSize} bytes!"); } var bytes = new byte[TypeSize]; - byteArray.CopyTo(bytes, 0); + Array.Copy(byteArray, 0, bytes, 0, TypeSize); Bytes = bytes; Value = value; } From 7d1e5a8c188c0a32e8998c26478fb2c6e29a425f Mon Sep 17 00:00:00 2001 From: Apolixit Date: Tue, 26 Nov 2024 17:15:07 +0100 Subject: [PATCH 2/2] Fix implementation --- .../TypeConverters/PrimitiveTypesTest.cs | 7 +++++++ Substrate.NetApi/Model/Types/Primitive/U128.cs | 9 ++++++++- Substrate.NetApi/Model/Types/Primitive/U256.cs | 10 ++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs b/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs index 4ea956f..51ee925 100644 --- a/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs +++ b/Substrate.NetApi.Test/TypeConverters/PrimitiveTypesTest.cs @@ -235,6 +235,13 @@ public void PrimU256_MaxValue() Assert.That(u256.Value, Is.EqualTo(u256Max)); } + [Test] + public void PrimU256_BasicNumberTest() + { + var u256 = new U256(new BigInteger(10)); + Assert.That(u256.Value, Is.EqualTo(new BigInteger(10))); + } + [Test] public void PrimU256Test() { diff --git a/Substrate.NetApi/Model/Types/Primitive/U128.cs b/Substrate.NetApi/Model/Types/Primitive/U128.cs index 6f30959..be8bd2e 100644 --- a/Substrate.NetApi/Model/Types/Primitive/U128.cs +++ b/Substrate.NetApi/Model/Types/Primitive/U128.cs @@ -97,7 +97,14 @@ public override void Create(BigInteger value) } var bytes = new byte[TypeSize]; - Array.Copy(byteArray, 0, bytes, 0, TypeSize); + if (byteArray.Length == TypeSize + 1) + { + Array.Copy(byteArray, 0, bytes, 0, TypeSize); + } + else + { + byteArray.CopyTo(bytes, 0); + } Bytes = bytes; Value = value; } diff --git a/Substrate.NetApi/Model/Types/Primitive/U256.cs b/Substrate.NetApi/Model/Types/Primitive/U256.cs index 6b1f762..efec4a9 100644 --- a/Substrate.NetApi/Model/Types/Primitive/U256.cs +++ b/Substrate.NetApi/Model/Types/Primitive/U256.cs @@ -92,14 +92,20 @@ public override void Create(BigInteger value) throw new InvalidOperationException($"Unable to create a {nameof(U256)} instance while value is negative"); var byteArray = value.ToByteArray(); - + if (byteArray.Length > TypeSize + 1) { throw new NotSupportedException($"Wrong byte array size for {TypeName()}, max. {TypeSize} bytes!"); } var bytes = new byte[TypeSize]; - Array.Copy(byteArray, 0, bytes, 0, TypeSize); + if(byteArray.Length == TypeSize + 1) { + Array.Copy(byteArray, 0, bytes, 0, TypeSize); + } + else { + byteArray.CopyTo(bytes, 0); + } + Bytes = bytes; Value = value; }