Skip to content

Commit fb0f1c4

Browse files
committed
estimator: fix access list decoding
1 parent f2a82ed commit fb0f1c4

2 files changed

Lines changed: 71 additions & 7 deletions

File tree

lib/estimator/estimator.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,16 +208,12 @@ func accessList(
208208
provider *ethrpc.Provider,
209209
) (types.AccessList, error) {
210210
into := func(raw json.RawMessage, ret *types.AccessList, strictness ethrpc.StrictnessLevel) error {
211-
var response struct {
212-
AccessList types.AccessList `json:"accessList,omitempty"`
213-
}
214-
215-
err := json.Unmarshal(raw, &response)
211+
decoded, err := decodeAccessListResponse(raw)
216212
if err != nil {
217-
return fmt.Errorf("unable to decode eth_createAccessList response: %w", err)
213+
return err
218214
}
219215

220-
*ret = response.AccessList
216+
*ret = decoded
221217
return nil
222218
}
223219

@@ -243,3 +239,34 @@ func accessList(
243239

244240
return list, nil
245241
}
242+
243+
func decodeAccessListResponse(raw json.RawMessage) (types.AccessList, error) {
244+
type accessTuple struct {
245+
Address *common.Address `json:"address"`
246+
StorageKeys []common.Hash `json:"storageKeys"`
247+
}
248+
249+
var response struct {
250+
AccessList []accessTuple `json:"accessList,omitempty"`
251+
}
252+
253+
err := json.Unmarshal(raw, &response)
254+
if err != nil {
255+
return nil, fmt.Errorf("unable to decode eth_createAccessList response: %w", err)
256+
}
257+
258+
list := make(types.AccessList, 0, len(response.AccessList))
259+
260+
for _, tuple := range response.AccessList {
261+
if tuple.Address == nil {
262+
return nil, fmt.Errorf("unable to decode eth_createAccessList response: missing required field 'address' for AccessTuple")
263+
}
264+
265+
list = append(list, types.AccessTuple{
266+
Address: *tuple.Address,
267+
StorageKeys: tuple.StorageKeys,
268+
})
269+
}
270+
271+
return list, nil
272+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package estimator
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/0xsequence/ethkit/go-ethereum/common"
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestDecodeAccessListResponseAllowsMissingStorageKeys(t *testing.T) {
13+
address := common.HexToAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48")
14+
15+
list, err := decodeAccessListResponse(json.RawMessage(`{
16+
"accessList": [
17+
{
18+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
19+
}
20+
]
21+
}`))
22+
require.NoError(t, err)
23+
require.Len(t, list, 1)
24+
assert.Equal(t, address, list[0].Address)
25+
assert.Nil(t, list[0].StorageKeys)
26+
}
27+
28+
func TestDecodeAccessListResponseRequiresAddress(t *testing.T) {
29+
_, err := decodeAccessListResponse(json.RawMessage(`{
30+
"accessList": [
31+
{
32+
"storageKeys": []
33+
}
34+
]
35+
}`))
36+
require.EqualError(t, err, "unable to decode eth_createAccessList response: missing required field 'address' for AccessTuple")
37+
}

0 commit comments

Comments
 (0)