From bfae87127ac32f38a2f451bffd00b259978d4b1c Mon Sep 17 00:00:00 2001 From: "Sebastian A. Espindola" Date: Tue, 25 Feb 2025 16:58:51 -0300 Subject: [PATCH 1/3] fix: solves eth_createAccessList unmarshaling error --- internal/ethapi/api.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 34daf5a229..81b098200b 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1277,7 +1277,7 @@ type accessListResult struct { // CreateAccessList creates an EIP-2930 type AccessList for the given transaction. // Reexec and BlockNrOrHash can be specified to create the accessList on top of a certain state. -func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args TransactionArgs, state *state.StateDB, blockNrOrHash *rpc.BlockNumberOrHash) (*accessListResult, error) { +func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args TransactionArgs, blockNrOrHash *rpc.BlockNumberOrHash) (*accessListResult, error) { bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber) if blockNrOrHash != nil { bNrOrHash = *blockNrOrHash @@ -1297,7 +1297,7 @@ func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args Transaction } } - acl, gasUsed, vmerr, err := AccessList(ctx, api.b, bNrOrHash, args, state) + acl, gasUsed, vmerr, err := AccessList(ctx, api.b, bNrOrHash, args, nil) if err != nil { return nil, err } From 5e767b3bf5fa5edd3d2726f5b7285774170504a4 Mon Sep 17 00:00:00 2001 From: "Sebastian A. Espindola" Date: Wed, 26 Feb 2025 14:57:00 -0300 Subject: [PATCH 2/3] added back state --- internal/ethapi/api.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 81b098200b..83c85576cc 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1283,7 +1283,7 @@ func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args Transaction bNrOrHash = *blockNrOrHash } - header, err := headerByNumberOrHash(ctx, api.b, bNrOrHash) + state, header, err := api.b.StateAndHeaderByNumberOrHash(ctx, bNrOrHash) if err == nil && header != nil && api.b.ChainConfig().IsOptimismPreBedrock(header.Number) { if api.b.HistoricalRPCService() != nil { var res accessListResult @@ -1297,7 +1297,7 @@ func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args Transaction } } - acl, gasUsed, vmerr, err := AccessList(ctx, api.b, bNrOrHash, args, nil) + acl, gasUsed, vmerr, err := AccessList(ctx, api.b, bNrOrHash, args, state) if err != nil { return nil, err } From 491df94f7218ea4c2aa2fd571e4cd320f9ba109b Mon Sep 17 00:00:00 2001 From: protolambda Date: Wed, 5 Mar 2025 12:01:29 +0100 Subject: [PATCH 3/3] ethapi: preserve NotFound error, retrieve state once --- internal/ethapi/api.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 83c85576cc..044e3c67c4 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -1283,7 +1283,7 @@ func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args Transaction bNrOrHash = *blockNrOrHash } - state, header, err := api.b.StateAndHeaderByNumberOrHash(ctx, bNrOrHash) + header, err := headerByNumberOrHash(ctx, api.b, bNrOrHash) if err == nil && header != nil && api.b.ChainConfig().IsOptimismPreBedrock(header.Number) { if api.b.HistoricalRPCService() != nil { var res accessListResult @@ -1297,7 +1297,7 @@ func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args Transaction } } - acl, gasUsed, vmerr, err := AccessList(ctx, api.b, bNrOrHash, args, state) + acl, gasUsed, vmerr, err := AccessList(ctx, api.b, bNrOrHash, args) if err != nil { return nil, err } @@ -1311,12 +1311,13 @@ func (api *BlockChainAPI) CreateAccessList(ctx context.Context, args Transaction // AccessList creates an access list for the given transaction. // If the accesslist creation fails an error is returned. // If the transaction itself fails, an vmErr is returned. -func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrHash, args TransactionArgs, state *state.StateDB) (acl types.AccessList, gasUsed uint64, vmErr error, err error) { +func AccessList(ctx context.Context, b Backend, blockNrOrHash rpc.BlockNumberOrHash, args TransactionArgs) (acl types.AccessList, gasUsed uint64, vmErr error, err error) { // Retrieve the execution context db, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if db == nil || err != nil { return nil, 0, nil, err } + state := db // Ensure any missing fields are filled, extract the recipient and input data if err = args.setFeeDefaults(ctx, b, header); err != nil {