From a2e1667b17ca4a26b2376a1c1e62788b7747869d Mon Sep 17 00:00:00 2001 From: Felipe Andrade Date: Wed, 31 May 2023 10:04:20 -0700 Subject: [PATCH] feat(proxyd): add debug_getRawReceipts to consensus --- proxyd/proxyd/README.md | 1 + proxyd/proxyd/rewriter.go | 14 +++++---- proxyd/proxyd/rewriter_test.go | 52 ++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/proxyd/proxyd/README.md b/proxyd/proxyd/README.md index 346831f..e0735c0 100644 --- a/proxyd/proxyd/README.md +++ b/proxyd/proxyd/README.md @@ -71,6 +71,7 @@ The following request methods are rewritten: * `eth_getBlockByNumber` * `eth_getTransactionByBlockNumberAndIndex` * `eth_getUncleByBlockNumberAndIndex` +* `debug_getRawReceipts` And `eth_blockNumber` response is overridden with current block consensus. diff --git a/proxyd/proxyd/rewriter.go b/proxyd/proxyd/rewriter.go index 08d5638..71dd361 100644 --- a/proxyd/proxyd/rewriter.go +++ b/proxyd/proxyd/rewriter.go @@ -63,24 +63,26 @@ func RewriteRequest(rctx RewriteContext, req *RPCReq, res *RPCRes) (RewriteResul case "eth_getLogs", "eth_newFilter": return rewriteRange(rctx, req, res, 0) + case "debug_getRawReceipts": + return rewriteParam(rctx, req, res, 0, true) case "eth_getBalance", "eth_getCode", "eth_getTransactionCount", "eth_call": - return rewriteParam(rctx, req, res, 1) + return rewriteParam(rctx, req, res, 1, false) case "eth_getStorageAt": - return rewriteParam(rctx, req, res, 2) + return rewriteParam(rctx, req, res, 2, false) case "eth_getBlockTransactionCountByNumber", "eth_getUncleCountByBlockNumber", "eth_getBlockByNumber", "eth_getTransactionByBlockNumberAndIndex", "eth_getUncleByBlockNumberAndIndex": - return rewriteParam(rctx, req, res, 0) + return rewriteParam(rctx, req, res, 0, false) } return RewriteNone, nil } -func rewriteParam(rctx RewriteContext, req *RPCReq, res *RPCRes, pos int) (RewriteResult, error) { +func rewriteParam(rctx RewriteContext, req *RPCReq, res *RPCRes, pos int, required bool) (RewriteResult, error) { var p []interface{} err := json.Unmarshal(req.Params, &p) if err != nil { @@ -89,9 +91,9 @@ func rewriteParam(rctx RewriteContext, req *RPCReq, res *RPCRes, pos int) (Rewri // we assume latest if the param is missing, // and we don't rewrite if there is not enough params - if len(p) == pos { + if len(p) == pos && !required { p = append(p, "latest") - } else if len(p) < pos { + } else if len(p) <= pos { return RewriteNone, nil } diff --git a/proxyd/proxyd/rewriter_test.go b/proxyd/proxyd/rewriter_test.go index eb7f18f..087b804 100644 --- a/proxyd/proxyd/rewriter_test.go +++ b/proxyd/proxyd/rewriter_test.go @@ -148,6 +148,58 @@ func TestRewriteRequest(t *testing.T) { expected: RewriteOverrideError, expectedErr: ErrRewriteBlockOutOfRange, }, + /* required parameter at pos 0 */ + { + name: "debug_getRawReceipts latest", + args: args{ + rctx: RewriteContext{latest: hexutil.Uint64(100)}, + req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{"latest"})}, + res: nil, + }, + expected: RewriteOverrideRequest, + check: func(t *testing.T, args args) { + var p []string + err := json.Unmarshal(args.req.Params, &p) + require.Nil(t, err) + require.Equal(t, 1, len(p)) + require.Equal(t, hexutil.Uint64(100).String(), p[0]) + }, + }, + { + name: "debug_getRawReceipts within range", + args: args{ + rctx: RewriteContext{latest: hexutil.Uint64(100)}, + req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{hexutil.Uint64(55).String()})}, + res: nil, + }, + expected: RewriteNone, + check: func(t *testing.T, args args) { + var p []string + err := json.Unmarshal(args.req.Params, &p) + require.Nil(t, err) + require.Equal(t, 1, len(p)) + require.Equal(t, hexutil.Uint64(55).String(), p[0]) + }, + }, + { + name: "debug_getRawReceipts out of range", + args: args{ + rctx: RewriteContext{latest: hexutil.Uint64(100)}, + req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{hexutil.Uint64(111).String()})}, + res: nil, + }, + expected: RewriteOverrideError, + expectedErr: ErrRewriteBlockOutOfRange, + }, + { + name: "debug_getRawReceipts missing parameter", + args: args{ + rctx: RewriteContext{latest: hexutil.Uint64(100)}, + req: &RPCReq{Method: "debug_getRawReceipts", Params: mustMarshalJSON([]string{})}, + res: nil, + }, + expected: RewriteNone, + }, /* default block parameter */ { name: "eth_getCode omit block, should add",