diff --git a/rpc/args.go b/rpc/args.go
index 8d7427f6fc21b91339f55b297052a2a87e38fd10..7504293a4bff37374c9f61d781f46c8c0f94cebc 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -81,8 +81,10 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) {
 
 	if v, ok := obj[0].(float64); ok {
 		args.BlockNumber = int64(v)
+	} else if v, ok := obj[0].(string); ok {
+		args.BlockNumber = common.Big(v).Int64()
 	} else {
-		args.BlockNumber = common.Big(obj[0].(string)).Int64()
+		return NewDecodeParamError("blockNumber must be number or string")
 	}
 
 	if len(obj) > 1 {
diff --git a/rpc/args_test.go b/rpc/args_test.go
index b6d592a094ae37d5973471adcf4c9c41edcca7fc..b9a68d8bc5b29e9fc83c50c87c3208bad4b1af7d 100644
--- a/rpc/args_test.go
+++ b/rpc/args_test.go
@@ -145,7 +145,27 @@ func TestGetBlockByHashArgsHashInt(t *testing.T) {
 	}
 }
 
-func TestGetBlockByNumberArgs(t *testing.T) {
+func TestGetBlockByNumberArgsBlockNum(t *testing.T) {
+	input := `[436, false]`
+	expected := new(GetBlockByNumberArgs)
+	expected.BlockNumber = 436
+	expected.IncludeTxs = false
+
+	args := new(GetBlockByNumberArgs)
+	if err := json.Unmarshal([]byte(input), &args); err != nil {
+		t.Error(err)
+	}
+
+	if args.BlockNumber != expected.BlockNumber {
+		t.Errorf("BlockNumber should be %v but is %v", expected.BlockNumber, args.BlockNumber)
+	}
+
+	if args.IncludeTxs != expected.IncludeTxs {
+		t.Errorf("IncludeTxs should be %v but is %v", expected.IncludeTxs, args.IncludeTxs)
+	}
+}
+
+func TestGetBlockByNumberArgsBlockHex(t *testing.T) {
 	input := `["0x1b4", false]`
 	expected := new(GetBlockByNumberArgs)
 	expected.BlockNumber = 436
@@ -157,7 +177,7 @@ func TestGetBlockByNumberArgs(t *testing.T) {
 	}
 
 	if args.BlockNumber != expected.BlockNumber {
-		t.Errorf("BlockHash should be %v but is %v", expected.BlockNumber, args.BlockNumber)
+		t.Errorf("BlockNumber should be %v but is %v", expected.BlockNumber, args.BlockNumber)
 	}
 
 	if args.IncludeTxs != expected.IncludeTxs {
@@ -170,8 +190,42 @@ func TestGetBlockByNumberEmpty(t *testing.T) {
 
 	args := new(GetBlockByNumberArgs)
 	err := json.Unmarshal([]byte(input), &args)
-	if err == nil {
+	switch err.(type) {
+	case nil:
+		t.Error("Expected error but didn't get one")
+	case *InsufficientParamsError:
+		break
+	default:
+		t.Errorf("Expected *rpc.InsufficientParamsError but got %T with message `%s`", err, err.Error())
+	}
+}
+
+func TestGetBlockByNumberBool(t *testing.T) {
+	input := `[true, true]`
+
+	args := new(GetBlockByNumberArgs)
+	err := json.Unmarshal([]byte(input), &args)
+	switch err.(type) {
+	case nil:
+		t.Error("Expected error but didn't get one")
+	case *DecodeParamError:
+		break
+	default:
+		t.Errorf("Expected *rpc.DecodeParamError but got %T with message `%s`", err, err.Error())
+	}
+}
+func TestGetBlockByNumberBlockObject(t *testing.T) {
+	input := `{}`
+
+	args := new(GetBlockByNumberArgs)
+	err := json.Unmarshal([]byte(input), &args)
+	switch err.(type) {
+	case nil:
 		t.Error("Expected error but didn't get one")
+	case *DecodeParamError:
+		break
+	default:
+		t.Errorf("Expected *rpc.DecodeParamError but got %T with message `%s`", err, err.Error())
 	}
 }