diff --git a/proxyd/proxyd/rewriter.go b/proxyd/proxyd/rewriter.go index 6b01c1a..35d78df 100644 --- a/proxyd/proxyd/rewriter.go +++ b/proxyd/proxyd/rewriter.go @@ -3,9 +3,9 @@ package proxyd import ( "encoding/json" "errors" - "strings" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/rpc" ) type RewriteContext struct { @@ -159,15 +159,21 @@ func rewriteTagMap(rctx RewriteContext, m map[string]interface{}, key string) (b } func rewriteTag(rctx RewriteContext, current string) (string, bool, error) { - if current == "latest" { + jv, err := json.Marshal(current) + if err != nil { + return "", false, err + } + + var bnh rpc.BlockNumberOrHash + err = bnh.UnmarshalJSON(jv) + if err != nil { + return "", false, err + } + + if bnh.BlockNumber != nil && *bnh.BlockNumber == rpc.LatestBlockNumber { return rctx.latest.String(), true, nil - } else if strings.HasPrefix(current, "0x") { - decode, err := hexutil.DecodeUint64(current) - if err != nil { - return current, false, err - } - b := hexutil.Uint64(decode) - if b > rctx.latest { + } else if bnh.BlockNumber != nil { + if hexutil.Uint64(bnh.BlockNumber.Int64()) > rctx.latest { return "", false, ErrRewriteBlockOutOfRange } } diff --git a/proxyd/proxyd/rewriter_test.go b/proxyd/proxyd/rewriter_test.go index 566ccdb..ed5e6a7 100644 --- a/proxyd/proxyd/rewriter_test.go +++ b/proxyd/proxyd/rewriter_test.go @@ -334,6 +334,18 @@ func TestRewriteRequest(t *testing.T) { expected: RewriteOverrideError, expectedErr: ErrRewriteBlockOutOfRange, }, + { + name: "eth_getStorageAt using rpc.BlockNumberOrHash", + args: args{ + rctx: RewriteContext{latest: hexutil.Uint64(100)}, + req: &RPCReq{Method: "eth_getStorageAt", Params: mustMarshalJSON([]string{ + "0xae851f927ee40de99aabb7461c00f9622ab91d60", + "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08", + "0x1c4840bcb3de3ac403c0075b46c2c47d4396c5b624b6e1b2874ec04e8879b483"})}, + res: nil, + }, + expected: RewriteNone, + }, } // generalize tests for other methods with same interface and behavior