Skip to content

Commit

Permalink
Make "pending" block param act as "latest" (#974)
Browse files Browse the repository at this point in the history
* Make pending act as latest in:
 - fetching blocks by Number/String/Hash
 - decoding JSON-RPC requests
 - fetching blocks by number

* Fixed e2e tests for pending = latest.

* Fixed TestGetNumericBlockNumber test.

* Removed Pending block number unsupported error
  • Loading branch information
lazartravica committed Nov 30, 2022
1 parent 2962f20 commit ec48ac4
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 26 deletions.
6 changes: 2 additions & 4 deletions jsonrpc/codec.go
Expand Up @@ -154,11 +154,9 @@ func stringToBlockNumber(str string) (BlockNumber, error) {

str = strings.Trim(str, "\"")
switch str {
case "pending":
return PendingBlockNumber, nil
case "latest":
case pending, latest:
return LatestBlockNumber, nil
case "earliest":
case earliest:
return EarliestBlockNumber, nil
}

Expand Down
2 changes: 1 addition & 1 deletion jsonrpc/dispatcher_test.go
Expand Up @@ -276,7 +276,7 @@ func TestDispatcherFuncDecode(t *testing.T) {
{
"filter",
`[{"fromBlock": "pending", "toBlock": "earliest"}]`,
LogQuery{fromBlock: PendingBlockNumber, toBlock: EarliestBlockNumber},
LogQuery{fromBlock: LatestBlockNumber, toBlock: EarliestBlockNumber}, // pending = latest
},
}

Expand Down
11 changes: 2 additions & 9 deletions jsonrpc/helper.go
Expand Up @@ -11,7 +11,6 @@ import (
var (
ErrHeaderNotFound = errors.New("header not found")
ErrLatestNotFound = errors.New("latest header not found")
ErrPendingBlockNumber = errors.New("fetching the pending header is not supported")
ErrNegativeBlockNumber = errors.New("invalid argument 0: block number must not be negative")
ErrFailedFetchGenesis = errors.New("error fetching genesis block header")
ErrNoDataInContractCreation = errors.New("contract creation without data provided")
Expand All @@ -24,7 +23,7 @@ type latestHeaderGetter interface {
// GetNumericBlockNumber returns block number based on current state or specified number
func GetNumericBlockNumber(number BlockNumber, store latestHeaderGetter) (uint64, error) {
switch number {
case LatestBlockNumber:
case LatestBlockNumber, PendingBlockNumber:
latest := store.Header()
if latest == nil {
return 0, ErrLatestNotFound
Expand All @@ -35,9 +34,6 @@ func GetNumericBlockNumber(number BlockNumber, store latestHeaderGetter) (uint64
case EarliestBlockNumber:
return 0, nil

case PendingBlockNumber:
return 0, ErrPendingBlockNumber

default:
if number < 0 {
return 0, ErrNegativeBlockNumber
Expand All @@ -55,7 +51,7 @@ type headerGetter interface {
// GetBlockHeader returns a header using the provided number
func GetBlockHeader(number BlockNumber, store headerGetter) (*types.Header, error) {
switch number {
case LatestBlockNumber:
case PendingBlockNumber, LatestBlockNumber:
return store.Header(), nil

case EarliestBlockNumber:
Expand All @@ -66,9 +62,6 @@ func GetBlockHeader(number BlockNumber, store headerGetter) (*types.Header, erro

return header, nil

case PendingBlockNumber:
return nil, ErrPendingBlockNumber

default:
// Convert the block number from hex to uint64
header, ok := store.GetHeaderByNumber(uint64(number))
Expand Down
56 changes: 45 additions & 11 deletions jsonrpc/helper_test.go
Expand Up @@ -72,7 +72,7 @@ func TestGetNumericBlockNumber(t *testing.T) {
err error
}{
{
name: "should return the latest block's number if latest is given",
name: "should return the latest block's number if it is found",
num: LatestBlockNumber,
store: &debugEndpointMockStore{
headerFn: func() *types.Header {
Expand All @@ -85,7 +85,7 @@ func TestGetNumericBlockNumber(t *testing.T) {
err: nil,
},
{
name: "should return the latest block's number if latest is given",
name: "should return error if the latest block's number is not found",
num: LatestBlockNumber,
store: &debugEndpointMockStore{
headerFn: func() *types.Header {
Expand All @@ -103,11 +103,41 @@ func TestGetNumericBlockNumber(t *testing.T) {
err: nil,
},
{
name: "should return error if pending is given",
num: PendingBlockNumber,
store: &debugEndpointMockStore{},
name: "should return latest if found and pending is given",
num: PendingBlockNumber,
store: &debugEndpointMockStore{
headerFn: func() *types.Header {
return &types.Header{
Number: 10,
}
},
},
expected: 10,
err: nil,
},
{
name: "should return error if given pending and the latest block's number is not found",
num: PendingBlockNumber,
store: &debugEndpointMockStore{
headerFn: func() *types.Header {
return nil
},
},
expected: 0,
err: ErrPendingBlockNumber,
err: ErrLatestNotFound,
},
{
name: "should return error for latest if not found and pending is given",
num: PendingBlockNumber,
store: &debugEndpointMockStore{
headerFn: func() *types.Header {
return &types.Header{
Number: 10,
}
},
},
expected: 10,
err: nil,
},
{
name: "should return error if negative number is given",
Expand Down Expand Up @@ -187,11 +217,15 @@ func TestGetBlockHeader(t *testing.T) {
err: ErrFailedFetchGenesis,
},
{
name: "should return error if pending is given",
num: PendingBlockNumber,
store: &debugEndpointMockStore{},
expected: nil,
err: ErrPendingBlockNumber,
name: "should return latest if pending is given",
num: PendingBlockNumber,
store: &debugEndpointMockStore{
headerFn: func() *types.Header {
return testLatestHeader
},
},
expected: testLatestHeader,
err: nil,
},
{
name: "should return header at arbitrary height",
Expand Down
2 changes: 1 addition & 1 deletion jsonrpc/query_test.go
Expand Up @@ -105,7 +105,7 @@ func TestFilterDecode(t *testing.T) {
"toBlock": "earliest"
}`,
&LogQuery{
fromBlock: PendingBlockNumber,
fromBlock: LatestBlockNumber, // pending = latest
toBlock: EarliestBlockNumber,
},
},
Expand Down

0 comments on commit ec48ac4

Please sign in to comment.