diff --git a/src/neo/ProtocolSettings.cs b/src/neo/ProtocolSettings.cs index a2673a35c3..4e4cd3decc 100644 --- a/src/neo/ProtocolSettings.cs +++ b/src/neo/ProtocolSettings.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Configuration; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; @@ -16,6 +17,7 @@ public class ProtocolSettings public uint MillisecondsPerBlock { get; } public int MemoryPoolMaxTransactions { get; } public uint MaxTraceableBlocks { get; } + public IReadOnlyDictionary NativeActivations { get; } static ProtocolSettings _default; @@ -96,6 +98,12 @@ private ProtocolSettings(IConfigurationSection section) this.MillisecondsPerBlock = section.GetValue("MillisecondsPerBlock", 15000u); this.MemoryPoolMaxTransactions = Math.Max(1, section.GetValue("MemoryPoolMaxTransactions", 50_000)); this.MaxTraceableBlocks = section.GetValue("MaxTraceableBlocks", 2_102_400u);// 365 days + IConfigurationSection section_na = section.GetSection("NativeActivations"); + if (section_na.Exists()) + this.NativeActivations = section_na.GetChildren().ToDictionary((a) => a.Key, b => uint.Parse(b.Value)); + else + this.NativeActivations = new Dictionary(); + } } } diff --git a/src/neo/SmartContract/Native/DesignateContract.cs b/src/neo/SmartContract/Native/DesignateContract.cs index 3271d74b42..3804c8d9ed 100644 --- a/src/neo/SmartContract/Native/DesignateContract.cs +++ b/src/neo/SmartContract/Native/DesignateContract.cs @@ -17,7 +17,6 @@ namespace Neo.SmartContract.Native public sealed class DesignationContract : NativeContract { public override int Id => -5; - public override uint ActiveBlockIndex => 0; internal DesignationContract() { diff --git a/src/neo/SmartContract/Native/GasToken.cs b/src/neo/SmartContract/Native/GasToken.cs index 490d16fec2..e747ede414 100644 --- a/src/neo/SmartContract/Native/GasToken.cs +++ b/src/neo/SmartContract/Native/GasToken.cs @@ -7,7 +7,6 @@ namespace Neo.SmartContract.Native public sealed class GasToken : Nep17Token { public override int Id => -2; - public override uint ActiveBlockIndex => 0; public override string Symbol => "GAS"; public override byte Decimals => 8; diff --git a/src/neo/SmartContract/Native/ManagementContract.cs b/src/neo/SmartContract/Native/ManagementContract.cs index 578504f719..502157e307 100644 --- a/src/neo/SmartContract/Native/ManagementContract.cs +++ b/src/neo/SmartContract/Native/ManagementContract.cs @@ -15,7 +15,6 @@ namespace Neo.SmartContract.Native public sealed class ManagementContract : NativeContract { public override int Id => 0; - public override uint ActiveBlockIndex => 0; private const byte Prefix_MinimumDeploymentFee = 20; private const byte Prefix_NextAvailableId = 15; diff --git a/src/neo/SmartContract/Native/NativeContract.cs b/src/neo/SmartContract/Native/NativeContract.cs index 0324d12fa9..c23676297d 100644 --- a/src/neo/SmartContract/Native/NativeContract.cs +++ b/src/neo/SmartContract/Native/NativeContract.cs @@ -31,7 +31,7 @@ public abstract class NativeContract public UInt160 Hash { get; } public abstract int Id { get; } public ContractManifest Manifest { get; } - public abstract uint ActiveBlockIndex { get; } + public uint ActiveBlockIndex { get; } protected NativeContract() { @@ -71,6 +71,8 @@ protected NativeContract() Trusts = WildcardContainer.Create(), Extra = null }; + if (ProtocolSettings.Default.NativeActivations.TryGetValue(Name, out uint activationIndex)) + this.ActiveBlockIndex = activationIndex; contractsList.Add(this); contractsNameDictionary.Add(Name, this); contractsHashDictionary.Add(Hash, this); diff --git a/src/neo/SmartContract/Native/NeoToken.cs b/src/neo/SmartContract/Native/NeoToken.cs index f4520acb7d..1a9fac5bf1 100644 --- a/src/neo/SmartContract/Native/NeoToken.cs +++ b/src/neo/SmartContract/Native/NeoToken.cs @@ -18,7 +18,6 @@ namespace Neo.SmartContract.Native public sealed class NeoToken : Nep17Token { public override int Id => -1; - public override uint ActiveBlockIndex => 0; public override string Symbol => "NEO"; public override byte Decimals => 0; public BigInteger TotalAmount { get; } diff --git a/src/neo/SmartContract/Native/OracleContract.cs b/src/neo/SmartContract/Native/OracleContract.cs index 182d01935b..35587a70f6 100644 --- a/src/neo/SmartContract/Native/OracleContract.cs +++ b/src/neo/SmartContract/Native/OracleContract.cs @@ -29,7 +29,6 @@ public sealed class OracleContract : NativeContract private const long OracleRequestPrice = 0_50000000; public override int Id => -4; - public override uint ActiveBlockIndex => 0; internal OracleContract() { diff --git a/src/neo/SmartContract/Native/PolicyContract.cs b/src/neo/SmartContract/Native/PolicyContract.cs index 8f2e9bbc76..ccec40ea2a 100644 --- a/src/neo/SmartContract/Native/PolicyContract.cs +++ b/src/neo/SmartContract/Native/PolicyContract.cs @@ -12,7 +12,6 @@ namespace Neo.SmartContract.Native public sealed class PolicyContract : NativeContract { public override int Id => -3; - public override uint ActiveBlockIndex => 0; public const uint DefaultExecFeeFactor = 30; public const uint DefaultStoragePrice = 100000; diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs b/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs index b9763de6da..90b54ff208 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_NativeContract.cs @@ -33,7 +33,6 @@ public void TestInitialize() private class DummyNative : NativeContract { public override int Id => 1; - public override uint ActiveBlockIndex => 0; [ContractMethod(0, CallFlags.None)] public void NetTypes( @@ -138,7 +137,6 @@ public void TestTestCall() public class TestNativeContract : NativeContract { public override int Id => 0x10000006; - public override uint ActiveBlockIndex => 0; [ContractMethod(0, CallFlags.None)] public string HelloWorld => "hello world"; diff --git a/tests/neo.UnitTests/SmartContract/Native/UT_Nep17Token.cs b/tests/neo.UnitTests/SmartContract/Native/UT_Nep17Token.cs index bc655ab792..2f9bfe9837 100644 --- a/tests/neo.UnitTests/SmartContract/Native/UT_Nep17Token.cs +++ b/tests/neo.UnitTests/SmartContract/Native/UT_Nep17Token.cs @@ -82,6 +82,5 @@ public class TestNep17Token : Nep17Token public override int Id => 0x10000005; public override string Symbol => throw new NotImplementedException(); public override byte Decimals => 8; - public override uint ActiveBlockIndex => 0; } } diff --git a/tests/neo.UnitTests/UT_ProtocolSettings.cs b/tests/neo.UnitTests/UT_ProtocolSettings.cs index e1a9e91cbb..bce97cd5d8 100644 --- a/tests/neo.UnitTests/UT_ProtocolSettings.cs +++ b/tests/neo.UnitTests/UT_ProtocolSettings.cs @@ -3,6 +3,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Neo.Wallets; using System.Collections.Generic; +using System.IO; using System.Reflection; namespace Neo.UnitTests @@ -62,6 +63,26 @@ public void Can_initialize_ProtocolSettings() ProtocolSettings.Default.Magic.Should().Be(expectedMagic); } + [TestMethod] + public void Initialize_ProtocolSettings_NativeBlockIndex() + { + var tempFile = Path.GetTempFileName(); + File.WriteAllText(tempFile, @" +{ + ""ProtocolConfiguration"": + { + ""NativeActivations"":{ ""test"":123 } + } +} +"); + var config = new ConfigurationBuilder().AddJsonFile(tempFile).Build(); + File.Delete(tempFile); + + ProtocolSettings.Initialize(config).Should().BeTrue(); + ProtocolSettings.Default.NativeActivations.Count.Should().Be(1); + ProtocolSettings.Default.NativeActivations["test"].Should().Be(123); + } + [TestMethod] public void Cant_initialize_ProtocolSettings_after_default_settings_used() { @@ -118,5 +139,11 @@ public void TestGetSeedList() { ProtocolSettings.Default.SeedList.Should().BeEquivalentTo(new string[] { "seed1.neo.org:10333", "seed2.neo.org:10333", "seed3.neo.org:10333", "seed4.neo.org:10333", "seed5.neo.org:10333", }); } + + [TestMethod] + public void TestNativeActivations() + { + ProtocolSettings.Default.NativeActivations.Count.Should().Be(0); + } } }