diff --git a/exports.go b/exports.go
index 864fb1193221015e8eab570551b1cc067b5c6d82..5a5a540c3dfa762456492cfe97a05596a922d749 100644
--- a/exports.go
+++ b/exports.go
@@ -13,7 +13,7 @@ import (
 type (
 	// Conn is used to make requests to jsonrpc2 servers
 	Conn = codec.Conn
-	// Handler is the equivilant of http.Handler, but for jsonrpc.
+	// Handler is the equivalent of http.Handler, but for jsonrpc.
 	Handler = codec.Handler
 	// HandlerFunc is a Handler that exists as a function
 	HandlerFunc = codec.HandlerFunc
diff --git a/pkg/codec/errors.go b/pkg/codec/errors.go
index 6f13598f44ad94dfe016d8c7117b80d8ae28a98b..a8c2f0f6ebef6bf7683778e92f208a8c3915f62d 100644
--- a/pkg/codec/errors.go
+++ b/pkg/codec/errors.go
@@ -46,15 +46,17 @@ func EncodeError(enc *jx.Encoder, err error) error {
 	enc.Obj(func(e *jx.Encoder) {
 		switch er := err.(type) {
 		case DataError:
-			data, err := json.Marshal(er.ErrorData())
-			if err != nil {
-				data = []byte(`"failed to marshal error data"`)
-			}
 			e.Field("code", func(e *jx.Encoder) { e.Int(er.ErrorCode()) })
 			e.Field("message", func(e *jx.Encoder) { e.Str(er.Error()) })
-			e.Field("data", func(e *jx.Encoder) {
-				e.Raw(data)
-			})
+			if dat := er.ErrorData(); dat != nil {
+				data, err := json.Marshal(er.ErrorData())
+				if err != nil {
+					data = []byte(`"failed to marshal error data"`)
+				}
+				e.Field("data", func(e *jx.Encoder) {
+					e.Raw(data)
+				})
+			}
 		case Error:
 			e.FieldStart("code")
 			e.Int(er.ErrorCode())
@@ -68,31 +70,30 @@ func EncodeError(enc *jx.Encoder, err error) error {
 	return nil
 }
 
-type JrpcErr struct {
-	Data any
-}
-
-func (j *JrpcErr) ErrorData() any {
-	return j.Data
+func WrapErr(data any, code int, err error) error {
+	return &jrpcErr{
+		data: data,
+		err:  err,
+		code: code,
+	}
 }
 
-func (j *JrpcErr) Error() string {
-	return "Jrpc Error"
+type jrpcErr struct {
+	data any
+	err  error
+	code int
 }
 
-func (j *JrpcErr) ErrorCode() int {
-	return ErrorCodeJrpc
+func (j *jrpcErr) ErrorData() any {
+	return j.data
 }
 
-func WrapJrpcErr(err error) error {
-	if err == nil {
-		return nil
-	}
-	return fmt.Errorf("%w: %w", &JrpcErr{}, err)
+func (j *jrpcErr) Error() string {
+	return j.err.Error()
 }
 
-func MakeJrpcErr(s string) error {
-	return fmt.Errorf("%w: %s", &JrpcErr{}, s)
+func (j *jrpcErr) ErrorCode() int {
+	return j.code
 }
 
 type ErrorMethodNotFound struct{ method string }