diff --git a/src/Nethermind/Nethermind.AuRa.Test/AuRaPluginTests.cs b/src/Nethermind/Nethermind.AuRa.Test/AuRaPluginTests.cs index d520f50b3c1..c5d7b358c46 100644 --- a/src/Nethermind/Nethermind.AuRa.Test/AuRaPluginTests.cs +++ b/src/Nethermind/Nethermind.AuRa.Test/AuRaPluginTests.cs @@ -47,5 +47,19 @@ public void Init_when_not_AuRa_doesnt_trow() init.Should().NotThrow(); } + [Test] + public void DecorateReleaseSpecWithAuraReleaseSpec() + { + ChainSpec chainSpec = new(); + chainSpec.EngineChainSpecParametersProvider = new TestChainSpecParametersProvider(new AuRaChainSpecEngineParameters()); + using IContainer container = new ContainerBuilder() + .AddModule(new TestNethermindModule()) + .AddModule(new AuRaModule(chainSpec)) + .Build(); + + container.Resolve().GetSpec(Build.A.BlockHeader.WithNumber(10).TestObject) + .Should().BeOfType(); + } + } } diff --git a/src/Nethermind/Nethermind.Consensus.AuRa/AuRaPlugin.cs b/src/Nethermind/Nethermind.Consensus.AuRa/AuRaPlugin.cs index 451dd657752..6cc95454002 100644 --- a/src/Nethermind/Nethermind.Consensus.AuRa/AuRaPlugin.cs +++ b/src/Nethermind/Nethermind.Consensus.AuRa/AuRaPlugin.cs @@ -92,6 +92,7 @@ protected override void Load(ContainerBuilder builder) builder .AddSingleton() + .AddDecorator() .AddSingleton(specParam) .AddDecorator() .Add() // Note: Stateful. Probably just some strange unintentional side effect though. diff --git a/src/Nethermind/Nethermind.Core/Specs/AuRaSpecProvider.cs b/src/Nethermind/Nethermind.Core/Specs/AuRaSpecProvider.cs new file mode 100644 index 00000000000..f5d78c4c02a --- /dev/null +++ b/src/Nethermind/Nethermind.Core/Specs/AuRaSpecProvider.cs @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +namespace Nethermind.Core.Specs; + + +public class AuRaSpecProvider(ISpecProvider baseSpecProvider) : SpecProviderDecorator(baseSpecProvider) +{ + public override IReleaseSpec GetSpecInternal(ForkActivation forkActivation) + { + return new AuRaReleaseSpecDecorator(base.GetSpecInternal(forkActivation)); + } +} + +public class AuRaReleaseSpecDecorator(IReleaseSpec spec) : ReleaseSpecDecorator(spec) +{ + public override bool IsEip158IgnoredAccount(Address address) => address == Address.SystemUser; +} diff --git a/src/Nethermind/Nethermind.Core/Specs/AuraSpecProvider.cs b/src/Nethermind/Nethermind.Core/Specs/AuraSpecProvider.cs deleted file mode 100644 index bd2585b5320..00000000000 --- a/src/Nethermind/Nethermind.Core/Specs/AuraSpecProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-FileCopyrightText: 2024 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -namespace Nethermind.Core.Specs; - -public class AuraSpecProvider(IReleaseSpec spec) : ReleaseSpecDecorator(spec) -{ - public override bool IsEip158IgnoredAccount(Address address) => address == Address.SystemUser; -} diff --git a/src/Nethermind/Nethermind.Core/Specs/ISpecProvider.cs b/src/Nethermind/Nethermind.Core/Specs/ISpecProvider.cs index 38e8c24bcd2..7abe0168014 100644 --- a/src/Nethermind/Nethermind.Core/Specs/ISpecProvider.cs +++ b/src/Nethermind/Nethermind.Core/Specs/ISpecProvider.cs @@ -84,11 +84,7 @@ public interface ISpecProvider public static class SpecProviderExtensions { - public static IReleaseSpec GetSpec(this ISpecProvider specProvider, ForkActivation forkActivation) - => specProvider.SealEngine == SealEngineType.AuRa - ? new AuraSpecProvider(specProvider.GetSpecInternal(forkActivation)) - : specProvider.GetSpecInternal(forkActivation); - + public static IReleaseSpec GetSpec(this ISpecProvider specProvider, ForkActivation forkActivation) => specProvider.GetSpecInternal(forkActivation); public static IReleaseSpec GetSpec(this ISpecProvider specProvider, long blockNumber, ulong? timestamp) => specProvider.GetSpec(new ForkActivation(blockNumber, timestamp)); public static IReleaseSpec GetSpec(this ISpecProvider specProvider, BlockHeader blockHeader) => specProvider.GetSpec(new ForkActivation(blockHeader.Number, blockHeader.Timestamp)); diff --git a/src/Nethermind/Nethermind.Core/Specs/SpecProviderDecorator.cs b/src/Nethermind/Nethermind.Core/Specs/SpecProviderDecorator.cs new file mode 100644 index 00000000000..b7856c4f7f2 --- /dev/null +++ b/src/Nethermind/Nethermind.Core/Specs/SpecProviderDecorator.cs @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using Nethermind.Int256; + +namespace Nethermind.Core.Specs; + +public class SpecProviderDecorator(ISpecProvider baseSpecProvider) : ISpecProvider +{ + public void UpdateMergeTransitionInfo(long? blockNumber, UInt256? terminalTotalDifficulty = null) => baseSpecProvider.UpdateMergeTransitionInfo(blockNumber, terminalTotalDifficulty); + + public ForkActivation? MergeBlockNumber => baseSpecProvider.MergeBlockNumber; + + public ulong TimestampFork => baseSpecProvider.TimestampFork; + + public UInt256? TerminalTotalDifficulty => baseSpecProvider.TerminalTotalDifficulty; + + public IReleaseSpec GenesisSpec => baseSpecProvider.GenesisSpec; + + public long? DaoBlockNumber => baseSpecProvider.DaoBlockNumber; + + public ulong? BeaconChainGenesisTimestamp => baseSpecProvider.BeaconChainGenesisTimestamp; + + public ulong NetworkId => baseSpecProvider.NetworkId; + + public ulong ChainId => baseSpecProvider.ChainId; + + public ForkActivation[] TransitionActivations => baseSpecProvider.TransitionActivations; + + public virtual IReleaseSpec GetSpecInternal(ForkActivation forkActivation) => baseSpecProvider.GetSpecInternal(forkActivation); +}