Skip to content

eip-7883 implementation #8489

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 40 commits into from
May 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
3a0be32
bump pricing
marcindsobczak Nov 18, 2024
dd05498
disable precompile cache
marcindsobczak Nov 19, 2024
6a5e345
min gas at 300
marcindsobczak Nov 19, 2024
8e2aa66
400 is the new min
marcindsobczak Dec 3, 2024
7de750b
divide by 2
marcindsobczak Dec 3, 2024
4188e8c
min gas 500
marcindsobczak Dec 4, 2024
1fa07d5
min gas 600
marcindsobczak Dec 4, 2024
4da7700
divide by 2
marcindsobczak Dec 4, 2024
fed68e9
min gas 500
marcindsobczak Dec 4, 2024
04dd929
increase words cost if >32 bytes
marcindsobczak Dec 5, 2024
843de06
Merge remote-tracking branch 'origin/master' into test/precompile500wx2
marcindsobczak Jan 8, 2025
685a0cb
Merge remote-tracking branch 'origin/master' into test/precompile500w…
marcindsobczak Mar 6, 2025
e9f1a72
add eip activation
yerke26 Apr 8, 2025
8492ae8
fix whitespace
yerke26 Apr 9, 2025
9ddf52e
add tests
yerke26 Apr 9, 2025
dc91923
Merge branch 'master' into test/precompile500wx2up
yerke26 Apr 9, 2025
6fad146
add more tests
yerke26 Apr 10, 2025
c108ece
Merge branch 'master' into test/precompile500wx2up
yerke26 Apr 10, 2025
9950f82
fix whitespaces
yerke26 Apr 10, 2025
7249c9a
Merge remote-tracking branch 'origin/test/precompile500wx2up' into te…
yerke26 Apr 10, 2025
3bed928
minor refactoring
yerke26 Apr 15, 2025
8988740
Merge branch 'master' into test/precompile500wx2up
yerke26 Apr 15, 2025
44a31d4
Merge remote-tracking branch 'origin/master' into test/precompile500w…
flcl42 May 20, 2025
dd6412c
Add GasCostOf constant
flcl42 May 20, 2025
16b87c4
Merge remote-tracking branch 'origin/master' into test/precompile500w…
flcl42 May 20, 2025
1d73f09
Name numbers
flcl42 May 20, 2025
f81d3b3
Merge remote-tracking branch 'origin/master' into test/precompile500w…
flcl42 May 23, 2025
3bed66e
Merge remote-tracking branch 'origin/master' into test/precompile500w…
flcl42 May 26, 2025
ccf0337
Merge branch 'master' into test/precompile500wx2up
MarekM25 May 26, 2025
28aeef9
cosmetic
MarekM25 May 26, 2025
5a1ac57
Merge branch 'test/precompile500wx2up' of https://github.com/nethermi…
MarekM25 May 26, 2025
f04321d
Add json -> spec -> prov loading test for timestamps
flcl42 May 27, 2025
14502c6
Merge branch 'test/precompile500wx2up' of github.com:NethermindEth/ne…
flcl42 May 27, 2025
7c9ad9c
Fix test
flcl42 May 27, 2025
a158cc3
Fix testing platform by getting rid of internals
flcl42 May 27, 2025
eee1373
Merge remote-tracking branch 'origin/master' into test/precompile500w…
flcl42 May 27, 2025
d8b19e9
Reuse
flcl42 May 27, 2025
dee7093
Merge remote-tracking branch 'origin/master' into test/precompile500w…
flcl42 May 27, 2025
ae80103
Add names
flcl42 May 27, 2025
fb2f765
Disable EOF
flcl42 May 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Nethermind/Chains/chiado.json
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
"depositContractAddress": "0xb97036A26259B7147018913bD58a774cf91acf25",
"blobSchedule": [
{
"name": "cancun",
"timestamp": "0x65ba8e4c",
"target": 1,
"max": 2,
Expand Down
1 change: 1 addition & 0 deletions src/Nethermind/Chains/gnosis.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
"depositContractAddress": "0x0B98057eA310F4d31F2a452B414647007d1645d9",
"blobSchedule": [
{
"name": "cancun",
"timestamp": "0x65ef4dbc",
"target": 1,
"max": 2,
Expand Down
1 change: 1 addition & 0 deletions src/Nethermind/Chains/holesky.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
"MergeForkIdTransition": "0x0",
"blobSchedule": [
{
"name": "prague",
"timestamp": "0x67BCEAC0",
"target": 6,
"max": 9,
Expand Down
1 change: 1 addition & 0 deletions src/Nethermind/Chains/hoodi.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"eip6780TransitionTimestamp": "0x0",
"blobSchedule": [
{
"name": "prague",
"timestamp": "0x67e41118",
"target": 6,
"max": 9,
Expand Down
1 change: 1 addition & 0 deletions src/Nethermind/Chains/sepolia.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
"depositContractAddress": "0x7f02c3e3c98b133055b8b348b2ac625669ed295d",
"blobSchedule": [
{
"name": "prague",
"timestamp": "0x67C7FD60",
"target": 6,
"max": 9,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace Ethereum.Blockchain.Pyspec.Test;

[TestFixture]
[Ignore("EOF")]
[Parallelizable(ParallelScope.All)]
public class OsakaBlockChainTests : BlockchainTestBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
namespace Ethereum.Blockchain.Pyspec.Test;

[TestFixture]
[Ignore("EOF")]
[Parallelizable(ParallelScope.All)]
public class OsakaEofTests : EofTestBase
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace Ethereum.Blockchain.Pyspec.Test;

[TestFixture]
[Ignore("EOF")]
[Parallelizable(ParallelScope.All)]
public class OsakaStateTests : GeneralStateTestBase
{
Expand Down
5 changes: 5 additions & 0 deletions src/Nethermind/Nethermind.Core/Specs/IReleaseSpec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ public interface IReleaseSpec : IEip1559Spec, IReceiptSpec
/// </summary>
bool IsEip7825Enabled { get; }

/// <summary>
/// Increase ModExp Gas Cost
/// </summary>
bool IsEip7883Enabled { get; }

/// <summary>
/// Should transactions be validated against chainId.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ public class ReleaseSpecDecorator(IReleaseSpec spec) : IReleaseSpec
public virtual bool IsOpIsthmusEnabled => spec.IsOpIsthmusEnabled;
public virtual bool IsEip7623Enabled => spec.IsEip7623Enabled;
public virtual bool IsEip7825Enabled => spec.IsEip7825Enabled;
public bool IsEip7883Enabled => spec.IsEip7883Enabled;
public virtual ulong WithdrawalTimestamp => spec.WithdrawalTimestamp;
public virtual ulong Eip4844TransitionTimestamp => spec.Eip4844TransitionTimestamp;
public virtual bool IsEofEnabled => spec.IsEofEnabled;
Expand Down
96 changes: 96 additions & 0 deletions src/Nethermind/Nethermind.Evm.Test/Eip7883Tests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System;
using System.Collections.Generic;
using FluentAssertions;
using Nethermind.Core.Specs;
using Nethermind.Evm.Precompiles;
using Nethermind.Int256;
using Nethermind.Specs;
using NUnit.Framework;

namespace Nethermind.Evm.Test;

public class Eip7883Tests
{
[Test]
public void DataGasCost([ValueSource(nameof(Eip7883TestCases))] Eip7883TestCase test)
{
var inputData = PrepareInput(test.BaseLength, test.ExpLength, test.ModulusLength);

long gas = ModExpPrecompile.Instance.DataGasCost(inputData, test.Spec);
gas.Should().Be(test.Result);
}

public class Eip7883TestCase
{
public IReleaseSpec Spec { get; set; }
public UInt256 BaseLength { get; set; }
public UInt256 ExpLength { get; set; }
public UInt256 ModulusLength { get; set; }
public long Result { get; set; }
}

private static readonly IReleaseSpec SpecEipEnabled = new ReleaseSpec
{
IsEip7883Enabled = true,
IsEip2565Enabled = true,
};

private static readonly IReleaseSpec SpecEipDisabled = new ReleaseSpec
{
IsEip7883Enabled = false,
IsEip2565Enabled = true,
};

private static IEnumerable<Eip7883TestCase> Eip7883TestCases()
{
// eip enabled test cases
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 32, ExpLength = 32, ModulusLength = 32, Result = 500L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 32, ExpLength = 32, ModulusLength = 10000, Result = 1041666L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 32, ExpLength = 10000, ModulusLength = 32, Result = 850602L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 10000, ExpLength = 32, ModulusLength = 32, Result = 1041666L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 32, ExpLength = 10000, ModulusLength = 10000, Result = 166133333333L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 10000, ExpLength = 10000, ModulusLength = 32, Result = 166133333333L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 10000, ExpLength = 32, ModulusLength = 10000, Result = 1041666L };
yield return new Eip7883TestCase
{ Spec = SpecEipEnabled, BaseLength = 10000, ExpLength = 10000, ModulusLength = 10000, Result = 166133333333L };

// eip disabled test cases
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 32, ExpLength = 32, ModulusLength = 32, Result = 200L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 32, ExpLength = 32, ModulusLength = 10000, Result = 520833L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 32, ExpLength = 10000, ModulusLength = 32, Result = 425301L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 10000, ExpLength = 32, ModulusLength = 32, Result = 520833L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 32, ExpLength = 10000, ModulusLength = 10000, Result = 41533333333L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 10000, ExpLength = 10000, ModulusLength = 32, Result = 41533333333L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 10000, ExpLength = 32, ModulusLength = 10000, Result = 520833L };
yield return new Eip7883TestCase
{ Spec = SpecEipDisabled, BaseLength = 10000, ExpLength = 10000, ModulusLength = 10000, Result = 41533333333L };
}

private static ReadOnlyMemory<byte> PrepareInput(UInt256 baseLength, UInt256 expLength, UInt256 modulusLength)
{
var inputBytes = new byte[96];

Array.Copy(baseLength.ToBigEndian(), 0, inputBytes, 0, 32);
Array.Copy(expLength.ToBigEndian(), 0, inputBytes, 32, 32);
Array.Copy(modulusLength.ToBigEndian(), 0, inputBytes, 64, 32);

return new ReadOnlyMemory<byte>(inputBytes);
}
}
5 changes: 4 additions & 1 deletion src/Nethermind/Nethermind.Evm/GasCostOf.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

namespace Nethermind.Evm
Expand Down Expand Up @@ -71,6 +71,9 @@ public static class GasCostOf
public const long TxDataNonZeroMultiplier = TxDataNonZero / TxDataZero;
public const long TxDataNonZeroMultiplierEip2028 = TxDataNonZeroEip2028 / TxDataZero;

public const long MinModExpEip2565 = 200; // eip-2565
public const long MinModExpEip7883 = 500; // eip-7883
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@marcindsobczak I remember we've been discussing a Min to be 375 or 400. What is the latest here?


// Eof Execution EIP-7692
public const long DataLoad = 4;
public const long DataLoadN = 3;
Expand Down
28 changes: 20 additions & 8 deletions src/Nethermind/Nethermind.Evm/Precompiles/ModExpPrecompile.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System;
Expand Down Expand Up @@ -70,15 +70,20 @@ public long DataGasCost(ReadOnlyMemory<byte> inputData, IReleaseSpec releaseSpec
return long.MaxValue;
}

UInt256 complexity = MultComplexity(baseLength, modulusLength);
if (ExceedsMaxInputSize(releaseSpec, baseLength, expLength, modulusLength))
{
return long.MaxValue;
}

UInt256 complexity = MultComplexity(baseLength, modulusLength, releaseSpec.IsEip7883Enabled);

UInt256 expLengthUpTo32 = UInt256.Min(32, expLength);
UInt256 startIndex = 96 + baseLength; //+ expLength - expLengthUpTo32; // Geth takes head here, why?
UInt256 exp = new(inputData.Span.SliceWithZeroPaddingEmptyOnError((int)startIndex, (int)expLengthUpTo32), true);
UInt256 iterationCount = CalculateIterationCount(expLength, exp);
UInt256 iterationCount = CalculateIterationCount(expLength, exp, releaseSpec.IsEip7883Enabled);
bool overflow = UInt256.MultiplyOverflow(complexity, iterationCount, out UInt256 result);
result /= 3;
return result > long.MaxValue || overflow ? long.MaxValue : Math.Max(200L, (long)result);
return result > long.MaxValue || overflow ? long.MaxValue : Math.Max(releaseSpec.IsEip7883Enabled ? GasCostOf.MinModExpEip7883 : GasCostOf.MinModExpEip2565, (long)result);
}
catch (OverflowException)
{
Expand Down Expand Up @@ -192,14 +197,18 @@ public static (byte[], bool) OldRun(byte[] inputData)
/// return words**2
/// </summary>
/// <returns></returns>
private static UInt256 MultComplexity(in UInt256 baseLength, in UInt256 modulusLength)
private static UInt256 MultComplexity(in UInt256 baseLength, in UInt256 modulusLength, bool isEip7883Enabled)
{
UInt256 maxLength = UInt256.Max(baseLength, modulusLength);
UInt256.Mod(maxLength, 8, out UInt256 mod8);
UInt256 words = (maxLength / 8) + ((mod8.IsZero) ? UInt256.Zero : UInt256.One);
return words * words;
return maxLength > 32 && isEip7883Enabled ? 2 * words * words : words * words;
}

static readonly UInt256 IterationCountMultiplierEip2565 = 8;

static readonly UInt256 IterationCountMultiplierEip7883 = 16;

/// <summary>
/// def calculate_iteration_count(exponent_length, exponent):
/// iteration_count = 0
Expand All @@ -210,8 +219,9 @@ private static UInt256 MultComplexity(in UInt256 baseLength, in UInt256 modulusL
/// </summary>
/// <param name="exponentLength"></param>
/// <param name="exponent"></param>
/// <param name="isEip7883Enabled"></param>
/// <returns></returns>
private static UInt256 CalculateIterationCount(UInt256 exponentLength, UInt256 exponent)
private static UInt256 CalculateIterationCount(UInt256 exponentLength, UInt256 exponent, bool isEip7883Enabled)
{
try
{
Expand All @@ -228,7 +238,9 @@ private static UInt256 CalculateIterationCount(UInt256 exponentLength, UInt256 e
bitLength--;
}

bool overflow = UInt256.MultiplyOverflow((exponentLength - 32), 8, out UInt256 multiplicationResult);
bool overflow = UInt256.MultiplyOverflow(exponentLength - 32,
isEip7883Enabled ? IterationCountMultiplierEip7883 : IterationCountMultiplierEip2565,
out UInt256 multiplicationResult);
overflow |= UInt256.AddOverflow(multiplicationResult, (UInt256)bitLength, out iterationCount);
if (overflow)
{
Expand Down
44 changes: 42 additions & 2 deletions src/Nethermind/Nethermind.Specs.Test/ChainParametersTests.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

using System.Collections.Generic;
using System.Linq;
using Nethermind.Core.Specs;
using Nethermind.Specs.ChainSpecStyle;
using Nethermind.Specs.ChainSpecStyle.Json;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace Nethermind.Specs.Test;

Expand All @@ -29,4 +31,42 @@ public void ChainParameters_should_have_same_properties_as_chainSpecParamsJson()

Assert.That(chainParametersProperties, Is.EquivalentTo(chainSpecParamsJsonProperties));
}

[Test]
public void ChainParameters_should_be_loaded_from_chainSpecParamsJson()
{
// eips with additional dependencies or non standard names
string[] exceptions = [
"MaxCodeSizeTransitionTimestamp",
"Eip4844FeeCollectorTransitionTimestamp",
"Eip6110TransitionTimestamp",
"Eip7692TransitionTimestamp"
];

const ulong testValue = 1ul;

foreach (PropertyInfo jsonParamsProp in typeof(ChainSpecParamsJson).GetProperties().Where(x => x.Name.EndsWith("TransitionTimestamp") && !exceptions.Contains(x.Name)))
{
ChainSpecJson test = new() { Params = new ChainSpecParamsJson() };
jsonParamsProp.SetValue(test.Params, testValue);
(ChainSpecBasedSpecProvider? prov, ChainSpec? spec) = TestSpecHelper.LoadChainSpec(test);

PropertyInfo? paramsProp = typeof(ChainParameters).GetProperty(jsonParamsProp.Name);

Assert.That(paramsProp, Is.Not.Null, $"Property {jsonParamsProp.Name} not found in ChainParameters.");
object? paramsValue = paramsProp.GetValue(spec.Parameters);
Assert.That(paramsValue, Is.EqualTo(testValue), $"Property {jsonParamsProp.Name} in ChainParameters does not match the value set in ChainSpecParamsJson, got {paramsValue} expected {testValue}.");


IReleaseSpec preSpec = prov.GetSpec(ForkActivation.TimestampOnly(0));
string specPropName = $"Is{jsonParamsProp.Name.Replace("TransitionTimestamp", "")}Enabled";
PropertyInfo? specProp = preSpec.GetType().GetProperty(specPropName);
Assert.That(specProp, Is.Not.Null, $"Property {specPropName} not found in {preSpec.GetType().Name}.");

Assert.That(specProp.GetValue(preSpec), Is.False, $"Property {specPropName} is activated, which was not expected.");

IReleaseSpec postSpec = prov.GetSpec(ForkActivation.TimestampOnly(1));
Assert.That(specProp.GetValue(postSpec), Is.True, $"Property {specPropName} is not activated.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -829,15 +829,14 @@ public void Test_BlobSchedule_IsApplied_AlongWithForkSchedule(
BlobScheduleSettings[] blobScheduleSettings,
ulong[] expectedActivationSettings)
{
ChainSpecBasedSpecProvider provider = new(new ChainSpec
(ChainSpecBasedSpecProvider provider, _) = TestSpecHelper.LoadChainSpec(new ChainSpecJson
{
Parameters = new ChainParameters
Params = new ChainSpecParamsJson
{
Eip4844TransitionTimestamp = eip4844Timestamp,
Eip7002TransitionTimestamp = eip7002Timestamp,
BlobSchedule = [.. blobScheduleSettings]
},
EngineChainSpecParametersProvider = Substitute.For<IChainSpecParametersProvider>()
});

IReleaseSpec spec = provider.GenesisSpec;
Expand All @@ -863,7 +862,7 @@ static TestCaseData MakeTestCase(string testName, int eip4844Timestamp, int eip7
=> new([
(ulong)eip4844Timestamp,
(ulong)eip7002Timestamp,
settings.Select(s => new BlobScheduleSettings { Timestamp = (ulong)s.timestamp, Max = (ulong)s.max, Target = (ulong)s.max, BaseFeeUpdateFraction = (ulong)s.max }).ToArray(),
settings.Select(s => new BlobScheduleSettings { Timestamp = (ulong)s.timestamp, Max = (ulong)s.max }).ToArray(),
expectedActivationSettings])
{ TestName = $"BlobScheduleActivations: {testName}" };

Expand Down Expand Up @@ -893,6 +892,10 @@ static TestCaseData MakeTestCase(string testName, int eip4844Timestamp, int eip7
yield return MakeTestCase("BPOs match named forks", 1, 2, [(1, 10), (2, 3)], [NoneAllowed, 10, 3]);

yield return MakeTestCase("BPO timestamp matches genesis, but not any other fork", 0, 2, [(0, 10), (1, 11)], [10, 11, 11]);

yield return MakeTestCase("Unordered", 0, 2, [(4, 10), (3, 11)], [Default, Default, 11, 10]);

yield return MakeTestCase("Unordered between named forks", 0, 2, [(4, 10), (1, 11)], [Default, 11, 11, 10]);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ public void Prague_eips(long blockNumber, ulong timestamp, bool isEnabled)
[TestCase(MainnetSpecProvider.ParisBlockNumber, MainnetSpecProvider.OsakaBlockTimestamp, true)]
public void Osaka_eips(long blockNumber, ulong timestamp, bool isEnabled)
{
_specProvider.GetSpec(new ForkActivation(blockNumber, timestamp)).IsEofEnabled.Should().Be(isEnabled);
_specProvider.GetSpec(new ForkActivation(blockNumber, timestamp)).IsEip7594Enabled.Should().Be(isEnabled);
_specProvider.GetSpec(new ForkActivation(blockNumber, timestamp)).IsEip7823Enabled.Should().Be(isEnabled);
_specProvider.GetSpec(new ForkActivation(blockNumber, timestamp)).IsEip7883Enabled.Should().Be(isEnabled);
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ public UInt256 BlockReward

public bool IsEip7623Enabled => _spec.IsEip7623Enabled;

public bool IsEip7883Enabled => _spec.IsEip7883Enabled;

public bool IsEip3607Enabled { get; set; }

public bool IsEip158IgnoredAccount(Address address) => _spec.IsEip158IgnoredAccount(address);
Expand Down
Loading