diff --git a/contrib/openrpc/cmd/cli.go b/contrib/openrpc/cmd/cli.go
index 4955a6c4b2f645af8c3d87dc4e15c217472b7355..eff3ae2d71112aa5b68e19081c401d02ec40f211 100644
--- a/contrib/openrpc/cmd/cli.go
+++ b/contrib/openrpc/cmd/cli.go
@@ -5,9 +5,9 @@ import (
 	"fmt"
 	"os"
 
+	"gfx.cafe/open/jrpc/contrib/openrpc/generate"
 	"gfx.cafe/open/jrpc/contrib/openrpc/templates"
 	"gfx.cafe/open/jrpc/contrib/openrpc/types"
-
 	"github.com/alecthomas/kong"
 )
 
@@ -74,9 +74,9 @@ func (c *GenerateCommand) Run() error {
 	}
 	openrpc.Package = c.Package
 
-	//if err = generate.Generate(openrpc, c.Template, c.Output); err != nil {
-	//	return err
-	//}
+	if err = generate.Generate(openrpc, c.Template, c.Output); err != nil {
+		return err
+	}
 
 	return nil
 }
diff --git a/openrpc/generate/generate.go b/contrib/openrpc/generate/generate.go
similarity index 93%
rename from openrpc/generate/generate.go
rename to contrib/openrpc/generate/generate.go
index 5fbc03e640ee2819a940588b5c22eb23a1f13c12..9be2a0065dd56ad4c6cb2365f35542bd0bff3180 100644
--- a/openrpc/generate/generate.go
+++ b/contrib/openrpc/generate/generate.go
@@ -9,8 +9,8 @@ import (
 	"path/filepath"
 	"text/template"
 
-	"gfx.cafe/open/jrpc/openrpc/templates"
-	"gfx.cafe/open/jrpc/openrpc/types"
+	"gfx.cafe/open/jrpc/contrib/openrpc/templates"
+	"gfx.cafe/open/jrpc/contrib/openrpc/types"
 	"github.com/iancoleman/strcase"
 )
 
diff --git a/openrpc/generate/test.gotmpl b/contrib/openrpc/generate/test.gotmpl
similarity index 100%
rename from openrpc/generate/test.gotmpl
rename to contrib/openrpc/generate/test.gotmpl
diff --git a/openrpc/generate/test.json b/contrib/openrpc/generate/test.json
similarity index 100%
rename from openrpc/generate/test.json
rename to contrib/openrpc/generate/test.json
diff --git a/openrpc/out/api-spec/methods/debug/getters.yaml b/contrib/openrpc/out/api-spec/methods/debug/getters.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/debug/getters.yaml
rename to contrib/openrpc/out/api-spec/methods/debug/getters.yaml
diff --git a/openrpc/out/api-spec/methods/engine/README.md b/contrib/openrpc/out/api-spec/methods/engine/README.md
similarity index 100%
rename from openrpc/out/api-spec/methods/engine/README.md
rename to contrib/openrpc/out/api-spec/methods/engine/README.md
diff --git a/openrpc/out/api-spec/methods/engine/authentication.md b/contrib/openrpc/out/api-spec/methods/engine/authentication.md
similarity index 100%
rename from openrpc/out/api-spec/methods/engine/authentication.md
rename to contrib/openrpc/out/api-spec/methods/engine/authentication.md
diff --git a/openrpc/out/api-spec/methods/engine/specification.md b/contrib/openrpc/out/api-spec/methods/engine/specification.md
similarity index 100%
rename from openrpc/out/api-spec/methods/engine/specification.md
rename to contrib/openrpc/out/api-spec/methods/engine/specification.md
diff --git a/openrpc/out/api-spec/methods/eth/block.yaml b/contrib/openrpc/out/api-spec/methods/eth/block.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/block.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/block.yaml
diff --git a/openrpc/out/api-spec/methods/eth/client.yaml b/contrib/openrpc/out/api-spec/methods/eth/client.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/client.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/client.yaml
diff --git a/openrpc/out/api-spec/methods/eth/execute.yaml b/contrib/openrpc/out/api-spec/methods/eth/execute.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/execute.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/execute.yaml
diff --git a/openrpc/out/api-spec/methods/eth/fee_market.yaml b/contrib/openrpc/out/api-spec/methods/eth/fee_market.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/fee_market.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/fee_market.yaml
diff --git a/openrpc/out/api-spec/methods/eth/filter.yaml b/contrib/openrpc/out/api-spec/methods/eth/filter.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/filter.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/filter.yaml
diff --git a/openrpc/out/api-spec/methods/eth/mining.yaml b/contrib/openrpc/out/api-spec/methods/eth/mining.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/mining.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/mining.yaml
diff --git a/openrpc/out/api-spec/methods/eth/sign.yaml b/contrib/openrpc/out/api-spec/methods/eth/sign.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/sign.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/sign.yaml
diff --git a/openrpc/out/api-spec/methods/eth/state.yaml b/contrib/openrpc/out/api-spec/methods/eth/state.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/state.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/state.yaml
diff --git a/openrpc/out/api-spec/methods/eth/submit.yaml b/contrib/openrpc/out/api-spec/methods/eth/submit.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/submit.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/submit.yaml
diff --git a/openrpc/out/api-spec/methods/eth/transaction.yaml b/contrib/openrpc/out/api-spec/methods/eth/transaction.yaml
similarity index 100%
rename from openrpc/out/api-spec/methods/eth/transaction.yaml
rename to contrib/openrpc/out/api-spec/methods/eth/transaction.yaml
diff --git a/openrpc/out/api-spec/schemas/base-types.yaml b/contrib/openrpc/out/api-spec/schemas/base-types.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/base-types.yaml
rename to contrib/openrpc/out/api-spec/schemas/base-types.yaml
diff --git a/openrpc/out/api-spec/schemas/block.yaml b/contrib/openrpc/out/api-spec/schemas/block.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/block.yaml
rename to contrib/openrpc/out/api-spec/schemas/block.yaml
diff --git a/openrpc/out/api-spec/schemas/client.yaml b/contrib/openrpc/out/api-spec/schemas/client.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/client.yaml
rename to contrib/openrpc/out/api-spec/schemas/client.yaml
diff --git a/openrpc/out/api-spec/schemas/filter.yaml b/contrib/openrpc/out/api-spec/schemas/filter.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/filter.yaml
rename to contrib/openrpc/out/api-spec/schemas/filter.yaml
diff --git a/openrpc/out/api-spec/schemas/receipt.yaml b/contrib/openrpc/out/api-spec/schemas/receipt.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/receipt.yaml
rename to contrib/openrpc/out/api-spec/schemas/receipt.yaml
diff --git a/openrpc/out/api-spec/schemas/state.yaml b/contrib/openrpc/out/api-spec/schemas/state.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/state.yaml
rename to contrib/openrpc/out/api-spec/schemas/state.yaml
diff --git a/openrpc/out/api-spec/schemas/transaction.yaml b/contrib/openrpc/out/api-spec/schemas/transaction.yaml
similarity index 100%
rename from openrpc/out/api-spec/schemas/transaction.yaml
rename to contrib/openrpc/out/api-spec/schemas/transaction.yaml
diff --git a/openrpc/out/example/main.go b/contrib/openrpc/out/example/main.go
similarity index 100%
rename from openrpc/out/example/main.go
rename to contrib/openrpc/out/example/main.go
diff --git a/openrpc/out/generated_api.go b/contrib/openrpc/out/generated_api.go
similarity index 100%
rename from openrpc/out/generated_api.go
rename to contrib/openrpc/out/generated_api.go
diff --git a/openrpc/out/gogenerate.go b/contrib/openrpc/out/gogenerate.go
similarity index 100%
rename from openrpc/out/gogenerate.go
rename to contrib/openrpc/out/gogenerate.go
diff --git a/openrpc/out/spec.json b/contrib/openrpc/out/spec.json
similarity index 100%
rename from openrpc/out/spec.json
rename to contrib/openrpc/out/spec.json
diff --git a/contrib/openrpc/templates/template.go b/contrib/openrpc/templates/template.go
index d3ae2a2701cfc7c97ff8cbb63c885ca8846e5ed7..0e6485d21777101b6fd1f6ba9ce07b1bd7c71d51 100644
--- a/contrib/openrpc/templates/template.go
+++ b/contrib/openrpc/templates/template.go
@@ -1,23 +1,24 @@
-package templates
-
-const TEMPLATE = `// Code generated by jrpc. DO NOT EDIT.
+package templates 
+const TEMPLATE=`// Code generated by jrpc. DO NOT EDIT.
 
 package {{ .Package }}
 
 import (
-        "context"
-        "gfx.cafe/open/jrpc"
-        "errors"
-        "fmt"
-       )
+	"context"
+	"errors"
+	"fmt"
+
+	"gfx.cafe/open/jrpc/contrib/jmux"
+)
+
 
-var _ = jrpc.Version
 var _ = context.Background
 var _ = errors.New
 var _ = fmt.Sprintf
 
 
 
+
 {{- range $name, $component := .Components.Schemas }}
     type {{camelCase $name}} {{template "schemaType" $component}}
 {{- end }}
@@ -33,7 +34,7 @@ var _ = fmt.Sprintf
     -}}
         struct {
             {{range $name, $property := .Properties -}}
-                {{camelCase $name}} {{template "schemaType" $property}} ` + "`" + `json:"{{$name}}"` + "`" + `
+                {{camelCase $name}} {{template "schemaType" $property}} `+"`"+`json:"{{$name}}"`+"`"+`
             {{end -}}
             {{range $idx, $property := .OneOf -}}
                 Option{{$idx}} {{template "schemaType" $property}}
@@ -86,7 +87,7 @@ type GoOpenRPCService interface {
 
 
 
-func (h *GoOpenRPCHandler) RouteRPC(r jrpc.Router) {
+func (h *GoOpenRPCHandler) RouteRPC(r jmux.Router) {
     {{range .Methods -}}
         // {{.Summary}}
         {{if .Namespace}}
diff --git a/contrib/openrpc/templates/types.gotmpl b/contrib/openrpc/templates/types.gotmpl
index 53b835d23ba6f36029f4522a694d1dd331feb57e..c1553ea2446a163ec784ee4b2f47428f150e55ce 100644
--- a/contrib/openrpc/templates/types.gotmpl
+++ b/contrib/openrpc/templates/types.gotmpl
@@ -3,19 +3,21 @@
 package {{ .Package }}
 
 import (
-        "context"
-        "gfx.cafe/open/jrpc"
-        "errors"
-        "fmt"
-       )
+	"context"
+	"errors"
+	"fmt"
+
+	"gfx.cafe/open/jrpc/contrib/jmux"
+)
+
 
-var _ = jrpc.Version
 var _ = context.Background
 var _ = errors.New
 var _ = fmt.Sprintf
 
 
 
+
 {{- range $name, $component := .Components.Schemas }}
     type {{camelCase $name}} {{template "schemaType" $component}}
 {{- end }}
@@ -84,7 +86,7 @@ type GoOpenRPCService interface {
 
 
 
-func (h *GoOpenRPCHandler) RouteRPC(r jrpc.Router) {
+func (h *GoOpenRPCHandler) RouteRPC(r jmux.Router) {
     {{range .Methods -}}
         // {{.Summary}}
         {{if .Namespace}}
diff --git a/contrib/openrpc/types/types.go b/contrib/openrpc/types/types.go
index e017a859451fbb87b100b7258832fe0ab1d8bae1..325652cd54b6e74b5fe470d423302c10861c68d5 100644
--- a/contrib/openrpc/types/types.go
+++ b/contrib/openrpc/types/types.go
@@ -26,9 +26,16 @@ type ServerVariable struct {
 }
 
 type Info struct {
-	Title       string `json:"title"`
-	Description string `json:"description"`
-	Version     string `json:"version"`
+	Title       string  `json:"title"`
+	Description string  `json:"description"`
+	Version     string  `json:"version"`
+	Contact     Contact `json:"contact,omitempty"`
+}
+
+type Contact struct {
+	Name  string `json:"name,omitempty"`
+	URL   string `json:"url,omitempty"`
+	Email string `json:"email,omitempty"`
 }
 
 type Items []Schema
@@ -50,29 +57,32 @@ func (I *Items) UnmarshalJSON(b []byte) error {
 var _ json.Unmarshaler = (*Items)(nil)
 
 type Schema struct {
-	Ref        string            `json:"$ref,omitempty"`
-	Type       string            `json:"type,omitempty"`
-	Title      string            `json:"title,omitempty"`
-	Required   []string          `json:"required,omitempty"`
-	Items      Items             `json:"items,omitempty"`
-	Properties map[string]Schema `json:"properties,omitempty"`
-	OneOf      []Schema          `json:"oneOf,omitempty"`
-	AnyOf      []Schema          `json:"anyOf,omitempty"`
-	AllOf      []Schema          `json:"allOf,omitempty"`
-	Enum       []string          `json:"enum,omitempty"`
-	Pattern    string            `json:"pattern,omitempty"`
+	Ref         string            `json:"$ref,omitempty"`
+	Description string            `json:"description,omitempty"`
+	Type        string            `json:"type,omitempty"`
+	Title       string            `json:"title,omitempty"`
+	Required    []string          `json:"required,omitempty"`
+	Items       Items             `json:"items,omitempty"`
+	Properties  map[string]Schema `json:"properties,omitempty"`
+	OneOf       []Schema          `json:"oneOf,omitempty"`
+	AnyOf       []Schema          `json:"anyOf,omitempty"`
+	AllOf       []Schema          `json:"allOf,omitempty"`
+	Enum        []string          `json:"enum,omitempty"`
+	Pattern     string            `json:"pattern,omitempty"`
 }
 
 type Param struct {
 	Name        string `json:"name"`
+	Summary     string `json:"summary,omitempty"`
 	Description string `json:"description,omitempty"`
 	Required    bool   `json:"required"`
 	Schema      Schema `json:"schema"`
 }
 
 type Result struct {
-	Name   string `json:"name"`
-	Schema Schema `json:"schema"`
+	Name        string `json:"name"`
+	Description string `json:"description,omitempty"`
+	Schema      Schema `json:"schema"`
 }
 
 type Method struct {
diff --git a/openrpc/cmd/cli.go b/openrpc/cmd/cli.go
deleted file mode 100644
index 8623612e4bb96d929c58b867147bd16ac212d185..0000000000000000000000000000000000000000
--- a/openrpc/cmd/cli.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"fmt"
-	"os"
-
-	"gfx.cafe/open/jrpc/openrpc/generate"
-	"gfx.cafe/open/jrpc/openrpc/templates"
-
-	"gfx.cafe/open/jrpc/openrpc/types"
-	"github.com/alecthomas/kong"
-)
-
-var CLI struct {
-	Compile  CompileCommand  `cmd:"" help:"Compile a folder into a single openrpc spec"`
-	Generate GenerateCommand `cmd:"" help:"Compile a folder into a single openrpc spec"`
-	Template TemplateCommand `cmd:"" help:"print template to stdout"`
-}
-
-type TemplateCommand struct {
-}
-
-func (c *TemplateCommand) Run() error {
-	fmt.Print(templates.TEMPLATE)
-	return nil
-}
-
-type CompileCommand struct {
-	Methods []string `name:"methods" short:"m" help:"root of method dirs" type:"path"`
-	Schemas []string `name:"schemas" short:"s" help:"root schema dirs" type:"path"`
-	Output  string   `name:"output" short:"o" help:"path to output file"`
-}
-
-func (c *CompileCommand) Run() error {
-	openrpc := types.NewOpenRPCSpec1()
-	var err error
-	for _, v := range c.Methods {
-		err = openrpc.AddMethods(v)
-		if err != nil {
-			return err
-		}
-	}
-	for _, v := range c.Schemas {
-		err = openrpc.AddSchemas(v)
-		if err != nil {
-			return err
-		}
-	}
-	jzn, err := json.MarshalIndent(openrpc, "", " ")
-	if err != nil {
-		return err
-	}
-	err = os.WriteFile(c.Output, jzn, 0644)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-type GenerateCommand struct {
-	Spec     string `name:"spec" short:"s" help:"path to jopenrpc spec"`
-	Output   string `name:"output" short:"o" help:"output directory and package"`
-	Template string `name:"template" short:"t" help:"template to generate with"`
-	Package  string `name:"package" short:"p" default:"api" help:"package name"`
-}
-
-func (c *GenerateCommand) Run() error {
-	if c.Spec == "" {
-		return fmt.Errorf("spec file is required")
-	}
-	openrpc, err := readSpec(c.Spec)
-	if err != nil {
-		return err
-	}
-	openrpc.Package = c.Package
-
-	if err = generate.Generate(openrpc, c.Template, c.Output); err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func readSpec(file string) (out *types.OpenRPC, err error) {
-	var data []byte
-	data, err = os.ReadFile(file)
-	if err != nil {
-		return
-	}
-
-	out = new(types.OpenRPC)
-	err = json.Unmarshal(data, out)
-	return
-}
-
-func NewCLI() *kong.Context {
-	ctx := kong.Parse(&CLI)
-	return ctx
-}
diff --git a/openrpc/cmd/main.go b/openrpc/cmd/main.go
deleted file mode 100644
index 21956534efca5fed8b18a450a5af328143790f8d..0000000000000000000000000000000000000000
--- a/openrpc/cmd/main.go
+++ /dev/null
@@ -1,14 +0,0 @@
-package main
-
-import (
-	"fmt"
-	"os"
-)
-
-func main() {
-	ctx := NewCLI()
-	if err := ctx.Run(); err != nil {
-		fmt.Fprintf(os.Stderr, "error: %v\n", err)
-		os.Exit(1)
-	}
-}
diff --git a/openrpc/parse/parse.go b/openrpc/parse/parse.go
deleted file mode 100644
index fe2554d0439ed05fbafd43eff3bf2da124649cb9..0000000000000000000000000000000000000000
--- a/openrpc/parse/parse.go
+++ /dev/null
@@ -1 +0,0 @@
-package parse
diff --git a/openrpc/parse/testdata/eth_openrpc.json b/openrpc/parse/testdata/eth_openrpc.json
deleted file mode 100644
index 7f9b44b71117d1f470cb66d6d416061a19595c93..0000000000000000000000000000000000000000
--- a/openrpc/parse/testdata/eth_openrpc.json
+++ /dev/null
@@ -1,1864 +0,0 @@
-{
-    "openrpc": "1.0.0",
-    "info": {
-      "version": "1.0.10",
-      "title": "Ethereum JSON-RPC",
-      "description": "This API lets you interact with an EVM-based client via JSON-RPC",
-      "license": {
-        "name": "Apache 2.0",
-        "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
-      }
-    },
-    "methods": [
-      {
-        "name": "web3_clientVersion",
-        "description": "Returns the version of the current client",
-        "summary": "current client version",
-        "params": [],
-        "result": {
-          "name": "clientVersion",
-          "description": "client version",
-          "schema": {
-            "title": "clientVersion",
-            "type": "string"
-          }
-        }
-      },
-      {
-        "name": "web3_sha3",
-        "summary": "Hashes data",
-        "description": "Hashes data using the Keccak-256 algorithm",
-        "params": [
-          {
-            "name": "data",
-            "description": "data to hash using the Keccak-256 algorithm",
-            "summary": "data to hash",
-            "schema": {
-              "title": "data",
-              "type": "string",
-              "pattern": "^0x[a-fA-F\\d]+$"
-            }
-          }
-        ],
-        "result": {
-          "name": "hashedData",
-          "description": "Keccak-256 hash of the given data",
-          "schema": {
-            "$ref": "#/components/schemas/Keccak"
-          }
-        },
-        "examples": [
-          {
-            "name": "sha3Example",
-            "params": [
-              {
-                "name": "sha3ParamExample",
-                "value": "0x68656c6c6f20776f726c64"
-              }
-            ],
-            "result": {
-              "name": "sha3ResultExample",
-              "value": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"
-            }
-          }
-        ]
-      },
-      {
-        "name": "net_listening",
-        "summary": "returns listening status",
-        "description": "Determines if this client is listening for new network connections.",
-        "params": [],
-        "result": {
-          "name": "netListeningResult",
-          "description": "`true` if listening is active or `false` if listening is not active",
-          "schema": {
-            "title": "isNetListening",
-            "type": "boolean"
-          }
-        },
-        "examples": [
-          {
-            "name": "netListeningTrueExample",
-            "description": "example of true result for net_listening",
-            "params": [],
-            "result": {
-              "name": "netListeningExampleFalseResult",
-              "value": true
-            }
-          }
-        ]
-      },
-      {
-        "name": "net_peerCount",
-        "summary": "number of peers",
-        "description": "Returns the number of peers currently connected to this client.",
-        "params": [],
-        "result": {
-          "name": "quantity",
-          "description": "number of connected peers.",
-          "schema": {
-            "title": "numConnectedPeers",
-            "description": "Hex representation of number of connected peers",
-            "type": "string"
-          }
-        }
-      },
-      {
-        "name": "net_version",
-        "summary": "chain ID associated with network",
-        "description": "Returns the chain ID associated with the current network.",
-        "params": [],
-        "result": {
-          "name": "chainID",
-          "description": "chain ID associated with the current network",
-          "schema": {
-            "title": "chainID",
-            "type": "string",
-            "pattern": "^0x[a-fA-F\\d]+$"
-          }
-        }
-      },
-      {
-        "name": "eth_blockNumber",
-        "summary": "Returns the number of most recent block.",
-        "params": [],
-        "result": {
-          "$ref": "#/components/contentDescriptors/BlockNumber"
-        }
-      },
-      {
-        "name": "eth_call",
-        "summary": "Executes a new message call (locally) immediately without creating a transaction on the block chain.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Transaction"
-          },
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          }
-        ],
-        "result": {
-          "name": "returnValue",
-          "description": "The return value of the executed contract",
-          "schema": {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        }
-      },
-      {
-        "name": "eth_chainId",
-        "summary": "Returns the currently configured chain id",
-        "description": "Returns the currently configured chain id, a value used in replay-protected transaction signing as introduced by [EIP-155](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md).",
-        "params": [],
-        "result": {
-          "name": "chainId",
-          "description": "hex format integer of the current chain id. Defaults are mainnet=61, morden=62.",
-          "schema": {
-            "title": "chainId",
-            "type": "string",
-            "pattern": "^0x[a-fA-F\\d]+$"
-          }
-        }
-      },
-      {
-        "name": "eth_coinbase",
-        "summary": "Returns the client coinbase address.",
-        "params": [],
-        "result": {
-          "name": "address",
-          "description": "The address owned by the client that is used as default for things like the mining reward",
-          "schema": {
-            "$ref": "#/components/schemas/Address"
-          }
-        }
-      },
-      {
-        "name": "eth_estimateGas",
-        "summary": "Generates and returns an estimate of how much gas is necessary to allow the transaction to complete. The transaction will not be added to the blockchain. Note that the estimate may be significantly more than the amount of gas actually used by the transaction, for a variety of reasons including EVM mechanics and node performance.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Transaction"
-          }
-        ],
-        "result": {
-          "name": "gasUsed",
-          "description": "The amount of gas used",
-          "schema": {
-            "$ref": "#/components/schemas/Integer"
-          }
-        }
-      },
-      {
-        "name": "eth_gasPrice",
-        "summary": "Returns the current price per gas in wei",
-        "params": [],
-        "result": {
-          "$ref": "#/components/contentDescriptors/GasPrice"
-        }
-      },
-      {
-        "name": "eth_getBalance",
-        "summary": "Returns Ether balance of a given or account or contract",
-        "params": [
-          {
-            "name": "address",
-            "required": true,
-            "description": "The address of the account or contract",
-            "schema": {
-              "$ref": "#/components/schemas/Address"
-            }
-          },
-          {
-            "name": "blockNumber",
-            "description": "A BlockNumber at which to request the balance",
-            "schema": {
-              "$ref": "#/components/schemas/BlockNumber"
-            }
-          }
-        ],
-        "result": {
-          "name": "getBalanceResult",
-          "schema": {
-            "title": "getBalanceResult",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Integer"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getBlockByHash",
-        "summary": "Gets a block for a given hash",
-        "params": [
-          {
-            "name": "blockHash",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/BlockHash"
-            }
-          },
-          {
-            "name": "includeTransactions",
-            "description": "If `true` it returns the full transaction objects, if `false` only the hashes of the transactions.",
-            "required": true,
-            "schema": {
-              "title": "isTransactionsIncluded",
-              "type": "boolean"
-            }
-          }
-        ],
-        "result": {
-          "name": "getBlockByHashResult",
-          "schema": {
-            "title": "getBlockByHashResult",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Block"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getBlockByNumber",
-        "summary": "Gets a block for a given number salad",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          },
-          {
-            "name": "includeTransactions",
-            "description": "If `true` it returns the full transaction objects, if `false` only the hashes of the transactions.",
-            "required": true,
-            "schema": {
-              "title": "isTransactionsIncluded",
-              "type": "boolean"
-            }
-          }
-        ],
-        "result": {
-          "name": "getBlockByNumberResult",
-          "schema": {
-            "title": "getBlockByNumberResult",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Block"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getBlockTransactionCountByHash",
-        "summary": "Returns the number of transactions in a block from a block matching the given block hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockHash"
-          }
-        ],
-        "result": {
-          "name": "blockTransactionCountByHash",
-          "description": "The Number of total transactions in the given block",
-          "schema": {
-            "title": "blockTransactionCountByHash",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Integer"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getBlockTransactionCountByNumber",
-        "summary": "Returns the number of transactions in a block from a block matching the given block number.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          }
-        ],
-        "result": {
-          "name": "blockTransactionCountByHash",
-          "description": "The Number of total transactions in the given block",
-          "schema": {
-            "title": "blockTransactionCountByHash",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Integer"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getCode",
-        "summary": "Returns code at a given contract address",
-        "params": [
-          {
-            "name": "address",
-            "required": true,
-            "description": "The address of the contract",
-            "schema": {
-              "$ref": "#/components/schemas/Address"
-            }
-          },
-          {
-            "name": "blockNumber",
-            "description": "A BlockNumber of which the code existed",
-            "schema": {
-              "$ref": "#/components/schemas/BlockNumber"
-            }
-          }
-        ],
-        "result": {
-          "name": "bytes",
-          "schema": {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        }
-      },
-      {
-        "name": "eth_getFilterChanges",
-        "summary": "Polling method for a filter, which returns an array of logs which occurred since last poll.",
-        "params": [
-          {
-            "name": "filterId",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/FilterId"
-            }
-          }
-        ],
-        "result": {
-          "name": "logResult",
-          "schema": {
-            "title": "logResult",
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/Log"
-            }
-          }
-        }
-      },
-      {
-        "name": "eth_getFilterLogs",
-        "summary": "Returns an array of all logs matching filter with given id.",
-        "params": [
-          {
-            "name": "filterId",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/FilterId"
-            }
-          }
-        ],
-        "result": {
-          "$ref": "#/components/contentDescriptors/Logs"
-        }
-      },
-      {
-        "name": "eth_getRawTransactionByHash",
-        "summary": "Returns raw transaction data of a transaction with the given hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/TransactionHash"
-          }
-        ],
-        "result": {
-          "name": "rawTransactionByHash",
-          "description": "The raw transaction data",
-          "schema": {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        }
-      },
-      {
-        "name": "eth_getRawTransactionByBlockHashAndIndex",
-        "summary": "Returns raw transaction data of a transaction with the given hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockHash"
-          },
-          {
-            "name": "index",
-            "description": "The ordering in which a transaction is mined within its block.",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        ],
-        "result": {
-          "name": "rawTransaction",
-          "description": "The raw transaction data",
-          "schema": {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        }
-      },
-      {
-        "name": "eth_getRawTransactionByBlockNumberAndIndex",
-        "summary": "Returns raw transaction data of a transaction with the given hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          },
-          {
-            "name": "index",
-            "description": "The ordering in which a transaction is mined within its block.",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        ],
-        "result": {
-          "name": "rawTransaction",
-          "description": "The raw transaction data",
-          "schema": {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        }
-      },
-      {
-        "name": "eth_getLogs",
-        "summary": "Returns an array of all logs matching a given filter object.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Filter"
-          }
-        ],
-        "result": {
-          "$ref": "#/components/contentDescriptors/Logs"
-        }
-      },
-      {
-        "name": "eth_getStorageAt",
-        "summary": "Gets a storage value from a contract address, a position, and an optional blockNumber",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Address"
-          },
-          {
-            "$ref": "#/components/contentDescriptors/Position"
-          },
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          }
-        ],
-        "result": {
-          "name": "dataWord",
-          "schema": {
-            "$ref": "#/components/schemas/DataWord"
-          }
-        }
-      },
-      {
-        "name": "eth_getTransactionByBlockHashAndIndex",
-        "summary": "Returns the information about a transaction requested by the block hash and index of which it was mined.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockHash"
-          },
-          {
-            "name": "index",
-            "description": "The ordering in which a transaction is mined within its block.",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        ],
-        "result": {
-          "$ref": "#/components/contentDescriptors/TransactionResult"
-        },
-        "examples": [
-          {
-            "name": "nullExample",
-            "params": [
-              {
-                "name": "blockHashExample",
-                "value": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
-              },
-              {
-                "name": "indexExample",
-                "value": "0x0"
-              }
-            ],
-            "result": {
-              "name": "nullResultExample",
-              "value": null
-            }
-          }
-        ]
-      },
-      {
-        "name": "eth_getTransactionByBlockNumberAndIndex",
-        "summary": "Returns the information about a transaction requested by the block hash and index of which it was mined.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          },
-          {
-            "name": "index",
-            "description": "The ordering in which a transaction is mined within its block.",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        ],
-        "result": {
-          "$ref": "#/components/contentDescriptors/TransactionResult"
-        }
-      },
-      {
-        "name": "eth_getTransactionByHash",
-        "summary": "Returns the information about a transaction requested by transaction hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/TransactionHash"
-          }
-        ],
-        "result": {
-          "title": "Transaction",
-          "$ref": "#/components/contentDescriptors/TransactionResult"
-        }
-      },
-      {
-        "name": "eth_getTransactionCount",
-        "summary": "Returns the number of transactions sent from an address",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Address"
-          },
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          }
-        ],
-        "result": {
-          "name": "transactionCount",
-          "schema": {
-            "title": "nonceOrNull",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Nonce"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getTransactionReceipt",
-        "summary": "Returns the receipt information of a transaction by its hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/TransactionHash"
-          }
-        ],
-        "result": {
-          "name": "transactionReceiptResult",
-          "description": "returns either a receipt or null",
-          "schema": {
-            "title": "receipt",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Receipt"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getUncleByBlockHashAndIndex",
-        "summary": "Returns information about a uncle of a block by hash and uncle index position.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockHash"
-          },
-          {
-            "name": "index",
-            "description": "The ordering in which a uncle is included within its block.",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        ],
-        "result": {
-          "name": "uncle",
-          "schema": {
-            "title": "uncleOrNull",
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Uncle"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getUncleByBlockNumberAndIndex",
-        "summary": "Returns information about a uncle of a block by hash and uncle index position.",
-        "params": [
-          {
-            "name": "uncleBlockNumber",
-            "description": "The block in which the uncle was included",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/BlockNumber"
-            }
-          },
-          {
-            "name": "index",
-            "description": "The ordering in which a uncle is included within its block.",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        ],
-        "result": {
-          "name": "uncleResult",
-          "description": "returns an uncle or null",
-          "schema": {
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Uncle"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        },
-        "examples": [
-          {
-            "name": "nullResultExample",
-            "params": [
-              {
-                "name": "uncleBlockNumberExample",
-                "value": "0x0"
-              },
-              {
-                "name": "uncleBlockNumberIndexExample",
-                "value": "0x0"
-              }
-            ],
-            "result": {
-              "name": "nullResultExample",
-              "value": null
-            }
-          }
-        ]
-      },
-      {
-        "name": "eth_getUncleCountByBlockHash",
-        "summary": "Returns the number of uncles in a block from a block matching the given block hash.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockHash"
-          }
-        ],
-        "result": {
-          "name": "uncleCountResult",
-          "schema": {
-            "title": "uncleCountOrNull",
-            "oneOf": [
-              {
-                "description": "The Number of total uncles in the given block",
-                "$ref": "#/components/schemas/Integer"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getUncleCountByBlockNumber",
-        "summary": "Returns the number of uncles in a block from a block matching the given block number.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          }
-        ],
-        "result": {
-          "name": "uncleCountResult",
-          "schema": {
-            "title": "uncleCountOrNull",
-            "oneOf": [
-              {
-                "description": "The Number of total uncles in the given block",
-                "$ref": "#/components/schemas/Integer"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getProof",
-        "summary": "Returns the account- and storage-values of the specified account including the Merkle-proof.",
-        "params": [
-          {
-            "name": "address",
-            "description": "The address of the account or contract",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/Address"
-            }
-          },
-          {
-            "name": "storageKeys",
-            "required": true,
-            "schema": {
-              "title": "storageKeys",
-              "description": "The storage keys of all the storage slots being requested",
-              "items": {
-                "description": "A storage key is indexed from the solidity compiler by the order it is declared. For mappings it uses the keccak of the mapping key with its position (and recursively for X-dimensional mappings)",
-                "$ref": "#/components/schemas/Integer"
-              }
-            }
-          },
-          {
-            "$ref": "#/components/contentDescriptors/BlockNumber"
-          }
-        ],
-        "result": {
-          "name": "account",
-          "schema": {
-            "title": "proofAccountOrNull",
-            "oneOf": [
-              {
-                "title": "proofAccount",
-                "type": "object",
-                "description": "The merkle proofs of the specified account connecting them to the blockhash of the block specified",
-                "properties": {
-                  "address": {
-                    "description": "The address of the account or contract of the request",
-                    "$ref": "#/components/schemas/Address"
-                  },
-                  "accountProof": {
-                    "$ref": "#/components/schemas/AccountProof"
-                  },
-                  "balance": {
-                    "description": "The Ether balance of the account or contract of the request",
-                    "$ref": "#/components/schemas/Integer"
-                  },
-                  "codeHash": {
-                    "description": "The code hash of the contract of the request (keccak(NULL) if external account)",
-                    "$ref": "#/components/schemas/Keccak"
-                  },
-                  "nonce": {
-                    "description": "The transaction count of the account or contract of the request",
-                    "$ref": "#/components/schemas/Nonce"
-                  },
-                  "storageHash": {
-                    "description": "The storage hash of the contract of the request (keccak(rlp(NULL)) if external account)",
-                    "$ref": "#/components/schemas/Keccak"
-                  },
-                  "storageProof": {
-                    "$ref": "#/components/schemas/StorageProof"
-                  }
-                }
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_getWork",
-        "summary": "Returns the hash of the current block, the seedHash, and the boundary condition to be met ('target').",
-        "params": [],
-        "result": {
-          "name": "work",
-          "schema": {
-            "type": "array",
-            "items": [
-              {
-                "$ref": "#/components/schemas/PowHash"
-              },
-              {
-                "$ref": "#/components/schemas/SeedHash"
-              },
-              {
-                "$ref": "#/components/schemas/Difficulty"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_hashrate",
-        "summary": "Returns the number of hashes per second that the node is mining with.",
-        "params": [],
-        "result": {
-          "name": "hashesPerSecond",
-          "schema": {
-            "description": "Integer of the number of hashes per second",
-            "$ref": "#/components/schemas/Integer"
-          }
-        }
-      },
-      {
-        "name": "eth_mining",
-        "summary": "Returns true if client is actively mining new blocks.",
-        "params": [],
-        "result": {
-          "name": "mining",
-          "schema": {
-            "description": "Whether of not the client is mining",
-            "type": "boolean"
-          }
-        }
-      },
-      {
-        "name": "eth_newBlockFilter",
-        "summary": "Creates a filter in the node, to notify when a new block arrives. To check if the state has changed, call eth_getFilterChanges.",
-        "params": [],
-        "result": {
-          "$ref": "#/components/contentDescriptors/FilterId"
-        }
-      },
-      {
-        "name": "eth_newFilter",
-        "summary": "Creates a filter object, based on filter options, to notify when the state changes (logs). To check if the state has changed, call eth_getFilterChanges.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Filter"
-          }
-        ],
-        "result": {
-          "name": "filterId",
-          "schema": {
-            "description": "The filter ID for use in `eth_getFilterChanges`",
-            "$ref": "#/components/schemas/Integer"
-          }
-        }
-      },
-      {
-        "name": "eth_newPendingTransactionFilter",
-        "summary": "Creates a filter in the node, to notify when new pending transactions arrive. To check if the state has changed, call eth_getFilterChanges.",
-        "params": [],
-        "result": {
-          "$ref": "#/components/contentDescriptors/FilterId"
-        }
-      },
-      {
-        "name": "eth_pendingTransactions",
-        "summary": "Returns the pending transactions list",
-        "params": [],
-        "result": {
-          "name": "pendingTransactions",
-          "schema": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/Transaction"
-            }
-          }
-        }
-      },
-      {
-        "name": "eth_protocolVersion",
-        "summary": "Returns the current ethereum protocol version.",
-        "params": [],
-        "result": {
-          "name": "protocolVersion",
-          "schema": {
-            "description": "The current ethereum protocol version",
-            "$ref": "#/components/schemas/Integer"
-          }
-        }
-      },
-      {
-        "name": "eth_sign",
-        "summary": "The sign method calculates an Ethereum specific signature.",
-        "deprecated": true,
-        "params": [
-          {
-            "$ref": "#/components/schemas/Address"
-          },
-          {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        ],
-        "result": {
-          "$ref": "#/components/contentDescriptors/Signature"
-        }
-      },
-      {
-        "name": "eth_accounts",
-        "summary": "Returns a list of addresses owned by client.",
-        "deprecated": true,
-        "params": [],
-        "result": {
-          "name": "addresses",
-          "description": "addresses owned by the client",
-          "schema": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/Address"
-            }
-          }
-        }
-      },
-      {
-        "name": "eth_sendTransaction",
-        "summary": "Creates new message call transaction or a contract creation, if the data field contains code.",
-        "deprecated": true,
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Transaction"
-          }
-        ],
-        "result": {
-          "name": "transactionHash",
-          "schema": {
-            "description": "The transaction hash, or the zero hash if the transaction is not yet available.",
-            "$ref": "#/components/schemas/Keccak"
-          }
-        }
-      },
-      {
-        "name": "eth_sendRawTransaction",
-        "summary": "Creates new message call transaction or a contract creation for signed transactions.",
-        "params": [
-          {
-            "name": "signedTransactionData",
-            "required": true,
-            "description": "The signed transaction data",
-            "schema": {
-              "$ref": "#/components/schemas/Bytes"
-            }
-          }
-        ],
-        "result": {
-          "name": "transactionHash",
-          "schema": {
-            "description": "The transaction hash, or the zero hash if the transaction is not yet available.",
-            "$ref": "#/components/schemas/Keccak"
-          }
-        }
-      },
-      {
-        "name": "eth_submitHashrate",
-        "summary": "Returns an array of all logs matching a given filter object.",
-        "params": [
-          {
-            "name": "hashRate",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/DataWord"
-            }
-          },
-          {
-            "name": "id",
-            "required": true,
-            "description": "String identifying the client",
-            "schema": {
-              "$ref": "#/components/schemas/DataWord"
-            }
-          }
-        ],
-        "result": {
-          "name": "submitHashRateSuccess",
-          "schema": {
-            "type": "boolean",
-            "description": "whether of not submitting went through successfully"
-          }
-        }
-      },
-      {
-        "name": "eth_submitWork",
-        "summary": "Used for submitting a proof-of-work solution.",
-        "params": [
-          {
-            "$ref": "#/components/contentDescriptors/Nonce"
-          },
-          {
-            "name": "powHash",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/PowHash"
-            }
-          },
-          {
-            "name": "mixHash",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/MixHash"
-            }
-          }
-        ],
-        "result": {
-          "name": "solutionValid",
-          "description": "returns true if the provided solution is valid, otherwise false.",
-          "schema": {
-            "type": "boolean",
-            "description": "Whether or not the provided solution is valid"
-          }
-        },
-        "examples": [
-          {
-            "name": "submitWorkExample",
-            "params": [
-              {
-                "name": "nonceExample",
-                "description": "example of a number only used once",
-                "value": "0x0000000000000001"
-              },
-              {
-                "name": "powHashExample",
-                "description": "proof of work to submit",
-                "value": "0x6bf2cAE0dE3ec3ecA5E194a6C6e02cf42aADfe1C2c4Fff12E5D36C3Cf7297F22"
-              },
-              {
-                "name": "mixHashExample",
-                "description": "the mix digest example",
-                "value": "0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000"
-              }
-            ],
-            "result": {
-              "name": "solutionInvalidExample",
-              "description": "this example should return `false` as it is not a valid pow to submit",
-              "value": false
-            }
-          }
-        ]
-      },
-      {
-        "name": "eth_syncing",
-        "summary": "Returns an object with data about the sync status or false.",
-        "params": [],
-        "result": {
-          "name": "syncing",
-          "schema": {
-            "oneOf": [
-              {
-                "description": "An object with sync status data",
-                "title": "syncStatus",
-                "type": "object",
-                "properties": {
-                  "startingBlock": {
-                    "description": "Block at which the import started (will only be reset, after the sync reached his head)",
-                    "$ref": "#/components/schemas/Integer"
-                  },
-                  "currentBlock": {
-                    "description": "The current block, same as eth_blockNumber",
-                    "$ref": "#/components/schemas/Integer"
-                  },
-                  "highestBlock": {
-                    "description": "The estimated highest block",
-                    "$ref": "#/components/schemas/Integer"
-                  },
-                  "knownStates": {
-                    "description": "The known states",
-                    "$ref": "#/components/schemas/Integer"
-                  },
-                  "pulledStates": {
-                    "description": "The pulled states",
-                    "$ref": "#/components/schemas/Integer"
-                  }
-                }
-              },
-              {
-                "type": "boolean",
-                "description": "The value `false` indicating that syncing is complete"
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "eth_uninstallFilter",
-        "summary": "Uninstalls a filter with given id. Should always be called when watch is no longer needed. Additionally Filters timeout when they aren't requested with eth_getFilterChanges for a period of time.",
-        "params": [
-          {
-            "name": "filterId",
-            "required": true,
-            "schema": {
-              "$ref": "#/components/schemas/FilterId"
-            }
-          }
-        ],
-        "result": {
-          "name": "filterUninstalledSuccess",
-          "schema": {
-            "type": "boolean",
-            "description": "Whether of not the filter was successfully uninstalled"
-          }
-        }
-      }
-    ],
-    "components": {
-      "schemas": {
-        "ProofNode": {
-          "type": "string",
-          "description": "An individual node used to prove a path down a merkle-patricia-tree",
-          "$ref": "#/components/schemas/Bytes"
-        },
-        "AccountProof": {
-          "$ref": "#/components/schemas/ProofNodes"
-        },
-        "StorageProof": {
-          "type": "array",
-          "description": "Current block header PoW hash.",
-          "items": {
-            "type": "object",
-            "description": "Object proving a relationship of a storage value to an account's storageHash.",
-            "properties": {
-              "key": {
-                "description": "The key used to get the storage slot in its account tree",
-                "$ref": "#/components/schemas/Integer"
-              },
-              "value": {
-                "description": "The value of the storage slot in its account tree",
-                "$ref": "#/components/schemas/Integer"
-              },
-              "proof": {
-                "$ref": "#/components/schemas/ProofNodes"
-              }
-            }
-          }
-        },
-        "ProofNodes": {
-          "type": "array",
-          "description": "The set of node values needed to traverse a patricia merkle tree (from root to leaf) to retrieve a value",
-          "items": {
-            "$ref": "#/components/schemas/ProofNode"
-          }
-        },
-        "PowHash": {
-          "description": "Current block header PoW hash.",
-          "$ref": "#/components/schemas/DataWord"
-        },
-        "SeedHash": {
-          "description": "The seed hash used for the DAG.",
-          "$ref": "#/components/schemas/DataWord"
-        },
-        "MixHash": {
-          "description": "The mix digest.",
-          "$ref": "#/components/schemas/DataWord"
-        },
-        "Difficulty": {
-          "description": "The boundary condition ('target'), 2^256 / difficulty.",
-          "$ref": "#/components/schemas/DataWord"
-        },
-        "FilterId": {
-          "type": "string",
-          "description": "An identifier used to reference the filter."
-        },
-        "BlockHash": {
-          "type": "string",
-          "pattern": "^0x[a-fA-F\\d]{64}$",
-          "description": "The hex representation of the Keccak 256 of the RLP encoded block"
-        },
-        "BlockNumber": {
-          "type": "string",
-          "pattern": "^0x[a-fA-F\\d]+$",
-          "description": "The hex representation of the block's height"
-        },
-        "BlockNumberTag": {
-          "type": "string",
-          "description": "The optional block height description",
-          "enum": [
-            "earliest",
-            "latest",
-            "pending"
-          ]
-        },
-        "Receipt": {
-          "type": "object",
-          "description": "The receipt of a transaction",
-          "required": [
-            "blockHash",
-            "blockNumber",
-            "contractAddress",
-            "cumulativeGasUsed",
-            "from",
-            "gasUsed",
-            "logs",
-            "logsBloom",
-            "to",
-            "transactionHash",
-            "transactionIndex"
-          ],
-          "properties": {
-            "blockHash": {
-              "description": "BlockHash of the block in which the transaction was mined",
-              "$ref": "#/components/schemas/BlockHash"
-            },
-            "blockNumber": {
-              "description": "BlockNumber of the block in which the transaction was mined",
-              "$ref": "#/components/schemas/BlockNumber"
-            },
-            "contractAddress": {
-              "description": "The contract address created, if the transaction was a contract creation, otherwise null",
-              "$ref": "#/components/schemas/Address"
-            },
-            "cumulativeGasUsed": {
-              "description": "The gas units used by the transaction",
-              "$ref": "#/components/schemas/Integer"
-            },
-            "from": {
-              "description": "The sender of the transaction",
-              "$ref": "#/components/schemas/Address"
-            },
-            "gasUsed": {
-              "description": "The total gas used by the transaction",
-              "$ref": "#/components/schemas/Integer"
-            },
-            "logs": {
-              "type": "array",
-              "description": "An array of all the logs triggered during the transaction",
-              "items": {
-                "$ref": "#/components/schemas/Log"
-              }
-            },
-            "logsBloom": {
-              "$ref": "#/components/schemas/BloomFilter"
-            },
-            "to": {
-              "description": "Destination address of the transaction",
-              "$ref": "#/components/schemas/Address"
-            },
-            "transactionHash": {
-              "description": "Keccak 256 of the transaction",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "transactionIndex": {
-              "description": "An array of all the logs triggered during the transaction",
-              "$ref": "#/components/schemas/BloomFilter"
-            },
-            "postTransactionState": {
-              "description": "The intermediate stateRoot directly after transaction execution.",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "status": {
-              "description": "Whether or not the transaction threw an error.",
-              "type": "string"
-            }
-          }
-        },
-        "BloomFilter": {
-          "type": "string",
-          "description": "A 2048 bit bloom filter from the logs of the transaction. Each log sets 3 bits though taking the low-order 11 bits of each of the first three pairs of bytes in a Keccak 256 hash of the log's byte series"
-        },
-        "Log": {
-          "type": "object",
-          "description": "An indexed event generated during a transaction",
-          "properties": {
-            "address": {
-              "description": "Sender of the transaction",
-              "$ref": "#/components/schemas/Address"
-            },
-            "blockHash": {
-              "description": "BlockHash of the block in which the transaction was mined",
-              "$ref": "#/components/schemas/BlockHash"
-            },
-            "blockNumber": {
-              "description": "BlockNumber of the block in which the transaction was mined",
-              "$ref": "#/components/schemas/BlockNumber"
-            },
-            "data": {
-              "description": "The data/input string sent along with the transaction",
-              "$ref": "#/components/schemas/Bytes"
-            },
-            "logIndex": {
-              "description": "The index of the event within its transaction, null when its pending",
-              "$ref": "#/components/schemas/Integer"
-            },
-            "removed": {
-              "schema": {
-                "description": "Whether or not the log was orphaned off the main chain",
-                "type": "boolean"
-              }
-            },
-            "topics": {
-              "type": "array",
-              "items": {
-                "topic": {
-                  "description": "32 Bytes DATA of indexed log arguments. (In solidity: The first topic is the hash of the signature of the event (e.g. Deposit(address,bytes32,uint256))",
-                  "$ref": "#/components/schemas/DataWord"
-                }
-              }
-            },
-            "transactionHash": {
-              "description": "The hash of the transaction in which the log occurred",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "transactionIndex": {
-              "description": "The index of the transaction in which the log occurred",
-              "$ref": "#/components/schemas/Integer"
-            }
-          }
-        },
-        "Uncle": {
-          "type": "object",
-          "description": "Orphaned blocks that can be included in the chain but at a lower block reward. NOTE: An uncle doesn’t contain individual transactions.",
-          "properties": {
-            "number": {
-              "description": "The block number or null when its the pending block",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "hash": {
-              "description": "The block hash or null when its the pending block",
-              "$ref": "#/components/schemas/KeccakOrPending"
-            },
-            "parentHash": {
-              "description": "Hash of the parent block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "nonce": {
-              "description": "Randomly selected number to satisfy the proof-of-work or null when its the pending block",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "sha3Uncles": {
-              "description": "Keccak hash of the uncles data in the block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "logsBloom": {
-              "type": "string",
-              "description": "The bloom filter for the logs of the block or null when its the pending block",
-              "pattern": "^0x[a-fA-F\\d]+$"
-            },
-            "transactionsRoot": {
-              "description": "The root of the transactions trie of the block.",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "stateRoot": {
-              "description": "The root of the final state trie of the block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "receiptsRoot": {
-              "description": "The root of the receipts trie of the block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "miner": {
-              "description": "The address of the beneficiary to whom the mining rewards were given or null when its the pending block",
-              "oneOf": [
-                {
-                  "$ref": "#/components/schemas/Address"
-                },
-                {
-                  "$ref": "#/components/schemas/Null"
-                }
-              ]
-            },
-            "difficulty": {
-              "type": "string",
-              "description": "Integer of the difficulty for this block"
-            },
-            "totalDifficulty": {
-              "description": "Integer of the total difficulty of the chain until this block",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "extraData": {
-              "type": "string",
-              "description": "The 'extra data' field of this block"
-            },
-            "size": {
-              "type": "string",
-              "description": "Integer the size of this block in bytes"
-            },
-            "gasLimit": {
-              "type": "string",
-              "description": "The maximum gas allowed in this block"
-            },
-            "gasUsed": {
-              "type": "string",
-              "description": "The total used gas by all transactions in this block"
-            },
-            "timestamp": {
-              "type": "string",
-              "description": "The unix timestamp for when the block was collated"
-            },
-            "uncles": {
-              "description": "Array of uncle hashes",
-              "type": "array",
-              "items": {
-                "description": "Block hash of the RLP encoding of an uncle block",
-                "$ref": "#/components/schemas/Keccak"
-              }
-            }
-          }
-        },
-        "Block": {
-          "type": "object",
-          "properties": {
-            "number": {
-              "description": "The block number or null when its the pending block",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "hash": {
-              "description": "The block hash or null when its the pending block",
-              "$ref": "#/components/schemas/KeccakOrPending"
-            },
-            "parentHash": {
-              "description": "Hash of the parent block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "nonce": {
-              "description": "Randomly selected number to satisfy the proof-of-work or null when its the pending block",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "sha3Uncles": {
-              "description": "Keccak hash of the uncles data in the block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "logsBloom": {
-              "type": "string",
-              "description": "The bloom filter for the logs of the block or null when its the pending block",
-              "pattern": "^0x[a-fA-F\\d]+$"
-            },
-            "transactionsRoot": {
-              "description": "The root of the transactions trie of the block.",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "stateRoot": {
-              "description": "The root of the final state trie of the block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "receiptsRoot": {
-              "description": "The root of the receipts trie of the block",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "miner": {
-              "description": "The address of the beneficiary to whom the mining rewards were given or null when its the pending block",
-              "oneOf": [
-                {
-                  "$ref": "#/components/schemas/Address"
-                },
-                {
-                  "$ref": "#/components/schemas/Null"
-                }
-              ]
-            },
-            "difficulty": {
-              "type": "string",
-              "description": "Integer of the difficulty for this block"
-            },
-            "totalDifficulty": {
-              "description": "Integer of the total difficulty of the chain until this block",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "extraData": {
-              "type": "string",
-              "description": "The 'extra data' field of this block"
-            },
-            "size": {
-              "type": "string",
-              "description": "Integer the size of this block in bytes"
-            },
-            "gasLimit": {
-              "type": "string",
-              "description": "The maximum gas allowed in this block"
-            },
-            "gasUsed": {
-              "type": "string",
-              "description": "The total used gas by all transactions in this block"
-            },
-            "timestamp": {
-              "type": "string",
-              "description": "The unix timestamp for when the block was collated"
-            },
-            "transactions": {
-              "description": "Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter",
-              "type": "array",
-              "items": {
-                "oneOf": [
-                  {
-                    "$ref": "#/components/schemas/Transaction"
-                  },
-                  {
-                    "$ref": "#/components/schemas/TransactionHash"
-                  }
-                ]
-              }
-            },
-            "uncles": {
-              "description": "Array of uncle hashes",
-              "type": "array",
-              "items": {
-                "description": "Block hash of the RLP encoding of an uncle block",
-                "$ref": "#/components/schemas/Keccak"
-              }
-            }
-          }
-        },
-        "Transaction": {
-          "type": "object",
-          "required": [
-            "gas",
-            "gasPrice",
-            "nonce"
-          ],
-          "properties": {
-            "blockHash": {
-              "description": "Hash of the block where this transaction was in. null when its pending",
-              "$ref": "#/components/schemas/KeccakOrPending"
-            },
-            "blockNumber": {
-              "description": "Block number where this transaction was in. null when its pending",
-              "$ref": "#/components/contentDescriptors/BlockNumber"
-            },
-            "from": {
-              "description": "Address of the sender",
-              "$ref": "#/components/schemas/Address"
-            },
-            "gas": {
-              "type": "string",
-              "description": "The gas limit provided by the sender in Wei"
-            },
-            "gasPrice": {
-              "type": "string",
-              "description": "The gas price willing to be paid by the sender in Wei"
-            },
-            "hash": {
-              "$ref": "#/components/schemas/TransactionHash"
-            },
-            "data": {
-              "type": "string",
-              "description": "The data field sent with the transaction"
-            },
-            "nonce": {
-              "description": "The total number of prior transactions made by the sender",
-              "$ref": "#/components/schemas/Nonce"
-            },
-            "to": {
-              "description": "address of the receiver. null when its a contract creation transaction",
-              "$ref": "#/components/schemas/Address"
-            },
-            "transactionIndex": {
-              "description": "Integer of the transaction's index position in the block. null when its pending",
-              "$ref": "#/components/schemas/IntOrPending"
-            },
-            "value": {
-              "description": "Value of Ether being transferred in Wei",
-              "$ref": "#/components/schemas/Keccak"
-            },
-            "v": {
-              "type": "string",
-              "description": "ECDSA recovery id"
-            },
-            "r": {
-              "type": "string",
-              "description": "ECDSA signature r"
-            },
-            "s": {
-              "type": "string",
-              "description": "ECDSA signature s"
-            }
-          }
-        },
-        "TransactionHash": {
-          "type": "string",
-          "description": "Keccak 256 Hash of the RLP encoding of a transaction",
-          "$ref": "#/components/schemas/Keccak"
-        },
-        "KeccakOrPending": {
-          "oneOf": [
-            {
-              "$ref": "#/components/schemas/Keccak"
-            },
-            {
-              "$ref": "#/components/schemas/Null"
-            }
-          ]
-        },
-        "IntOrPending": {
-          "oneOf": [
-            {
-              "$ref": "#/components/schemas/Integer"
-            },
-            {
-              "$ref": "#/components/schemas/Null"
-            }
-          ]
-        },
-        "Keccak": {
-          "type": "string",
-          "description": "Hex representation of a Keccak 256 hash",
-          "pattern": "^0x[a-fA-F\\d]{64}$"
-        },
-        "Nonce": {
-          "description": "A number only to be used once",
-          "pattern": "^0x[a-fA-F0-9]+$",
-          "type": "string"
-        },
-        "Null": {
-          "type": "null",
-          "description": "Null"
-        },
-        "Integer": {
-          "type": "string",
-          "pattern": "^0x[a-fA-F0-9]+$",
-          "description": "Hex representation of the integer"
-        },
-        "Address": {
-          "type": "string",
-          "pattern": "^0x[a-fA-F\\d]{40}$"
-        },
-        "Position": {
-          "type": "string",
-          "description": "Hex representation of the storage slot where the variable exists",
-          "pattern": "^0x([a-fA-F0-9]?)+$"
-        },
-        "DataWord": {
-          "type": "string",
-          "description": "Hex representation of a 256 bit unit of data",
-          "pattern": "^0x([a-fA-F\\d]{64})?$"
-        },
-        "Bytes": {
-          "type": "string",
-          "description": "Hex representation of a variable length byte array",
-          "pattern": "^0x([a-fA-F0-9]?)+$"
-        }
-      },
-      "contentDescriptors": {
-        "Block": {
-          "name": "block",
-          "summary": "A block",
-          "description": "A block object",
-          "schema": {
-            "$ref": "#/components/schemas/Block"
-          }
-        },
-        "Null": {
-          "name": "Null",
-          "description": "JSON Null value",
-          "summary": "Null value",
-          "schema": {
-            "type": "null",
-            "description": "Null value"
-          }
-        },
-        "Signature": {
-          "name": "signature",
-          "summary": "The signature.",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/Bytes",
-            "pattern": "0x^([A-Fa-f0-9]{2}){65}$"
-          }
-        },
-        "GasPrice": {
-          "name": "gasPrice",
-          "required": true,
-          "schema": {
-            "description": "Integer of the current gas price",
-            "$ref": "#/components/schemas/Integer"
-          }
-        },
-        "Transaction": {
-          "required": true,
-          "name": "transaction",
-          "schema": {
-            "$ref": "#/components/schemas/Transaction"
-          }
-        },
-        "TransactionResult": {
-          "name": "transactionResult",
-          "description": "Returns a transaction or null",
-          "schema": {
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/Transaction"
-              },
-              {
-                "$ref": "#/components/schemas/Null"
-              }
-            ]
-          }
-        },
-        "Message": {
-          "name": "message",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/Bytes"
-          }
-        },
-        "Filter": {
-          "name": "filter",
-          "required": true,
-          "schema": {
-            "type": "object",
-            "description": "A filter used to monitor the blockchain for log/events",
-            "properties": {
-              "fromBlock": {
-                "description": "Block from which to begin filtering events",
-                "$ref": "#/components/schemas/BlockNumber"
-              },
-              "toBlock": {
-                "description": "Block from which to end filtering events",
-                "$ref": "#/components/schemas/BlockNumber"
-              },
-              "address": {
-                "oneOf": [
-                  {
-                    "type": "string",
-                    "description": "Address of the contract from which to monitor events",
-                    "$ref": "#/components/schemas/Address"
-                  },
-                  {
-                    "type": "array",
-                    "description": "List of contract addresses from which to monitor events",
-                    "items": {
-                      "$ref": "#/components/schemas/Address"
-                    }
-                  }
-                ]
-              },
-              "topics": {
-                "type": "array",
-                "description": "Array of 32 Bytes DATA topics. Topics are order-dependent. Each topic can also be an array of DATA with 'or' options",
-                "items": {
-                  "description": "Indexable 32 bytes piece of data (made from the event's function signature in solidity)",
-                  "$ref": "#/components/schemas/DataWord"
-                }
-              }
-            }
-          }
-        },
-        "Address": {
-          "name": "address",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/Address"
-          }
-        },
-        "BlockHash": {
-          "name": "blockHash",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/BlockHash"
-          }
-        },
-        "Nonce": {
-          "name": "nonce",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/Nonce"
-          }
-        },
-        "Position": {
-          "name": "key",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/Position"
-          }
-        },
-        "Logs": {
-          "name": "logs",
-          "description": "An array of all logs matching filter with given id.",
-          "schema": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/Log"
-            }
-          }
-        },
-        "FilterId": {
-          "name": "filterId",
-          "schema": {
-            "description": "The filter ID for use in `eth_getFilterChanges`",
-            "$ref": "#/components/schemas/Integer"
-          }
-        },
-        "BlockNumber": {
-          "name": "blockNumber",
-          "required": true,
-          "schema": {
-            "oneOf": [
-              {
-                "$ref": "#/components/schemas/BlockNumber"
-              },
-              {
-                "$ref": "#/components/schemas/BlockNumberTag"
-              }
-            ]
-          }
-        },
-        "TransactionHash": {
-          "name": "transactionHash",
-          "required": true,
-          "schema": {
-            "$ref": "#/components/schemas/TransactionHash"
-          }
-        }
-      }
-    }
-  }
diff --git a/openrpc/templates/generate.sh b/openrpc/templates/generate.sh
deleted file mode 100755
index 0eaf74dcab79b9aded34106999d425f24e2bfe62..0000000000000000000000000000000000000000
--- a/openrpc/templates/generate.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-cat types.gotmpl | sed 's/`/`\+"`"\+`/g' | sed '1s/^/package templates \nconst TEMPLATE=`/' | sed '$a`' > template.go
diff --git a/openrpc/templates/provide.go b/openrpc/templates/provide.go
deleted file mode 100644
index 39409ff5e10181b6553f16c650926a35c1c5ac16..0000000000000000000000000000000000000000
--- a/openrpc/templates/provide.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package templates
-
-//go:generate sh generate.sh
diff --git a/openrpc/templates/template.go b/openrpc/templates/template.go
deleted file mode 100644
index 0e6485d21777101b6fd1f6ba9ce07b1bd7c71d51..0000000000000000000000000000000000000000
--- a/openrpc/templates/template.go
+++ /dev/null
@@ -1,114 +0,0 @@
-package templates 
-const TEMPLATE=`// Code generated by jrpc. DO NOT EDIT.
-
-package {{ .Package }}
-
-import (
-	"context"
-	"errors"
-	"fmt"
-
-	"gfx.cafe/open/jrpc/contrib/jmux"
-)
-
-
-var _ = context.Background
-var _ = errors.New
-var _ = fmt.Sprintf
-
-
-
-
-{{- range $name, $component := .Components.Schemas }}
-    type {{camelCase $name}} {{template "schemaType" $component}}
-{{- end }}
-
-{{define "schemaType" -}}
-    {{if not (eq .Ref "") -}}
-        {{camelCase (refName .Ref)}}
-    {{- else if or
-        (not (eq (len .Properties) 0))
-        (not (eq (len .OneOf) 0))
-        (not (eq (len .AnyOf) 0))
-        (not (eq (len .AllOf) 0))
-    -}}
-        struct {
-            {{range $name, $property := .Properties -}}
-                {{camelCase $name}} {{template "schemaType" $property}} `+"`"+`json:"{{$name}}"`+"`"+`
-            {{end -}}
-            {{range $idx, $property := .OneOf -}}
-                Option{{$idx}} {{template "schemaType" $property}}
-            {{end -}}
-            {{range $idx, $property := .AnyOf -}}
-                Option{{$idx}} {{template "schemaType" $property}}
-            {{end -}}
-            {{range $idx, $property := .AllOf -}}
-                Field{{$idx}} {{template "schemaType" $property}}
-            {{end -}}
-        }
-    {{- else if eq .Type "array" -}}
-        []{{template "schemaType" (index .Items 0)}}
-    {{- else if not (eq (len .Enum) 0) -}}
-        string
-    {{- else -}}
-        {{goType .Type}}
-    {{- end}}
-{{- end -}}
-
-type GoOpenRPCHandler struct {
-	Srv GoOpenRPCService
-}
-{{range .Methods -}}
-    // {{.Summary}}
-    func(h *RpcHandler) {{camelCase .Name}}(ctx context.Context,
-        {{range .Params -}}{{camelCase .Name}} {{if not .Required}}*{{end}}{{template "schemaType" .Schema}},
-        {{end -}}) ({{camelCase .Result.Name}} {{template "schemaType" .Result.Schema}}, err error) {
-        handler := h.Fn{{camelCase .Name}}
-        if handler == nil {
-            err = errors.New("method {{.Name}} not implemented")
-            return
-        }
-        return handler(ctx,
-        {{range .Params -}}{{camelCase .Name}},
-        {{end -}})
-    }
-{{end -}}
-
-
-type GoOpenRPCService interface {
-    {{range .Methods -}}
-        // {{.Summary}}
-        {{camelCase .Name}}(ctx context.Context,
-            {{range .Params -}}{{camelCase .Name}} {{if not .Required}}*{{end}}{{template "schemaType" .Schema}},
-            {{end -}}
-            ) ({{camelCase .Result.Name}} {{template "schemaType" .Result.Schema}}, err error)
-    {{end -}}
-}
-
-
-
-func (h *GoOpenRPCHandler) RouteRPC(r jmux.Router) {
-    {{range .Methods -}}
-        // {{.Summary}}
-        {{if .Namespace}}
-            if err := r.RegisterFunc("{{.Namespace}}_{{.MethodName}}", h.Srv.{{camelCase .Name}}); err != nil {
-                panic(err)
-            }
-        {{else}}
-            if err := r.RegisterFunc("{{.MethodName}}", h.Srv.{{camelCase .Name}}); err != nil {
-                panic(err)
-            }
-        {{end}}
-    {{end -}}
-}
-
-type RpcHandler struct {
-{{range .Methods -}}
-    // {{.Summary}}
-  Fn{{camelCase .Name}} func(ctx context.Context,
-        {{range .Params -}}{{camelCase .Name}} {{if not .Required}}*{{end}}{{template "schemaType" .Schema}},
-        {{end -}})({{camelCase .Result.Name}} {{template "schemaType" .Result.Schema}}, err error)
-
-{{end -}}
-}
-`
diff --git a/openrpc/templates/types.gotmpl b/openrpc/templates/types.gotmpl
deleted file mode 100644
index c1553ea2446a163ec784ee4b2f47428f150e55ce..0000000000000000000000000000000000000000
--- a/openrpc/templates/types.gotmpl
+++ /dev/null
@@ -1,112 +0,0 @@
-// Code generated by jrpc. DO NOT EDIT.
-
-package {{ .Package }}
-
-import (
-	"context"
-	"errors"
-	"fmt"
-
-	"gfx.cafe/open/jrpc/contrib/jmux"
-)
-
-
-var _ = context.Background
-var _ = errors.New
-var _ = fmt.Sprintf
-
-
-
-
-{{- range $name, $component := .Components.Schemas }}
-    type {{camelCase $name}} {{template "schemaType" $component}}
-{{- end }}
-
-{{define "schemaType" -}}
-    {{if not (eq .Ref "") -}}
-        {{camelCase (refName .Ref)}}
-    {{- else if or
-        (not (eq (len .Properties) 0))
-        (not (eq (len .OneOf) 0))
-        (not (eq (len .AnyOf) 0))
-        (not (eq (len .AllOf) 0))
-    -}}
-        struct {
-            {{range $name, $property := .Properties -}}
-                {{camelCase $name}} {{template "schemaType" $property}} `json:"{{$name}}"`
-            {{end -}}
-            {{range $idx, $property := .OneOf -}}
-                Option{{$idx}} {{template "schemaType" $property}}
-            {{end -}}
-            {{range $idx, $property := .AnyOf -}}
-                Option{{$idx}} {{template "schemaType" $property}}
-            {{end -}}
-            {{range $idx, $property := .AllOf -}}
-                Field{{$idx}} {{template "schemaType" $property}}
-            {{end -}}
-        }
-    {{- else if eq .Type "array" -}}
-        []{{template "schemaType" (index .Items 0)}}
-    {{- else if not (eq (len .Enum) 0) -}}
-        string
-    {{- else -}}
-        {{goType .Type}}
-    {{- end}}
-{{- end -}}
-
-type GoOpenRPCHandler struct {
-	Srv GoOpenRPCService
-}
-{{range .Methods -}}
-    // {{.Summary}}
-    func(h *RpcHandler) {{camelCase .Name}}(ctx context.Context,
-        {{range .Params -}}{{camelCase .Name}} {{if not .Required}}*{{end}}{{template "schemaType" .Schema}},
-        {{end -}}) ({{camelCase .Result.Name}} {{template "schemaType" .Result.Schema}}, err error) {
-        handler := h.Fn{{camelCase .Name}}
-        if handler == nil {
-            err = errors.New("method {{.Name}} not implemented")
-            return
-        }
-        return handler(ctx,
-        {{range .Params -}}{{camelCase .Name}},
-        {{end -}})
-    }
-{{end -}}
-
-
-type GoOpenRPCService interface {
-    {{range .Methods -}}
-        // {{.Summary}}
-        {{camelCase .Name}}(ctx context.Context,
-            {{range .Params -}}{{camelCase .Name}} {{if not .Required}}*{{end}}{{template "schemaType" .Schema}},
-            {{end -}}
-            ) ({{camelCase .Result.Name}} {{template "schemaType" .Result.Schema}}, err error)
-    {{end -}}
-}
-
-
-
-func (h *GoOpenRPCHandler) RouteRPC(r jmux.Router) {
-    {{range .Methods -}}
-        // {{.Summary}}
-        {{if .Namespace}}
-            if err := r.RegisterFunc("{{.Namespace}}_{{.MethodName}}", h.Srv.{{camelCase .Name}}); err != nil {
-                panic(err)
-            }
-        {{else}}
-            if err := r.RegisterFunc("{{.MethodName}}", h.Srv.{{camelCase .Name}}); err != nil {
-                panic(err)
-            }
-        {{end}}
-    {{end -}}
-}
-
-type RpcHandler struct {
-{{range .Methods -}}
-    // {{.Summary}}
-  Fn{{camelCase .Name}} func(ctx context.Context,
-        {{range .Params -}}{{camelCase .Name}} {{if not .Required}}*{{end}}{{template "schemaType" .Schema}},
-        {{end -}})({{camelCase .Result.Name}} {{template "schemaType" .Result.Schema}}, err error)
-
-{{end -}}
-}
diff --git a/openrpc/types/types.go b/openrpc/types/types.go
deleted file mode 100644
index 325652cd54b6e74b5fe470d423302c10861c68d5..0000000000000000000000000000000000000000
--- a/openrpc/types/types.go
+++ /dev/null
@@ -1,250 +0,0 @@
-package types
-
-import (
-	"encoding/json"
-	"fmt"
-	"os"
-	"path"
-	"path/filepath"
-	"strings"
-
-	"sigs.k8s.io/yaml"
-)
-
-type Server struct {
-	Name        string                    `json:"name"`
-	URL         string                    `json:"url"`
-	Summary     string                    `json:"summary,omitempty"`
-	Description string                    `json:"description,omitempty"`
-	Variables   map[string]ServerVariable `json:"variables,omitempty"`
-}
-
-type ServerVariable struct {
-	Enum        []string `json:"enum,omitempty"`
-	Default     string   `json:"default,omitempty"`
-	Description string   `json:"description,omitempty"`
-}
-
-type Info struct {
-	Title       string  `json:"title"`
-	Description string  `json:"description"`
-	Version     string  `json:"version"`
-	Contact     Contact `json:"contact,omitempty"`
-}
-
-type Contact struct {
-	Name  string `json:"name,omitempty"`
-	URL   string `json:"url,omitempty"`
-	Email string `json:"email,omitempty"`
-}
-
-type Items []Schema
-
-func (I *Items) UnmarshalJSON(b []byte) error {
-	switch b[0] {
-	case '{':
-		*I = []Schema{
-			{},
-		}
-		return json.Unmarshal(b, &(*I)[0])
-	case '[':
-		return json.Unmarshal(b, (*[]Schema)(I))
-	default:
-		return fmt.Errorf("expected array or object")
-	}
-}
-
-var _ json.Unmarshaler = (*Items)(nil)
-
-type Schema struct {
-	Ref         string            `json:"$ref,omitempty"`
-	Description string            `json:"description,omitempty"`
-	Type        string            `json:"type,omitempty"`
-	Title       string            `json:"title,omitempty"`
-	Required    []string          `json:"required,omitempty"`
-	Items       Items             `json:"items,omitempty"`
-	Properties  map[string]Schema `json:"properties,omitempty"`
-	OneOf       []Schema          `json:"oneOf,omitempty"`
-	AnyOf       []Schema          `json:"anyOf,omitempty"`
-	AllOf       []Schema          `json:"allOf,omitempty"`
-	Enum        []string          `json:"enum,omitempty"`
-	Pattern     string            `json:"pattern,omitempty"`
-}
-
-type Param struct {
-	Name        string `json:"name"`
-	Summary     string `json:"summary,omitempty"`
-	Description string `json:"description,omitempty"`
-	Required    bool   `json:"required"`
-	Schema      Schema `json:"schema"`
-}
-
-type Result struct {
-	Name        string `json:"name"`
-	Description string `json:"description,omitempty"`
-	Schema      Schema `json:"schema"`
-}
-
-type Method struct {
-	Name     string           `json:"name"`
-	Tags     []Tag            `json:"tags,omitempty"`
-	Summary  string           `json:"summary"`
-	Params   []Param          `json:"params"`
-	Result   Result           `json:"result"`
-	Examples []ExamplePairing `json:"examples,omitempty"`
-}
-
-type Tag struct {
-	Ref          string                 `json:"$ref,omitempty"`
-	Name         string                 `json:"name"`
-	Summary      string                 `json:"summary,omitempty"`
-	Description  string                 `json:"description,omitempty"`
-	ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"`
-}
-
-type ExternalDocumentation struct {
-	Description string `json:"description,omitempty"`
-	URL         string `json:"url,omitempty"`
-}
-
-type ExamplePairing struct {
-	Name        string    `json:"name"`
-	Description string    `json:"description,omitempty"`
-	Summary     string    `json:"summary,omitempty"`
-	Params      []Example `json:"params"`
-	Result      Example   `json:"result"`
-}
-
-type Example struct {
-	Ref         string `json:"$ref,omitempty"`
-	Name        string `json:"name"`
-	Summary     string `json:"summary,omitempty"`
-	Description string `json:"description,omitempty"`
-	Value       any    `json:"value"`
-}
-
-func (m *Method) Namespace() string {
-	splt := strings.Split(m.Name, "_")
-	if len(splt) > 1 {
-		return splt[0]
-	}
-	return ""
-}
-
-func (m *Method) MethodName() string {
-	splt := strings.Split(m.Name, "_")
-	if len(splt) > 1 {
-		return splt[1]
-	}
-	return splt[0]
-}
-
-type OpenRPC struct {
-	Package    string   `json:"-"`
-	Version    string   `json:"openrpc"`
-	Info       Info     `json:"info"`
-	Methods    []Method `json:"methods"`
-	Servers    []Server `json:"servers"`
-	Components struct {
-		Schemas map[string]Schema `json:"schemas"`
-	} `json:"components"`
-}
-
-func NewOpenRPCSpec1() *OpenRPC {
-	return &OpenRPC{
-		Package: "main",
-		Version: "1.0.0",
-		Info: Info{
-			Title:       "gfx.cafe/open/jrpc/openrpc",
-			Description: "",
-			Version:     "0.0.0",
-		},
-		Servers: make([]Server, 0),
-		Methods: make([]Method, 0),
-	}
-}
-
-func (o *OpenRPC) AddSchemas(pth string) error {
-	dr, err := os.ReadDir(pth)
-	if err != nil {
-		return err
-	}
-	for _, v := range dr {
-		if v.IsDir() {
-			if err := o.AddSchemas(path.Join(pth, v.Name())); err != nil {
-				return err
-			}
-		} else {
-			if err := o.AddSchema(path.Join(pth, v.Name())); err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-func (o *OpenRPC) AddSchema(pth string) error {
-	schem := map[string]Schema{}
-	bts, err := os.ReadFile(pth)
-	if err != nil {
-		return err
-	}
-	ext := filepath.Ext(path.Base(pth))
-	switch ext {
-	case ".json":
-		err = json.Unmarshal(bts, &schem)
-	case ".yml", ".yaml":
-		err = yaml.Unmarshal(bts, &schem)
-	}
-	if err != nil {
-		return err
-	}
-	if o.Components.Schemas == nil {
-		o.Components.Schemas = map[string]Schema{}
-	}
-	for k, v := range schem {
-		o.Components.Schemas[k] = v
-	}
-	return nil
-}
-
-func (o *OpenRPC) AddMethods(pth string) error {
-	dr, err := os.ReadDir(pth)
-	if err != nil {
-		return err
-	}
-	for _, v := range dr {
-		if v.IsDir() {
-			if err := o.AddMethods(path.Join(pth, v.Name())); err != nil {
-				return err
-			}
-		} else {
-			if err := o.AddMethod(path.Join(pth, v.Name())); err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-func (o *OpenRPC) AddMethod(pth string) error {
-	var meth []Method
-	bts, err := os.ReadFile(pth)
-	if err != nil {
-		return err
-	}
-	switch filepath.Ext(path.Base(pth)) {
-	case ".json":
-		err = json.Unmarshal(bts, &meth)
-	case ".yml", ".yaml":
-		err = yaml.Unmarshal(bts, &meth)
-		if err != nil {
-			return err
-		}
-	}
-	if err != nil {
-		return err
-	}
-	o.Methods = append(o.Methods, meth...)
-	return nil
-}
diff --git a/openrpc/util/common.go b/openrpc/util/common.go
deleted file mode 100644
index afb4f6b033ad0f2cfa6129c433f5233f269a424a..0000000000000000000000000000000000000000
--- a/openrpc/util/common.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package util
-
-import (
-	"regexp"
-	"strings"
-	"unicode"
-
-	"github.com/davecgh/go-spew/spew"
-)
-
-func SanitizeBackticks(s string) string {
-	reg, err := regexp.Compile("`")
-	if err != nil {
-		panic(err.Error())
-	}
-	s = reg.ReplaceAllString(s, "'")
-	return s
-}
-
-func Slice(val []interface{}, index int) interface{} {
-	return val[index]
-}
-
-func Inpect(val interface{}) string {
-	return spew.Sdump(val)
-}
-
-func CamelCase(name string) string {
-	var in []string
-	if strings.Contains(name, " ") {
-		in = strings.Split(name, " ")
-	} else {
-		in = strings.Split(name, "_")
-	}
-	if len(in) == 0 {
-		return strings.Title(name)
-	}
-	out := make([]string, 0, len(in))
-	for _, word := range in {
-		out = append(out, strings.Title(word))
-	}
-	return strings.TrimSpace(strings.Join(out, ""))
-}
-
-func LowerFirst(name string) string {
-	for i, v := range name {
-		return string(unicode.ToLower(v)) + name[i+1:]
-	}
-	return ""
-}
-
-func FirstOf(opts ...string) string {
-	for _, opt := range opts {
-		if opt != "" {
-			return opt
-		}
-	}
-	return ""
-}