From 6f2698c124d1d8e8cc24024f9f61ee001e12b790 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Mon, 1 Jan 2024 21:13:10 +0300 Subject: [PATCH] Optimism canyon (#6374) * Receipts * Create2Deployer * Fix null value * Refactor 1559 * Canyon eip 1559 * Refactor * MarkAsFailed * Revert TxProcessor * Fix tests * Fix tests * decoder * Fix configs * base-goerli regolith timestamp * Fix elasticity multiplier * Check tx type --- src/Nethermind/Chains/base-goerli.json | 15 +++++- src/Nethermind/Chains/base-sepolia.json | 13 ++++- src/Nethermind/Chains/op-goerli.json | 11 +++- src/Nethermind/Chains/op-sepolia.json | 15 +++++- .../BlockProducerBaseTests.BaseFee.cs | 12 ++--- .../TargetAdjustedGasLimitCalculatorTests.cs | 2 +- .../Eip1559GasLimitAdjuster.cs | 2 +- .../Processing/BlockProcessor.cs | 12 ++--- .../Nethermind.Core.Test/BlockHeaderTests.cs | 10 +++- .../Nethermind.Core/BaseFeeCalculator.cs | 8 +-- .../Nethermind.Core/Eip1559Constants.cs | 5 -- .../Nethermind.Core/Specs/IEip1559Spec.cs | 3 ++ .../Nethermind.Core/TransactionReceipt.cs | 3 ++ .../Tracing/BlockReceiptsTracer.cs | 30 +++++------ .../MinGasPriceTests.cs | 13 +++++ .../Create2DeployerContractRewriter.cs | 34 +++++++++++++ .../Nethermind.Optimism/IOPConfigHelper.cs | 3 ++ .../InitializeBlockchainOptimism.cs | 33 ++++++++++-- .../Nethermind.Optimism/OPConfigHelper.cs | 21 ++++++-- .../OptimismBlockProcessor.cs | 47 +++++++++++++++++ .../OptimismBlockProducerEnvFactory.cs | 27 ++++++++-- .../OptimismBlockReceiptTracer.cs | 50 +++++++++++++++++++ .../OptimismTransactionProcessor.cs | 3 +- .../ReceiptMessageDecoder.cs | 20 +++++++- .../OverridableReleaseSpec.cs | 3 ++ .../ChainSpecStyle/ChainParameters.cs | 6 +-- .../ChainSpecBasedSpecProvider.cs | 11 ++++ .../ChainSpecStyle/ChainSpecLoader.cs | 16 +++--- .../ChainSpecStyle/Json/ChainSpecJson.cs | 9 ++++ .../ChainSpecStyle/OptimismParameters.cs | 9 +++- .../Nethermind.Specs/ReleaseSpec.cs | 3 ++ .../SystemTransactionReleaseSpec.cs | 3 ++ 32 files changed, 379 insertions(+), 73 deletions(-) create mode 100644 src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs create mode 100644 src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs create mode 100644 src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs diff --git a/src/Nethermind/Chains/base-goerli.json b/src/Nethermind/Chains/base-goerli.json index c414ea94c31..2d1c80ec0e7 100644 --- a/src/Nethermind/Chains/base-goerli.json +++ b/src/Nethermind/Chains/base-goerli.json @@ -4,8 +4,14 @@ "engine": { "Optimism": { "params": { - "regolithTimestamp": "0x0", - "bedrockBlockNumber": "0x0" + "regolithTimestamp": "0x6453E490", + "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", + "l1FeeRecipient": "0x420000000000000000000000000000000000001A", + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -45,6 +51,11 @@ "eip3529Transition": "0x0", "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Chains/base-sepolia.json b/src/Nethermind/Chains/base-sepolia.json index 932a4f347b0..bd64d43f840 100644 --- a/src/Nethermind/Chains/base-sepolia.json +++ b/src/Nethermind/Chains/base-sepolia.json @@ -5,7 +5,13 @@ "Optimism": { "params": { "regolithTimestamp": "0x0", - "bedrockBlockNumber": "0x0" + "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", + "l1FeeRecipient": "0x420000000000000000000000000000000000001A", + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -45,6 +51,11 @@ "eip3529Transition": "0x0", "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Chains/op-goerli.json b/src/Nethermind/Chains/op-goerli.json index f1b0d9a377b..4c914e34e74 100644 --- a/src/Nethermind/Chains/op-goerli.json +++ b/src/Nethermind/Chains/op-goerli.json @@ -6,8 +6,12 @@ "params": { "regolithTimestamp": "0x6414B8B0", "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", "l1FeeRecipient": "0x420000000000000000000000000000000000001A", - "l1BlockAddress": "0x4200000000000000000000000000000000000015" + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -52,6 +56,11 @@ "eip3529Transition": "0x3df828", "eip3541Transition": "0x3df828", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Chains/op-sepolia.json b/src/Nethermind/Chains/op-sepolia.json index 087e053c8e7..e34fa5cf082 100644 --- a/src/Nethermind/Chains/op-sepolia.json +++ b/src/Nethermind/Chains/op-sepolia.json @@ -5,7 +5,13 @@ "Optimism": { "params": { "regolithTimestamp": "0x0", - "bedrockBlockNumber": "0x0" + "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", + "l1FeeRecipient": "0x420000000000000000000000000000000000001A", + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -39,12 +45,17 @@ "eip1559Transition": "0x0", "eip1559FeeCollectorTransition": "0x0", "eip1559FeeCollector": "0x4200000000000000000000000000000000000019", - "eip1559ElasticityMultiplier": "0xa", + "eip1559ElasticityMultiplier": "0x6", "eip1559BaseFeeMaxChangeDenominator": "0x32", "eip3198Transition": "0x0", "eip3529Transition": "0x0", "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs b/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs index 4e66e5bd708..988136b6896 100644 --- a/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs +++ b/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs @@ -255,7 +255,7 @@ public async Task BlockProducer_returns_correct_fork_base_fee() .WithEip1559TransitionBlock(7) .CreateTestBlockchain() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee); + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee); await scenario.Finish(); } @@ -266,7 +266,7 @@ public async Task BlockProducer_returns_correctly_decreases_base_fee_on_empty_bl .WithEip1559TransitionBlock(6) .CreateTestBlockchain() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .AssertNewBlock(875000000) .AssertNewBlock(765625000) .AssertNewBlock(669921875) @@ -283,7 +283,7 @@ public async Task BaseFee_should_decrease_when_we_send_transactions_below_gas_ta .CreateTestBlockchain(gasLimit) .DeployContract() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasLimit / 3, 20.GWei()) .SendEip1559Transaction(gasLimit / 3, 1.GWei(), 20.GWei()) .AssertNewBlock(875000000) @@ -301,7 +301,7 @@ public async Task BaseFee_should_not_change_when_we_send_transactions_equal_gas_ .CreateTestBlockchain(gasTarget) .DeployContract() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasTarget / 2, 20.GWei()) .SendEip1559Transaction(gasTarget / 2, 1.GWei(), 20.GWei()) .AssertNewBlock(875000000) @@ -319,7 +319,7 @@ public async Task BaseFee_should_increase_when_we_send_transactions_above_gas_ta .CreateTestBlockchain(gasTarget) .DeployContract() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasTarget / 2, 20.GWei()) .SendEip1559Transaction(gasTarget / 2, 1.GWei(), 20.GWei()) .SendLegacyTransaction(gasTarget / 2, 20.GWei()) @@ -337,7 +337,7 @@ public async Task When_base_fee_decreases_previously_fee_too_low_transaction_is_ .WithEip1559TransitionBlock(6) .CreateTestBlockchain(gasTarget) .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasTarget / 2, 7.GWei() / 10, nonce: UInt256.Zero) .AssertNewBlock(875000000) .AssertNewBlock(765625000) diff --git a/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs b/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs index d3006e499c7..2f96501987d 100644 --- a/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs +++ b/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs @@ -27,7 +27,7 @@ public void Is_bump_on_1559_eip_block() TargetAdjustedGasLimitCalculator targetedAdjustedGasLimitCalculator = new(specProvider, new BlocksConfig()); BlockHeader header = Build.A.BlockHeader.WithNumber(londonBlock - 1).WithGasLimit(gasLimit).TestObject; long actualValue = targetedAdjustedGasLimitCalculator.GetGasLimit(header); - Assert.That(actualValue, Is.EqualTo(gasLimit * Eip1559Constants.ElasticityMultiplier)); + Assert.That(actualValue, Is.EqualTo(gasLimit * Eip1559Constants.DefaultElasticityMultiplier)); } } } diff --git a/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs b/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs index 3c1ecb4138f..98e15179438 100644 --- a/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs +++ b/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs @@ -14,7 +14,7 @@ public static long AdjustGasLimit(IReleaseSpec releaseSpec, long gasLimit, long long adjustedGasLimit = gasLimit; if (releaseSpec.Eip1559TransitionBlock == blockNumber) { - adjustedGasLimit *= Eip1559Constants.ElasticityMultiplier; + adjustedGasLimit *= releaseSpec.ElasticityMultiplier; } return adjustedGasLimit; diff --git a/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs b/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs index 3a8c660c9de..f7f5bd8c803 100644 --- a/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs +++ b/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs @@ -43,7 +43,7 @@ public partial class BlockProcessor : IBlockProcessor /// We use a single receipt tracer for all blocks. Internally receipt tracer forwards most of the calls /// to any block-specific tracers. /// - private readonly BlockReceiptsTracer _receiptsTracer; + protected BlockReceiptsTracer ReceiptsTracer { get; set; } public BlockProcessor( ISpecProvider? specProvider, @@ -67,7 +67,7 @@ public BlockProcessor( _blockTransactionsExecutor = blockTransactionsExecutor ?? throw new ArgumentNullException(nameof(blockTransactionsExecutor)); _beaconBlockRootHandler = new BeaconBlockRootHandler(); - _receiptsTracer = new BlockReceiptsTracer(); + ReceiptsTracer = new BlockReceiptsTracer(); } public event EventHandler BlockProcessed; @@ -226,13 +226,13 @@ protected virtual TxReceipt[] ProcessBlock( { IReleaseSpec spec = _specProvider.GetSpec(block.Header); - _receiptsTracer.SetOtherTracer(blockTracer); - _receiptsTracer.StartNewBlockTrace(block); + ReceiptsTracer.SetOtherTracer(blockTracer); + ReceiptsTracer.StartNewBlockTrace(block); _beaconBlockRootHandler.ApplyContractStateChanges(block, spec, _stateProvider); _stateProvider.Commit(spec); - TxReceipt[] receipts = _blockTransactionsExecutor.ProcessTransactions(block, options, _receiptsTracer, spec); + TxReceipt[] receipts = _blockTransactionsExecutor.ProcessTransactions(block, options, ReceiptsTracer, spec); if (spec.IsEip4844Enabled) { @@ -242,7 +242,7 @@ protected virtual TxReceipt[] ProcessBlock( block.Header.ReceiptsRoot = receipts.GetReceiptsRoot(spec, block.ReceiptsRoot); ApplyMinerRewards(block, blockTracer, spec); _withdrawalProcessor.ProcessWithdrawals(block, spec); - _receiptsTracer.EndBlockTrace(); + ReceiptsTracer.EndBlockTrace(); _stateProvider.Commit(spec); diff --git a/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs b/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs index b2c59314889..849c25d3364 100644 --- a/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs +++ b/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs @@ -114,10 +114,13 @@ public void Eip_1559_CalculateBaseFee(long gasTarget, long baseFee, long expecte IReleaseSpec releaseSpec = Substitute.For(); releaseSpec.IsEip1559Enabled.Returns(true); releaseSpec.Eip1559BaseFeeMinValue.Returns((UInt256?)minimalBaseFee); + releaseSpec.ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + releaseSpec.BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + releaseSpec.ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); BlockHeader blockHeader = Build.A.BlockHeader.TestObject; blockHeader.Number = 2001; - blockHeader.GasLimit = gasTarget * Eip1559Constants.ElasticityMultiplier; + blockHeader.GasLimit = gasTarget * Eip1559Constants.DefaultElasticityMultiplier; blockHeader.BaseFeePerGas = (UInt256)baseFee; blockHeader.GasUsed = gasUsed; UInt256 actualBaseFee = BaseFeeCalculator.Calculate(blockHeader, releaseSpec); @@ -141,10 +144,13 @@ public void Eip_1559_CalculateBaseFee_shared_test_cases((BaseFeeTestCases Info, { IReleaseSpec releaseSpec = Substitute.For(); releaseSpec.IsEip1559Enabled.Returns(true); + releaseSpec.ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + releaseSpec.BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + releaseSpec.ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); BlockHeader blockHeader = Build.A.BlockHeader.TestObject; blockHeader.Number = 2001; - blockHeader.GasLimit = testCase.Info.ParentTargetGasUsed * Eip1559Constants.ElasticityMultiplier; + blockHeader.GasLimit = testCase.Info.ParentTargetGasUsed * Eip1559Constants.DefaultElasticityMultiplier; blockHeader.BaseFeePerGas = (UInt256)testCase.Info.ParentBaseFee; blockHeader.GasUsed = testCase.Info.ParentGasUsed; UInt256 actualBaseFee = BaseFeeCalculator.Calculate(blockHeader, releaseSpec); diff --git a/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs b/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs index 70b72473a73..268997f6df9 100644 --- a/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs +++ b/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs @@ -18,7 +18,7 @@ public static UInt256 Calculate(BlockHeader parent, IEip1559Spec specFor1559) long gasDelta; UInt256 feeDelta; bool isForkBlockNumber = specFor1559.Eip1559TransitionBlock == parent.Number + 1; - long parentGasTarget = parent.GasLimit / Eip1559Constants.ElasticityMultiplier; + long parentGasTarget = parent.GasLimit / specFor1559.ElasticityMultiplier; if (isForkBlockNumber) parentGasTarget = parent.GasLimit; @@ -30,20 +30,20 @@ public static UInt256 Calculate(BlockHeader parent, IEip1559Spec specFor1559) { gasDelta = parent.GasUsed - parentGasTarget; feeDelta = UInt256.Max( - parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / Eip1559Constants.BaseFeeMaxChangeDenominator, + parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / specFor1559.BaseFeeMaxChangeDenominator, UInt256.One); expectedBaseFee = parentBaseFee + feeDelta; } else { gasDelta = parentGasTarget - parent.GasUsed; - feeDelta = parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / Eip1559Constants.BaseFeeMaxChangeDenominator; + feeDelta = parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / specFor1559.BaseFeeMaxChangeDenominator; expectedBaseFee = UInt256.Max(parentBaseFee - feeDelta, 0); } if (isForkBlockNumber) { - expectedBaseFee = Eip1559Constants.ForkBaseFee; + expectedBaseFee = specFor1559.ForkBaseFee; } if (specFor1559.Eip1559BaseFeeMinValue.HasValue) diff --git a/src/Nethermind/Nethermind.Core/Eip1559Constants.cs b/src/Nethermind/Nethermind.Core/Eip1559Constants.cs index c2895bed910..cab44982cae 100644 --- a/src/Nethermind/Nethermind.Core/Eip1559Constants.cs +++ b/src/Nethermind/Nethermind.Core/Eip1559Constants.cs @@ -14,10 +14,5 @@ public class Eip1559Constants public static readonly UInt256 DefaultBaseFeeMaxChangeDenominator = 8; public static readonly int DefaultElasticityMultiplier = 2; - - // The above values are the default ones. However, we're allowing to override it from genesis - public static UInt256 ForkBaseFee { get; set; } = DefaultForkBaseFee; - public static UInt256 BaseFeeMaxChangeDenominator { get; set; } = DefaultBaseFeeMaxChangeDenominator; - public static long ElasticityMultiplier { get; set; } = DefaultElasticityMultiplier; } } diff --git a/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs b/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs index 33e5723eed3..0d343448551 100644 --- a/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs +++ b/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs @@ -17,5 +17,8 @@ public interface IEip1559Spec public long Eip1559TransitionBlock { get; } public Address? Eip1559FeeCollector => null; public UInt256? Eip1559BaseFeeMinValue => null; + public UInt256 ForkBaseFee { get; } + public UInt256 BaseFeeMaxChangeDenominator { get; } + public long ElasticityMultiplier { get; } } } diff --git a/src/Nethermind/Nethermind.Core/TransactionReceipt.cs b/src/Nethermind/Nethermind.Core/TransactionReceipt.cs index ea5f9c57531..5de0b0d85f3 100644 --- a/src/Nethermind/Nethermind.Core/TransactionReceipt.cs +++ b/src/Nethermind/Nethermind.Core/TransactionReceipt.cs @@ -39,6 +39,9 @@ public class TxReceipt public LogEntry[]? Logs { get; set; } public string? Error { get; set; } + public ulong? DepositNonce { get; set; } + public ulong? DepositReceiptVersion { get; set; } + /// /// Ignores receipt output on RLP serialization. /// Output is either StateRoot or StatusCode depending on eip configuration. diff --git a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs index 5c456e673b8..c43469bd91c 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs @@ -12,7 +12,7 @@ namespace Nethermind.Evm.Tracing; public class BlockReceiptsTracer : IBlockTracer, ITxTracer, IJournal, ITxTracerWrapper { - private Block _block = null!; + protected Block Block = null!; public bool IsTracingReceipt => true; public bool IsTracingActions => _currentTxTracer.IsTracingActions; public bool IsTracingOpLevelStorage => _currentTxTracer.IsTracingOpLevelStorage; @@ -42,7 +42,8 @@ public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEn if (_currentTxTracer.IsTracingReceipt) { - _currentTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs); + // TODO: is no stateRoot a bug? + _currentTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, null); } } @@ -58,30 +59,31 @@ public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string if (_currentTxTracer.IsTracingReceipt) { - _currentTxTracer.MarkAsFailed(recipient, gasSpent, output, error); + // TODO: is no stateRoot a bug? + _currentTxTracer.MarkAsFailed(recipient, gasSpent, output, error, null); } } - private TxReceipt BuildFailedReceipt(Address recipient, long gasSpent, string error, Hash256? stateRoot = null) + protected TxReceipt BuildFailedReceipt(Address recipient, long gasSpent, string error, Hash256? stateRoot) { TxReceipt receipt = BuildReceipt(recipient, gasSpent, StatusCode.Failure, Array.Empty(), stateRoot); receipt.Error = error; return receipt; } - private TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot = null) + protected virtual TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot) { - Transaction transaction = _currentTx!; + Transaction transaction = CurrentTx!; TxReceipt txReceipt = new() { Logs = logEntries, TxType = transaction.Type, Bloom = logEntries.Length == 0 ? Bloom.Empty : new Bloom(logEntries), - GasUsedTotal = _block.GasUsed, + GasUsedTotal = Block.GasUsed, StatusCode = statusCode, Recipient = transaction.IsContractCreation ? null : recipient, - BlockHash = _block.Hash, - BlockNumber = _block.Number, + BlockHash = Block.Hash, + BlockNumber = Block.Number, Index = _currentIndex, GasUsed = spentGas, Sender = transaction.SenderAddress, @@ -193,7 +195,7 @@ public void ReportFees(UInt256 fees, UInt256 burntFees) private ITxTracer _currentTxTracer = NullTxTracer.Instance; private int _currentIndex; private readonly List _txReceipts = new(); - private Transaction? _currentTx; + protected Transaction? CurrentTx; public IReadOnlyList TxReceipts => _txReceipts; public TxReceipt LastReceipt => _txReceipts[^1]; public bool IsTracingRewards => _otherTracer.IsTracingRewards; @@ -211,7 +213,7 @@ public void Restore(int snapshot) _txReceipts.RemoveAt(_txReceipts.Count - 1); } - _block.Header.GasUsed = _txReceipts.Count > 0 ? _txReceipts.Last().GasUsedTotal : 0; + Block.Header.GasUsed = _txReceipts.Count > 0 ? _txReceipts.Last().GasUsedTotal : 0; } public void ReportReward(Address author, string rewardType, UInt256 rewardValue) => @@ -224,7 +226,7 @@ public void StartNewBlockTrace(Block block) throw new InvalidOperationException("other tracer not set in receipts tracer"); } - _block = block; + Block = block; _currentIndex = 0; _txReceipts.Clear(); @@ -233,7 +235,7 @@ public void StartNewBlockTrace(Block block) public ITxTracer StartNewTxTrace(Transaction? tx) { - _currentTx = tx; + CurrentTx = tx; _currentTxTracer = _otherTracer.StartNewTxTrace(tx); return _currentTxTracer; } @@ -250,7 +252,7 @@ public void EndBlockTrace() if (_txReceipts.Count > 0) { Bloom blockBloom = new(); - _block.Header.Bloom = blockBloom; + Block.Header.Bloom = blockBloom; for (int index = 0; index < _txReceipts.Count; index++) { TxReceipt? receipt = _txReceipts[index]; diff --git a/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs b/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs index 2e613d8c8e9..bd1e9e4db65 100644 --- a/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs +++ b/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs @@ -54,6 +54,19 @@ public void Test1559(long minimum, long maxFeePerGas, long maxPriorityFeePerGas, specProvider.GetSpec(Arg.Any(), Arg.Any()).IsEip1559Enabled.Returns(true); specProvider.GetSpec(Arg.Any()).IsEip1559Enabled.Returns(true); specProvider.GetSpec(Arg.Any()).IsEip1559Enabled.Returns(true); + + specProvider.GetSpec(Arg.Any()).ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + specProvider.GetSpec(Arg.Any()).BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + specProvider.GetSpec(Arg.Any()).ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); + + specProvider.GetSpec(Arg.Any(), Arg.Any()).ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + specProvider.GetSpec(Arg.Any(), Arg.Any()).BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + specProvider.GetSpec(Arg.Any(), Arg.Any()).ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); + + specProvider.GetSpec(Arg.Any()).ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + specProvider.GetSpec(Arg.Any()).BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + specProvider.GetSpec(Arg.Any()).ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); + BlocksConfig blocksConfig = new() { MinGasPrice = (UInt256)minimum diff --git a/src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs b/src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs new file mode 100644 index 00000000000..5485998ec55 --- /dev/null +++ b/src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using Nethermind.Blockchain; +using Nethermind.Blockchain.Find; +using Nethermind.Core; +using Nethermind.Core.Specs; +using Nethermind.State; + +namespace Nethermind.Optimism; + +public class Create2DeployerContractRewriter +{ + private IOPConfigHelper _opConfigHelper; + private ISpecProvider _specProvider; + private IBlockTree _blockTree; + + public Create2DeployerContractRewriter(IOPConfigHelper opConfigHelper, ISpecProvider specProvider, IBlockTree blockTree) + { + _opConfigHelper = opConfigHelper; + _specProvider = specProvider; + _blockTree = blockTree; + } + + public void RewriteContract(BlockHeader header, IWorldState worldState) + { + IReleaseSpec spec = _specProvider.GetSpec(header); + BlockHeader? parent = _blockTree.FindParent(header, BlockTreeLookupOptions.None)?.Header; + if ((parent is null || !_opConfigHelper.IsCanyon(parent)) && _opConfigHelper.IsCanyon(header)) + { + worldState.InsertCode(_opConfigHelper.Create2DeployerAddress!, _opConfigHelper.Create2DeployerCode, spec); + } + } +} diff --git a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs index 2875a2b7e9a..e59e591d4b4 100644 --- a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs @@ -11,4 +11,7 @@ public interface IOPConfigHelper bool IsBedrock(BlockHeader header); bool IsRegolith(BlockHeader header); + bool IsCanyon(BlockHeader header); + Address? Create2DeployerAddress { get; } + byte[]? Create2DeployerCode { get; } } diff --git a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs index 6920765a0dc..fb7b53726ff 100644 --- a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs +++ b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs @@ -5,6 +5,7 @@ using Nethermind.Api; using Nethermind.Blockchain.Services; using Nethermind.Config; +using Nethermind.Consensus.Processing; using Nethermind.Consensus.Producers; using Nethermind.Consensus.Validators; using Nethermind.Evm; @@ -27,11 +28,7 @@ public InitializeBlockchainOptimism(OptimismNethermindApi api) : base(api) protected override Task InitBlockchain() { - _api.SpecHelper = new( - _api.ChainSpec.Optimism.RegolithTimestamp, - _api.ChainSpec.Optimism.BedrockBlockNumber, - _api.ChainSpec.Optimism.L1FeeRecipient - ); + _api.SpecHelper = new(_api.ChainSpec.Optimism); _api.L1CostHelper = new(_api.SpecHelper, _api.ChainSpec.Optimism.L1BlockAddress); return base.InitBlockchain(); @@ -84,6 +81,32 @@ protected override IBlockValidator CreateBlockValidator() return new InvalidBlockInterceptor(blockValidator, _api.InvalidChainTracker, _api.LogManager); } + protected override BlockProcessor CreateBlockProcessor() + { + if (_api.DbProvider is null) throw new StepDependencyException(nameof(_api.DbProvider)); + if (_api.RewardCalculatorSource is null) throw new StepDependencyException(nameof(_api.RewardCalculatorSource)); + if (_api.TransactionProcessor is null) throw new StepDependencyException(nameof(_api.TransactionProcessor)); + if (_api.SpecHelper is null) throw new StepDependencyException(nameof(_api.SpecHelper)); + if (_api.SpecProvider is null) throw new StepDependencyException(nameof(_api.SpecProvider)); + if (_api.BlockTree is null) throw new StepDependencyException(nameof(_api.BlockTree)); + if (_api.WorldState is null) throw new StepDependencyException(nameof(_api.WorldState)); + + Create2DeployerContractRewriter contractRewriter = + new(_api.SpecHelper, _api.SpecProvider, _api.BlockTree); + + return new OptimismBlockProcessor( + _api.SpecProvider, + _api.BlockValidator, + _api.RewardCalculatorSource.Get(_api.TransactionProcessor!), + new BlockProcessor.BlockValidationTransactionsExecutor(_api.TransactionProcessor, _api.WorldState), + _api.WorldState, + _api.ReceiptStorage, + _api.WitnessCollector, + _api.LogManager, + _api.SpecHelper, + contractRewriter); + } + protected override IUnclesValidator CreateUnclesValidator() => Always.Valid; protected override IHealthHintService CreateHealthHintService() => diff --git a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs index d9c56cf389c..3902d88b024 100644 --- a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; +using Nethermind.Specs.ChainSpecStyle; namespace Nethermind.Optimism; @@ -9,14 +10,18 @@ public class OPSpecHelper : IOPConfigHelper { private readonly ulong _regolithTimestamp; private readonly long _bedrockBlockNumber; + private readonly ulong? _canyonTimestamp; public Address L1FeeReceiver { get; init; } - public OPSpecHelper(ulong regolithTimestamp, long bedrockBlockNumber, Address l1FeeReceiver) + public OPSpecHelper(OptimismParameters parameters) { - _regolithTimestamp = regolithTimestamp; - _bedrockBlockNumber = bedrockBlockNumber; - L1FeeReceiver = l1FeeReceiver; + _regolithTimestamp = parameters.RegolithTimestamp; + _bedrockBlockNumber = parameters.BedrockBlockNumber; + _canyonTimestamp = parameters.CanyonTimestamp; + L1FeeReceiver = parameters.L1FeeRecipient; + Create2DeployerCode = parameters.Create2DeployerCode; + Create2DeployerAddress = parameters.Create2DeployerAddress; } public bool IsRegolith(BlockHeader header) @@ -28,4 +33,12 @@ public bool IsBedrock(BlockHeader header) { return header.Number >= _bedrockBlockNumber; } + + public bool IsCanyon(BlockHeader header) + { + return header.Timestamp >= (_canyonTimestamp ?? long.MaxValue); + } + + public Address? Create2DeployerAddress { get; } + public byte[]? Create2DeployerCode { get; } } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs new file mode 100644 index 00000000000..50389d91351 --- /dev/null +++ b/src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using Nethermind.Blockchain.Receipts; +using Nethermind.Consensus.Processing; +using Nethermind.Consensus.Rewards; +using Nethermind.Consensus.Validators; +using Nethermind.Consensus.Withdrawals; +using Nethermind.Core; +using Nethermind.Core.Specs; +using Nethermind.Evm.Tracing; +using Nethermind.Logging; +using Nethermind.State; + +namespace Nethermind.Optimism; + +public class OptimismBlockProcessor : BlockProcessor +{ + private Create2DeployerContractRewriter? _contractRewriter; + + public OptimismBlockProcessor( + ISpecProvider? specProvider, + IBlockValidator? blockValidator, + IRewardCalculator? rewardCalculator, + IBlockProcessor.IBlockTransactionsExecutor? blockTransactionsExecutor, + IWorldState? stateProvider, + IReceiptStorage? receiptStorage, + IWitnessCollector? witnessCollector, + ILogManager? logManager, + IOPConfigHelper opConfigHelper, + Create2DeployerContractRewriter contractRewriter, + IWithdrawalProcessor? withdrawalProcessor = null) + : base(specProvider, blockValidator, rewardCalculator, blockTransactionsExecutor, + stateProvider, receiptStorage, witnessCollector, logManager, withdrawalProcessor) + { + ArgumentNullException.ThrowIfNull(stateProvider); + _contractRewriter = contractRewriter; + ReceiptsTracer = new OptimismBlockReceiptTracer(opConfigHelper, stateProvider); + } + + protected override TxReceipt[] ProcessBlock(Block block, IBlockTracer blockTracer, ProcessingOptions options) + { + _contractRewriter?.RewriteContract(block.Header, _stateProvider); + return base.ProcessBlock(block, blockTracer, options); + } +} diff --git a/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs b/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs index 7393e7fdfa8..42df6a18aa3 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs @@ -10,14 +10,11 @@ using Nethermind.Consensus.Rewards; using Nethermind.Consensus.Transactions; using Nethermind.Consensus.Validators; -using Nethermind.Core; +using Nethermind.Consensus.Withdrawals; using Nethermind.Core.Specs; -using Nethermind.Db; -using Nethermind.Evm.TransactionProcessing; using Nethermind.Logging; using Nethermind.Specs.ChainSpecStyle; using Nethermind.State; -using Nethermind.Trie.Pruning; using Nethermind.TxPool; namespace Nethermind.Optimism; @@ -74,4 +71,26 @@ protected override ITxSource CreateTxSourceForProducer(ITxSource? additionalTxSo return new OptimismTxPoolTxSource(baseTxSource); } + + protected override BlockProcessor CreateBlockProcessor( + ReadOnlyTxProcessingEnv readOnlyTxProcessingEnv, + ISpecProvider specProvider, + IBlockValidator blockValidator, + IRewardCalculatorSource rewardCalculatorSource, + IReceiptStorage receiptStorage, + ILogManager logManager, + IBlocksConfig blocksConfig) + { + return new OptimismBlockProcessor(specProvider, + blockValidator, + rewardCalculatorSource.Get(readOnlyTxProcessingEnv.TransactionProcessor), + TransactionsExecutorFactory.Create(readOnlyTxProcessingEnv), + readOnlyTxProcessingEnv.StateProvider, + receiptStorage, + NullWitnessCollector.Instance, + logManager, + _specHelper, + new Create2DeployerContractRewriter(_specHelper, _specProvider, _blockTree), + new BlockProductionWithdrawalProcessor(new WithdrawalProcessor(readOnlyTxProcessingEnv.StateProvider, logManager))); + } } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs b/src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs new file mode 100644 index 00000000000..95048f27080 --- /dev/null +++ b/src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using Nethermind.Core; +using Nethermind.Core.Crypto; +using Nethermind.Evm.Tracing; +using Nethermind.State; + +namespace Nethermind.Optimism; + +public class OptimismBlockReceiptTracer : BlockReceiptsTracer +{ + private IOPConfigHelper _opConfigHelper; + private IWorldState _worldState; + + public OptimismBlockReceiptTracer(IOPConfigHelper opConfigHelper, IWorldState worldState) + { + _opConfigHelper = opConfigHelper; + _worldState = worldState; + } + + private (ulong?, ulong?) GetDepositReceiptData(BlockHeader header) + { + ArgumentNullException.ThrowIfNull(CurrentTx); + + ulong? depositNonce = null; + ulong? version = null; + + if (CurrentTx.IsDeposit()) + { + depositNonce = _worldState.GetNonce(CurrentTx.SenderAddress!).ToUInt64(null); + if (_opConfigHelper.IsCanyon(header)) + { + version = 1; + } + } + + return (depositNonce == 0 ? 0 : depositNonce - 1, version); + } + + protected override TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot) + { + (ulong? depositNonce, ulong? version) = GetDepositReceiptData(Block.Header); + TxReceipt receipt = base.BuildReceipt(recipient, spentGas, statusCode, logEntries, stateRoot); + receipt.DepositNonce = depositNonce; + receipt.DepositReceiptVersion = version; + return receipt; + } +} diff --git a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs index b58391a4317..ac0f4c4f2e4 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs @@ -33,11 +33,10 @@ public OptimismTransactionProcessor( protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITxTracer tracer, ExecutionOptions opts) { + IReleaseSpec spec = SpecProvider.GetSpec(blCtx.Header); _currentTxL1Cost = null; if (tx.IsDeposit()) { - IReleaseSpec spec = SpecProvider.GetSpec(blCtx.Header); - WorldState.AddToBalanceAndCreateIfNotExists(tx.SenderAddress!, tx.Mint, spec); if (opts.HasFlag(ExecutionOptions.Commit) || !spec.IsEip658Enabled) diff --git a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs index 052a6e766b1..ce58b0c0c95 100644 --- a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs +++ b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs @@ -57,8 +57,14 @@ public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBeha { entries[i] = Rlp.Decode(rlpStream, RlpBehaviors.AllowExtraBytes); } - txReceipt.Logs = entries; + + if (txReceipt.TxType == TxType.DepositTx && rlpStream.Position != lastCheck) + { + txReceipt.DepositNonce = rlpStream.DecodeUlong(); + txReceipt.DepositReceiptVersion = rlpStream.DecodeUlong(); + } + return txReceipt; } @@ -85,6 +91,12 @@ private static (int Total, int Logs) GetContentLength(TxReceipt item, RlpBehavio : Rlp.LengthOf(item.PostTransactionState); } + if (item.TxType == TxType.DepositTx && item.DepositReceiptVersion is not null) + { + contentLength += Rlp.LengthOf(item.DepositNonce ?? 0); + contentLength += Rlp.LengthOf(item.DepositReceiptVersion.Value); + } + return (contentLength, logsLength); } @@ -173,6 +185,12 @@ public void Encode(RlpStream rlpStream, TxReceipt item, RlpBehaviors rlpBehavior { rlpStream.Encode(item.Logs[i]); } + + if (item.TxType == TxType.DepositTx && item.DepositReceiptVersion is not null) + { + rlpStream.Encode(item.DepositNonce!.Value); + rlpStream.Encode(item.DepositReceiptVersion.Value); + } } } } diff --git a/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs b/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs index 225168c5b1d..b36a57071d0 100644 --- a/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs @@ -157,5 +157,8 @@ public ulong Eip4844TransitionTimestamp public bool IsEip6780Enabled => _spec.IsEip6780Enabled; public bool IsEip4788Enabled => _spec.IsEip4788Enabled; public Address Eip4788ContractAddress => _spec.Eip4788ContractAddress; + public UInt256 ForkBaseFee => _spec.ForkBaseFee; + public UInt256 BaseFeeMaxChangeDenominator => _spec.BaseFeeMaxChangeDenominator; + public long ElasticityMultiplier => _spec.ElasticityMultiplier; } } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs index 2b5f645602b..817250bc01e 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs @@ -54,11 +54,11 @@ public class ChainParameters public long? Eip3541Transition { get; set; } public long? Eip3607Transition { get; set; } - public UInt256 Eip1559BaseFeeInitialValue { get; set; } + public UInt256? Eip1559BaseFeeInitialValue { get; set; } - public UInt256 Eip1559BaseFeeMaxChangeDenominator { get; set; } + public UInt256? Eip1559BaseFeeMaxChangeDenominator { get; set; } - public long Eip1559ElasticityMultiplier { get; set; } + public long? Eip1559ElasticityMultiplier { get; set; } /// /// Transaction permission managing contract address. diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs index 4e94afb5f12..7aad4bac04f 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Numerics; using System.Reflection; +using Nethermind.Core; using Nethermind.Core.Specs; using Nethermind.Int256; using Nethermind.Logging; @@ -205,8 +206,18 @@ private static ReleaseSpec CreateReleaseSpec(ChainSpec chainSpec, long releaseSt releaseSpec.IsEip3607Enabled = (chainSpec.Parameters.Eip3607Transition ?? long.MaxValue) <= releaseStartBlock; releaseSpec.ValidateChainId = (chainSpec.Parameters.ValidateChainIdTransition ?? 0) <= releaseStartBlock; releaseSpec.ValidateReceipts = ((chainSpec.Parameters.ValidateReceiptsTransition > 0) ? Math.Max(chainSpec.Parameters.ValidateReceiptsTransition ?? 0, chainSpec.Parameters.Eip658Transition ?? 0) : 0) <= releaseStartBlock; + releaseSpec.Eip1559FeeCollector = releaseSpec.IsEip1559Enabled && (chainSpec.Parameters.Eip1559FeeCollectorTransition ?? long.MaxValue) <= releaseStartBlock ? chainSpec.Parameters.Eip1559FeeCollector : null; releaseSpec.Eip1559BaseFeeMinValue = releaseSpec.IsEip1559Enabled && (chainSpec.Parameters.Eip1559BaseFeeMinValueTransition ?? long.MaxValue) <= releaseStartBlock ? chainSpec.Parameters.Eip1559BaseFeeMinValue : null; + releaseSpec.ElasticityMultiplier = chainSpec.Parameters.Eip1559ElasticityMultiplier ?? Eip1559Constants.DefaultElasticityMultiplier; + releaseSpec.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue ?? Eip1559Constants.DefaultForkBaseFee; + releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator ?? Eip1559Constants.DefaultBaseFeeMaxChangeDenominator; + + if (chainSpec.Optimism?.CanyonTimestamp <= releaseStartTimestamp) + { + releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Optimism.CanyonBaseFeeChangeDenominator; + } + if (chainSpec.Ethash is not null) { diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs index 163834c1a40..ec649bbda53 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs @@ -157,10 +157,10 @@ bool GetForInnerPathExistence(KeyValuePair o) TransactionPermissionContractTransition = chainSpecJson.Params.TransactionPermissionContractTransition, ValidateChainIdTransition = chainSpecJson.Params.ValidateChainIdTransition, ValidateReceiptsTransition = chainSpecJson.Params.ValidateReceiptsTransition, - Eip1559ElasticityMultiplier = chainSpecJson.Params.Eip1559ElasticityMultiplier ?? Eip1559Constants.ElasticityMultiplier, - Eip1559BaseFeeInitialValue = chainSpecJson.Params.Eip1559BaseFeeInitialValue ?? Eip1559Constants.ForkBaseFee, + Eip1559ElasticityMultiplier = chainSpecJson.Params.Eip1559ElasticityMultiplier ?? Eip1559Constants.DefaultElasticityMultiplier, + Eip1559BaseFeeInitialValue = chainSpecJson.Params.Eip1559BaseFeeInitialValue ?? Eip1559Constants.DefaultForkBaseFee, Eip1559BaseFeeMaxChangeDenominator = chainSpecJson.Params.Eip1559BaseFeeMaxChangeDenominator ?? - Eip1559Constants.BaseFeeMaxChangeDenominator, + Eip1559Constants.DefaultBaseFeeMaxChangeDenominator, Eip1559FeeCollector = chainSpecJson.Params.Eip1559FeeCollector, Eip1559FeeCollectorTransition = chainSpecJson.Params.Eip1559FeeCollectorTransition, Eip1559BaseFeeMinValueTransition = chainSpecJson.Params.Eip1559BaseFeeMinValueTransition, @@ -180,10 +180,6 @@ bool GetForInnerPathExistence(KeyValuePair o) ?? GetTransitionForExpectedPricing("alt_bn128_pairing", "price.alt_bn128_pairing.base", 45000); chainSpec.Parameters.Eip2565Transition ??= GetTransitionIfInnerPathExists("modexp", "price.modexp2565"); - Eip1559Constants.ElasticityMultiplier = chainSpec.Parameters.Eip1559ElasticityMultiplier; - Eip1559Constants.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue; - Eip1559Constants.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator; - Eip4844Constants.OverrideIfAny( chainSpec.Parameters.Eip4844BlobGasPriceUpdateFraction, chainSpec.Parameters.Eip4844MaxBlobGasPerBlock, @@ -347,8 +343,12 @@ static AuRaParameters.Validator LoadValidator(ChainSpecJson.AuRaValidatorJson va { RegolithTimestamp = chainSpecJson.Engine.Optimism.RegolithTimestamp, BedrockBlockNumber = chainSpecJson.Engine.Optimism.BedrockBlockNumber, + CanyonTimestamp = chainSpecJson.Engine.Optimism.CanyonTimestamp, L1FeeRecipient = chainSpecJson.Engine.Optimism.L1FeeRecipient, - L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress + L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress, + CanyonBaseFeeChangeDenominator = chainSpecJson.Engine.Optimism.CanyonBaseFeeChangeDenominator, + Create2DeployerAddress = chainSpecJson.Engine.Optimism.Create2DeployerAddress, + Create2DeployerCode = chainSpecJson.Engine.Optimism.Create2DeployerCode }; } else if (chainSpecJson.Engine?.NethDev is not null) diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index 4bf9b38fe2f..d819732c34f 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -7,6 +7,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using Nethermind.Core; +using Nethermind.Core.Crypto; using Nethermind.Int256; namespace Nethermind.Specs.ChainSpecStyle.Json @@ -171,8 +172,12 @@ internal class OptimismEngineJson { public ulong RegolithTimestamp => Params.RegolithTimestamp; public long BedrockBlockNumber => Params.BedrockBlockNumber; + public ulong? CanyonTimestamp => Params.CanyonTimestamp; public Address L1FeeRecipient => Params.L1FeeRecipient; public Address L1BlockAddress => Params.L1BlockAddress; + public UInt256 CanyonBaseFeeChangeDenominator => Params.CanyonBaseFeeChangeDenominator; + public Address Create2DeployerAddress => Params.Create2DeployerAddress; + public byte[] Create2DeployerCode => Params.Create2DeployerCode; public OptimismEngineParamsJson Params { get; set; } } @@ -180,8 +185,12 @@ internal class OptimismEngineParamsJson { public ulong RegolithTimestamp { get; set; } public long BedrockBlockNumber { get; set; } + public ulong? CanyonTimestamp { get; set; } public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } + public UInt256 CanyonBaseFeeChangeDenominator { get; set; } + public Address Create2DeployerAddress { get; set; } + public byte[] Create2DeployerCode { get; set; } } internal class NethDevJson diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs index 586481dbc96..b2439224257 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only -using System.Collections.Generic; using Nethermind.Core; using Nethermind.Int256; @@ -13,8 +12,16 @@ public class OptimismParameters public long BedrockBlockNumber { get; set; } + public ulong? CanyonTimestamp { get; set; } + public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } + + public UInt256 CanyonBaseFeeChangeDenominator { get; set; } + + public Address Create2DeployerAddress { get; set; } + + public byte[] Create2DeployerCode { get; set; } } } diff --git a/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs b/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs index fa886f82fa6..5de83c8356b 100644 --- a/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs @@ -72,6 +72,9 @@ public ReleaseSpec Clone() public ulong Eip4844TransitionTimestamp { get; set; } public Address Eip1559FeeCollector { get; set; } public UInt256? Eip1559BaseFeeMinValue { get; set; } + public UInt256 ForkBaseFee { get; set; } = Eip1559Constants.DefaultForkBaseFee; + public UInt256 BaseFeeMaxChangeDenominator { get; set; } = Eip1559Constants.DefaultBaseFeeMaxChangeDenominator; + public long ElasticityMultiplier { get; set; } = Eip1559Constants.DefaultElasticityMultiplier; public bool IsEip1153Enabled { get; set; } public bool IsEip3651Enabled { get; set; } public bool IsEip3855Enabled { get; set; } diff --git a/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs b/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs index b4c0c4d29e8..8774d7a03ae 100644 --- a/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs @@ -130,5 +130,8 @@ public bool IsEip158IgnoredAccount(Address address) public bool IsEip6780Enabled => _spec.IsEip6780Enabled; public bool IsEip4788Enabled => _spec.IsEip4788Enabled; public Address Eip4788ContractAddress => _spec.Eip4788ContractAddress; + public UInt256 ForkBaseFee => _spec.ForkBaseFee; + public UInt256 BaseFeeMaxChangeDenominator => _spec.BaseFeeMaxChangeDenominator; + public long ElasticityMultiplier => _spec.ElasticityMultiplier; } }