From 5cbf2abeebaab23f1f708904442a4a759cab1c3b Mon Sep 17 00:00:00 2001 From: David Hernando Date: Wed, 30 Jul 2025 16:43:18 +0200 Subject: [PATCH 1/2] CSDK-258 Added protocol_version_major property to `ByPackageHash` invocation Signed-off-by: David Hernando --- .../Types/TransactionBuilder.cs | 4 ++-- .../Types/TransactionV1Target.cs | 20 ++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Casper.Network.SDK/Types/TransactionBuilder.cs b/Casper.Network.SDK/Types/TransactionBuilder.cs index ac9db51..5585aa4 100644 --- a/Casper.Network.SDK/Types/TransactionBuilder.cs +++ b/Casper.Network.SDK/Types/TransactionBuilder.cs @@ -581,9 +581,9 @@ public ContractCallBuilder ByName(string name) return this; } - public ContractCallBuilder ByPackageHash(string contractHash, UInt32? version = null) + public ContractCallBuilder ByPackageHash(string contractHash, UInt32? version = null, UInt32? protocolVersionMajor = null) { - _invocationTarget = TransactionV1Target.StoredByPackageHash(contractHash, version); + _invocationTarget = TransactionV1Target.StoredByPackageHash(contractHash, version, protocolVersionMajor); return this; } diff --git a/Casper.Network.SDK/Types/TransactionV1Target.cs b/Casper.Network.SDK/Types/TransactionV1Target.cs index ce6ff13..c35418a 100644 --- a/Casper.Network.SDK/Types/TransactionV1Target.cs +++ b/Casper.Network.SDK/Types/TransactionV1Target.cs @@ -55,21 +55,31 @@ public class ByPackageHashInvocationTarget : IInvocationTarget [JsonPropertyName("addr")] public string Hash { get; init; } [JsonPropertyName("version")] public UInt32? Version { get; init; } + + [JsonPropertyName("protocol_version_major")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public UInt32? ProtocolVersionMajor { get; init; } const ushort TAG_FIELD_INDEX = 0; const byte BY_PACKAGE_HASH_VARIANT = 2; const ushort BY_PACKAGE_HASH_ADDR_INDEX = 1; const ushort BY_PACKAGE_HASH_VERSION_INDEX = 2; + const ushort BY_PACKAGE_HASH_PROTOCOL_VERSION_MAJOR_INDEX = 3; public byte[] ToBytes() { - return new CalltableSerialization() + var calltable = new CalltableSerialization() .AddField(TAG_FIELD_INDEX, new byte[] { BY_PACKAGE_HASH_VARIANT }) .AddField(BY_PACKAGE_HASH_ADDR_INDEX, Hex.Decode(Hash)) .AddField(BY_PACKAGE_HASH_VERSION_INDEX, Version.HasValue ? CLValue.Option(CLValue.U32(Version.Value)) - : CLValue.OptionNone(CLType.U32)) - .GetBytes(); + : CLValue.OptionNone(CLType.U32)); + + if (ProtocolVersionMajor.HasValue) + calltable.AddField(BY_PACKAGE_HASH_PROTOCOL_VERSION_MAJOR_INDEX, + CLValue.U32(ProtocolVersionMajor.Value)); + + return calltable.GetBytes(); } } @@ -353,11 +363,11 @@ public static StoredTransactionV1Target StoredByName(string name) }; } - public static StoredTransactionV1Target StoredByPackageHash(string packageHash, UInt32? version = null) + public static StoredTransactionV1Target StoredByPackageHash(string packageHash, UInt32? version = null, UInt32? protocolVersionMajor = null) { return new StoredTransactionV1Target() { - Id = new ByPackageHashInvocationTarget { Hash = packageHash, Version = version }, + Id = new ByPackageHashInvocationTarget { Hash = packageHash, Version = version, ProtocolVersionMajor = protocolVersionMajor }, }; } From 8d898b83cd0ca987f2eb8c76ba6c37ca1361b9b8 Mon Sep 17 00:00:00 2001 From: David Hernando Date: Mon, 1 Sep 2025 13:36:36 +0200 Subject: [PATCH 2/2] Added protocol_version_major to ByName calls. Added tests Signed-off-by: David Hernando --- .../ProtocolVersionMajor.cs | 143 ++++++++++++++++++ .../Types/TransactionBuilder.cs | 8 +- .../Types/TransactionV1Target.cs | 19 ++- 3 files changed, 162 insertions(+), 8 deletions(-) create mode 100644 Casper.Network.SDK.Test/TransactionBuilder/ProtocolVersionMajor.cs diff --git a/Casper.Network.SDK.Test/TransactionBuilder/ProtocolVersionMajor.cs b/Casper.Network.SDK.Test/TransactionBuilder/ProtocolVersionMajor.cs new file mode 100644 index 0000000..839f468 --- /dev/null +++ b/Casper.Network.SDK.Test/TransactionBuilder/ProtocolVersionMajor.cs @@ -0,0 +1,143 @@ +using System.Collections.Generic; +using System.Text.Json; +using Casper.Network.SDK.Types; +using NUnit.Framework; + +namespace NetCasperTest.TransactionBuilder +{ + public class ProtocolVersionMajor + { + [Test] + public void ByPackageHashNoVersionTest() + { + var testKey = KeyPair.CreateNew(KeyAlgo.SECP256K1); + var runtimeArgs = new List(); + + var transaction = new Transaction.ContractCallBuilder() + .From(testKey.PublicKey) + .Payment(2_500_000_000, 2) + .ChainName("chain_name") + .ByPackageHash("0101010101010101010101010101010101010101010101010101010101010101") + .EntryPoint("counter_inc") + .RuntimeArgs(runtimeArgs) + .Build(); + + var txv1 = (TransactionV1)transaction; + var target = txv1.Payload.Target as StoredTransactionV1Target; + var invocationTarget = target.Id as ByPackageHashInvocationTarget; + Assert.AreEqual("0101010101010101010101010101010101010101010101010101010101010101", invocationTarget.Hash); + Assert.AreEqual(null, invocationTarget.Version); + Assert.AreEqual(null, invocationTarget.ProtocolVersionMajor); + } + + [Test] + public void ByPackageHashWithVersionTest() + { + var testKey = KeyPair.CreateNew(KeyAlgo.SECP256K1); + var runtimeArgs = new List(); + + var transaction = new Transaction.ContractCallBuilder() + .From(testKey.PublicKey) + .Payment(2_500_000_000, 2) + .ChainName("chain_name") + .ByPackageHash("0101010101010101010101010101010101010101010101010101010101010101", null, 2) + // .ByPackageName("counter_package_name", 1, 1) + .EntryPoint("counter_inc") + .RuntimeArgs(runtimeArgs) + .Build(); + + var txv1 = (TransactionV1)transaction; + var target = txv1.Payload.Target as StoredTransactionV1Target; + var invocationTarget = target.Id as ByPackageHashInvocationTarget; + Assert.AreEqual("0101010101010101010101010101010101010101010101010101010101010101", invocationTarget.Hash); + Assert.AreEqual(null, invocationTarget.Version); + Assert.AreEqual(2, invocationTarget.ProtocolVersionMajor); + } + + [Test] + public void ByPackageNameNoVersionTest() + { + var testKey = KeyPair.CreateNew(KeyAlgo.SECP256K1); + var runtimeArgs = new List(); + + var transaction = new Transaction.ContractCallBuilder() + .From(testKey.PublicKey) + .Payment(2_500_000_000, 2) + .ChainName("chain_name") + .ByPackageName("counter_package_name") + .EntryPoint("counter_inc") + .RuntimeArgs(runtimeArgs) + .Build(); + + var txv1 = (TransactionV1)transaction; + var target = txv1.Payload.Target as StoredTransactionV1Target; + var invocationTarget = target.Id as ByPackageNameInvocationTarget; + Assert.AreEqual("counter_package_name", invocationTarget.Name); + Assert.AreEqual(null, invocationTarget.Version); + Assert.AreEqual(null, invocationTarget.ProtocolVersionMajor); + } + + [Test] + public void ByPackageNameWithVersionTest() + { + var testKey = KeyPair.CreateNew(KeyAlgo.SECP256K1); + var runtimeArgs = new List(); + + var transaction = new Transaction.ContractCallBuilder() + .From(testKey.PublicKey) + .Payment(2_500_000_000, 2) + .ChainName("chain_name") + .ByPackageName("counter_package_name", 1, 2) + .EntryPoint("counter_inc") + .RuntimeArgs(runtimeArgs) + .Build(); + + var txv1 = (TransactionV1)transaction; + var target = txv1.Payload.Target as StoredTransactionV1Target; + var invocationTarget = target.Id as ByPackageNameInvocationTarget; + Assert.AreEqual("counter_package_name", invocationTarget.Name); + Assert.AreEqual(1, invocationTarget.Version); + Assert.AreEqual(2, invocationTarget.ProtocolVersionMajor); + } + + [Test] + public void ByPackageNameNoVersionJsonTest() + { + var testKey = KeyPair.CreateNew(KeyAlgo.SECP256K1); + var runtimeArgs = new List(); + + var transaction = new Transaction.ContractCallBuilder() + .From(testKey.PublicKey) + .Payment(2_500_000_000, 2) + .ChainName("chain_name") + .ByPackageName("counter_package_name") + .EntryPoint("counter_inc") + .RuntimeArgs(runtimeArgs) + .Build(); + + var json = JsonSerializer.Serialize(transaction); + Assert.IsNotNull(json); + Assert.IsFalse(json.Contains("protocol_version_major")); + } + + [Test] + public void ByPackageNameWithVersionJsonTest() + { + var testKey = KeyPair.CreateNew(KeyAlgo.SECP256K1); + var runtimeArgs = new List(); + + var transaction = new Transaction.ContractCallBuilder() + .From(testKey.PublicKey) + .Payment(2_500_000_000, 2) + .ChainName("chain_name") + .ByPackageName("counter_package_name", 1, 2) + .EntryPoint("counter_inc") + .RuntimeArgs(runtimeArgs) + .Build(); + + var json = JsonSerializer.Serialize(transaction); + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("\"protocol_version_major\":2")); + } + } +} \ No newline at end of file diff --git a/Casper.Network.SDK/Types/TransactionBuilder.cs b/Casper.Network.SDK/Types/TransactionBuilder.cs index 5585aa4..f5edf53 100644 --- a/Casper.Network.SDK/Types/TransactionBuilder.cs +++ b/Casper.Network.SDK/Types/TransactionBuilder.cs @@ -581,15 +581,15 @@ public ContractCallBuilder ByName(string name) return this; } - public ContractCallBuilder ByPackageHash(string contractHash, UInt32? version = null, UInt32? protocolVersionMajor = null) + public ContractCallBuilder ByPackageHash(string contractPackageHash, UInt32? version = null, UInt32? protocolVersionMajor = null) { - _invocationTarget = TransactionV1Target.StoredByPackageHash(contractHash, version, protocolVersionMajor); + _invocationTarget = TransactionV1Target.StoredByPackageHash(contractPackageHash, version, protocolVersionMajor); return this; } - public ContractCallBuilder ByPackageName(string name, UInt32? version = null) + public ContractCallBuilder ByPackageName(string packageName, UInt32? version = null, UInt32? protocolVersionMajor = null) { - _invocationTarget = TransactionV1Target.StoredByPackageName(name, version); + _invocationTarget = TransactionV1Target.StoredByPackageName(packageName, version, protocolVersionMajor); return this; } diff --git a/Casper.Network.SDK/Types/TransactionV1Target.cs b/Casper.Network.SDK/Types/TransactionV1Target.cs index c35418a..089da3f 100644 --- a/Casper.Network.SDK/Types/TransactionV1Target.cs +++ b/Casper.Network.SDK/Types/TransactionV1Target.cs @@ -88,20 +88,31 @@ public class ByPackageNameInvocationTarget : IInvocationTarget [JsonPropertyName("name")] public string Name { get; init; } [JsonPropertyName("version")] public UInt32? Version { get; init; } + + [JsonPropertyName("protocol_version_major")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public UInt32? ProtocolVersionMajor { get; init; } const ushort TAG_FIELD_INDEX = 0; const byte BY_PACKAGE_NAME_VARIANT = 3; const ushort BY_PACKAGE_NAME_NAME_INDEX = 1; const ushort BY_PACKAGE_NAME_VERSION_INDEX = 2; + const ushort BY_PACKAGE_HASH_PROTOCOL_VERSION_MAJOR_INDEX = 3; public byte[] ToBytes() { - return new CalltableSerialization() + var calltable = new CalltableSerialization() .AddField(TAG_FIELD_INDEX, new byte[] { BY_PACKAGE_NAME_VARIANT }) .AddField(BY_PACKAGE_NAME_NAME_INDEX, CLValue.String(Name)) .AddField(BY_PACKAGE_NAME_VERSION_INDEX, Version.HasValue ? CLValue.Option(CLValue.U32(Version.Value)) - : CLValue.OptionNone(CLType.U32)).GetBytes(); + : CLValue.OptionNone(CLType.U32)); + + if (ProtocolVersionMajor.HasValue) + calltable.AddField(BY_PACKAGE_HASH_PROTOCOL_VERSION_MAJOR_INDEX, + CLValue.U32(ProtocolVersionMajor.Value)); + + return calltable.GetBytes(); } } @@ -371,11 +382,11 @@ public static StoredTransactionV1Target StoredByPackageHash(string packageHash, }; } - public static StoredTransactionV1Target StoredByPackageName(string name, UInt32? version = null) + public static StoredTransactionV1Target StoredByPackageName(string name, UInt32? version = null, UInt32? protocolVersionMajor = null) { return new StoredTransactionV1Target() { - Id = new ByPackageNameInvocationTarget() { Name = name, Version = version }, + Id = new ByPackageNameInvocationTarget() { Name = name, Version = version, ProtocolVersionMajor = protocolVersionMajor }, }; }