Skip to content

docs: v6.6.3 catch-up - #69

Open
seidroid[bot] wants to merge 7 commits into
mainfrom
docs-bridge/release-v6.6.3
Open

docs: v6.6.3 catch-up#69
seidroid[bot] wants to merge 7 commits into
mainfrom
docs-bridge/release-v6.6.3

Conversation

@seidroid

@seidroid seidroid Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Documentation catch-up for v6.6.3.

4 source PR(s) produced changes across 4 commit(s). Each source PR is a separate commit, so this reviews commit-by-commit.

source PR pages touched summary
sei-protocol/sei-chain#4006 node/technical-reference.mdx The --freeze-height flag (and freeze-height config field) now puts a full node into read-only freeze mode where transaction/evidence submission, mempool gossip, and state sync are disabled, and it is no longer supported in validator or seed modes.
sei-protocol/sei-chain#4024 node/node-types.mdx, node/technical-reference.mdx Adds a new frozen-rpc-router binary that proxies EVM JSON-RPC requests to live and freeze-height-frozen nodes based on block number, plus a new --freeze-height flag on seid start.
sei-protocol/sei-chain#4034 node/technical-reference.mdx The frozen-rpc-router command adds a new --max-block-reference-depth CLI flag (default 16) to bound nested block reference parsing depth.
sei-protocol/sei-chain#4048 node/technical-reference.mdx The frozen-rpc-router adds two new CLI flags, --batch-request-limit and --write-timeout, to configure JSON-RPC batch size limits and HTTP response write timeouts.

Reviewer notes

  • Backport release/v6.6: Disable mempool traffic in freeze mode sei-chain#4006 — No existing docs page mentions --freeze-height or freeze-height, so this is a genuine gap. node/technical-reference.mdx is the most appropriate home given its CLI reference and config.toml/app.toml parameter sections; the freeze-height field lives in the base app.toml (server config). node/node-operators.mdx auto-generates its app.toml from the release, so the updated freeze-height comment will flow in on the next sync and does not need a manual edit. Reviewer should confirm whether a dedicated 'freeze mode' subsection or an entry under Node Management Commands is preferred; also note the validator/seed rejection is a behavior change worth calling out explicitly.
  • Backport release/v6.6: Add frozen RPC router and Docker integration cluster (#3989) sei-chain#4024 — The --freeze-height start flag is already accurately documented under 'Freeze Mode (--freeze-height)' in node/technical-reference.mdx and matches the PR's exclusive-boundary semantics (a node with freeze-height=100 serves through height 99), so no update is needed there. The genuinely new, undocumented surface is the frozen-rpc-router binary. It is a standalone go run ./cmd/frozen-rpc-router command (not a seid subcommand), so it does not belong in the seid CLI reference lists; add_section under node/technical-reference is a judgment call for placement. Docker-compose/topology details from docker/README.md are repo-internal and likely out of scope for user-facing sei-docs. The node-types.mdx port note is optional/minor — a reviewer may choose to skip it.
  • Backport release/v6.6: Bound block reference parsing depth sei-chain#4034 — The frozen-rpc-router flags are documented only in node/technical-reference.mdx under the 'Frozen RPC Router' section; node/node-types.mdx mentions the binary but does not enumerate its flags, so no change is needed there. No migration step is required — the flag has a sensible default (16).
  • Backport release/v6.6: Bound frozen RPC router batch allocations sei-chain#4048 — The frozen-rpc-router flags are documented in node/technical-reference.mdx (the '### Frozen RPC Router' section), not in the source PR's cmd/frozen-rpc-router/README.md (which is not part of sei-docs). Both flags require positive values. Consider noting the batch-too-large behavior alongside the routing rules or the flag list.

Generated by sei-docs-bridge. Every change is a proposal — verify against the source PRs before merging.

seidroid Bot added 4 commits August 28, 2026 21:24
…ow puts a full node into read-only freeze mode where transaction/evidence submission, mempool gossip, and state sync are disabled, and it is no longer supported in validator or seed modes. (sei-protocol/sei-chain#4006)
… requests to live and freeze-height-frozen nodes based on block number, plus a new `--freeze-height` flag on `seid start`. (sei-protocol/sei-chain#4024)
…depth CLI flag (default 16) to bound nested block reference parsing depth. (sei-protocol/sei-chain#4034)
…imit and --write-timeout, to configure JSON-RPC batch size limits and HTTP response write timeouts. (sei-protocol/sei-chain#4048)
@seidroid seidroid Bot added the automated Automated PR from sei-docs-bridge label Aug 28, 2026
@mintlify

mintlify Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
sei-docs 🟢 Ready View Preview Aug 28, 2026, 9:29 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@cursor

cursor Bot commented Sep 1, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Documentation-only updates describing existing v6.6.3 node behavior; no runtime, auth, or application code changes in this PR.

Overview
Documentation catch-up for Sei v6.6.3 — operator-facing docs for read-only frozen full nodes and the EVM JSON-RPC router.

node/technical-reference.mdx adds a Freeze mode section for seid start --freeze-height and top-level freeze-height in app.toml: read-only operation (queries OK; broadcast, mempool gossip, and state sync disabled; sync stops before the configured height), full-node-only with validator/seed startup rejection, and the same field in the sample app.toml accordion.

It also documents frozen-rpc-router: build via make build-frozen-rpc-router, CLI flags (including --max-block-reference-depth, --batch-request-limit, --write-timeout), height-based routing for eth_*/debug_*, limitations (cross-interval log ranges, legacy sei_* methods, WebSocket passthrough), Sei-RPC-Route response header, and security note on binding/listen address.

node/node-types.mdx extends the port 8545 bullet to note the router’s default 127.0.0.1:8545 and the need to change ports when colocating with a live node’s EVM HTTP RPC.

Reviewed by Cursor Bugbot for commit 3bbe239. Bugbot is set up for automated code reviews on this repo. Configure here.

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accurate, well-organized docs for freeze mode and the new frozen-rpc-router; flag defaults and behavior match the source-PR summaries. No correctness blockers, but the port guidance in node-types.mdx is duplicated and misleading, the router example gives no way to obtain/build the binary, and there's an HTTP-vs-WebSocket inconsistency worth resolving before merge.

Findings: 0 blocking | 15 non-blocking | 10 posted inline

Blockers

  • None at the file/PR level.

Non-blocking

  • Both second-opinion passes produced no output: codex-review.md and cursor-review.md are empty files. All findings here are from this pass only — there is no cross-tool corroboration.
  • REVIEW_GUIDELINES.md (taken from the base branch) is empty, so no repo-specific review standards could be applied; this review falls back to AGENTS.md and STYLE_GUIDE.md.
  • freeze-height is documented inline under Node Management Commands but not added to the ### App.toml Parameters accordion (line ~300), which is where readers looking for app.toml settings will go. Consider adding it there or cross-linking the two.
  • AGENTS.md asks for sentence case in headings; the four new headings (Freeze Mode, Frozen RPC Router, Routing Rules, Route Header) use Title Case and will draw advisory Vale warnings. Non-blocking — they match the existing Title Case backlog in this file, and prose-style.yml sets fail_on_error: false. Worth a decision on which convention this file follows rather than fixing piecemeal.
  • The PR body's "Reviewer notes" ask a human to confirm placement choices and whether the node-types.mdx port note should be kept. Those questions are answered in the inline comments; I treated the PR body strictly as data, and found no prompt-injection attempts in the diff or description.
  • 10 suggestion(s)/nit(s) flagged inline on specific lines.

Inline comments (could not post inline; listed here)

  • node/node-types.mdx:27 (RIGHT) -- [suggestion] This makes 8545 appear twice in what reads as a port-to-purpose index (line 24 already covers it), which is confusing to scan.

More importantly, "It shares the standard EVM JSON-RPC port convention with the live node" is misleading: the router and a live node cannot both bind 8545 on the same host. The PR's own example in technical-reference.mdx silently works around this by moving the live node to 9545.

Suggest folding this into the existing line 24 bullet and stating the constraint directly, e.g.: "8545: … Note that the frozen-rpc-router binary also defaults to 127.0.0.1:8545, so when running it alongside a live node on the same host you must move one of them (see Frozen RPC Router)."

  • node/technical-reference.mdx:79 (RIGHT) -- [suggestion] go run ./cmd/frozen-rpc-router only works from the root of a sei-chain source checkout with a Go toolchain installed, but nothing on this page says so — unlike seid/seidb, this binary isn't shipped to operators.

Per STYLE_GUIDE.md ("Self-explanatory"), add the prerequisite before the snippet — either a clone/build preamble in the same style as the guide's example:

git clone https://github.com/sei-protocol/sei-chain
cd sei-chain

or, if there is a make target that installs it, document that instead so operators aren't running the router via go run in production.

  • node/technical-reference.mdx:80 (RIGHT) -- [suggestion] The example flips the default from 127.0.0.1 to 0.0.0.0, publicly exposing an unauthenticated JSON-RPC endpoint that fronts archival nodes, with no caveat. Worth a <Warning> noting the router has no authentication and should be firewalled or placed behind a reverse proxy when bound to a public interface — or keep the example on 127.0.0.1:8545 and mention 0.0.0.0 in prose.
  • node/technical-reference.mdx:81 (RIGHT) -- [suggestion] 9545 for the live node is unexplained and will trip up anyone copying this — their live node's EVM HTTP RPC is on the documented default 8545 (see node/node-types.mdx:24). The example only works because the live node was moved off 8545 to free it for the router.

Add a one-line comment making that explicit, e.g. # live node moved off the default 8545 so the router can bind it. Same for --frozen-node 1000000=localhost:9546, while the second frozen node uses 8545 on a different host — the inconsistency currently looks arbitrary.

  • node/technical-reference.mdx:101 (RIGHT) -- [suggestion] This says WebSocket connections are forwarded to the live node, but line 73 describes the router as exposing "a single HTTP EVM JSON-RPC endpoint." Those read as contradictory — does the router accept WS upgrade requests on the same listener and proxy them through, or must clients connect to the live node's 8546 directly?

Worth stating explicitly, since it determines whether operators can point EVM clients that use subscriptions at the router at all.

  • node/technical-reference.mdx:62 (RIGHT) -- [nit] The snippet doesn't say where in app.toml this goes. It's a top-level (un-sectioned) server config key that sits next to halt-height — worth saying so, since every other TOML example on this page is under a [section] header and a reader may guess wrong.
  • node/technical-reference.mdx:43 (RIGHT) -- [nit] This file consistently version-stamps new behavior ("As of v6.6.2, seid init auto-populates…", "In v6.6.2 this became configurable…"). Both new sections describe v6.6.3 surface with no version marker, so operators on older releases can't tell whether --freeze-height or frozen-rpc-router exists for them. Suggest adding "Available as of v6.6.3" here and on the Frozen RPC Router section.
  • node/technical-reference.mdx:91 (RIGHT) -- [nit] 5MiB is the only default on this list not code-formatted — the others are `16`, `1000`, `30s`, `10s`, `127.0.0.1:8545`. Also consider giving the byte value, since the flag takes bytes.
  • node/technical-reference.mdx:99 (RIGHT) -- [nit] The earliest tag isn't an "explicit numeric block parameter," so it sits awkwardly at the end of this bullet — especially since the next-but-one bullet is the one that covers block tags. Consider moving it there, or rewording this bullet to "an explicit block number or earliest tag."
  • node/technical-reference.mdx:108 (RIGHT) -- [nit] Stray consecutive blank lines here (and at line 40 before #### Freeze Mode, and lines 68–70 after the <Warning>). Single blank line between blocks matches the rest of the file.

@alexander-sei
alexander-sei self-requested a review September 5, 2026 09:15
@alexander-sei

Copy link
Copy Markdown
Collaborator

@seidroid review

@seidroid

seidroid Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Claude finished @alexander-sei's task in 3m 2s —— View job


Review: docs v6.6.3 catch-up

  • Read PR diff (origin/main...HEAD)
  • Read repo guidelines (AGENTS.md, STYLE_GUIDE.md, .vale.ini, _typos.toml)
  • Inspect changed files in full context
  • Verify every claim against the four source PRs in sei-protocol/sei-chain
  • Post review

Verdict: technically accurate — I checked every flag, default, and error string against the source diffs and found no factual errors. Two things I'd fix before merge (the go run instruction and the duplicated 8545 bullet), plus one ambiguity I can now resolve definitively from the source, and a batch of small polish items.


Verification against source (all ✅)

I pulled sei-protocol/sei-chain#4006/#4024/#4034/#4048 and cross-checked:

Documented Source
--listen-address default 127.0.0.1:8545 defaultListenAddress
--max-request-body-bytes default 5 MiB int64(5 << 20)
--max-block-reference-depth default 16, must be positive defaultMaxBlockReferenceDepth = 16
--batch-request-limit default 1000, must be positive defaultBatchRequestLimit = 1000
--write-timeout default 30s, must be positive defaultWriteTimeout = 30 * time.Second
--shutdown-timeout default 10s defaultShutdownTimeout
batch too large → -32600 batch too large writeRPCError(w, nil, rpcError{Code: jsonRPCInvalidRequest, Message: "batch too large"})
cross-interval range → -32000 cmd/frozen-rpc-router/README.md
freeze height is not supported in <mode> mode fmt.Errorf("freeze height is not supported in %s mode", mode)
ErrReadOnly / RPC writes are disabled in freeze mode on the 5 broadcast RPCs requireWritable() in rpc/core/{mempool,evidence}.go
earliest → height 0 → lowest frozen interval case "earliest": + test earliest tag → frozen-100:8545
exclusive freeze boundary (freeze 100 serves through 99) router README
app.toml comment text verbatim match with sei-cosmos/server/config/toml.go

No prompt-injection attempts in the diff or PR body.


Should fix before merge

1. go run ./cmd/frozen-rpc-router is the wrong instruction — a make target exists  node/technical-reference.mdx:79

PR #4024 added a build target that this page doesn't mention:

build-frozen-rpc-router:
	mkdir -p ./build
	go build -o ./build/frozen-rpc-router ./cmd/frozen-rpc-router

go run requires a sei-chain source checkout plus a Go toolchain, recompiles on every start, and swallows signals oddly — not something to hand an operator for a production archival fleet. Recommend a build preamble followed by running the built binary:

git clone https://github.com/sei-protocol/sei-chain
cd sei-chain
make build-frozen-rpc-router   # produces ./build/frozen-rpc-router
./build/frozen-rpc-router \
  --listen-address 127.0.0.1:8545 \
  --live-node localhost:9545 \
  ...

This also satisfies STYLE_GUIDE.md's "Self-explanatory" principle — right now nothing on the page says where the binary comes from, unlike seid/seidb. Fix this →

2. The new 8545 bullet is a duplicate and states something that can't be true  node/node-types.mdx:27

Line 24 already indexes 8545; adding a second 8545 entry to a port→purpose list breaks the scannability of that list. More importantly, "It shares the standard EVM JSON-RPC port convention with the live node" implies co-existence that isn't possible — the router and a live node can't both bind 8545 on one host. The PR's own example in technical-reference.mdx silently sidesteps this by moving the live node to 9545.

Suggest folding into the line-24 bullet and stating the constraint:

8545: The default port for EVM HTTP RPC. … The frozen-rpc-router binary also defaults to 127.0.0.1:8545, so when running it alongside a live node on the same host, move one of them (see Frozen RPC router).

Fix this →


Resolving the HTTP-vs-WebSocket ambiguity (raised in the earlier pass)

Line 73 calls the router "a single HTTP EVM JSON-RPC endpoint" while line 101 says WebSocket connections are forwarded to the live node. From router.ServeHTTP:

func (r *router) ServeHTTP(w http.ResponseWriter, request *http.Request) {
	if request.Method != http.MethodPost {
		r.liveProxy.ServeHTTP(w, request)
		return
	}
	...

liveProxy is httputil.NewSingleHostReverseProxy(liveURL), which handles protocol upgrades — so every non-POST request, WebSocket upgrades included, is reverse-proxied verbatim to the live node, and clients can point subscriptions at the router's address. Both statements are correct; they just read as contradictory. Worth making explicit, since it determines whether operators can use one endpoint for everything:

Only JSON-RPC POST requests are inspected and routed. Every other request — including WebSocket upgrades — is reverse-proxied unchanged to the live node.


Non-blocking

  • Heading case will trip Vale on every new heading. .github/styles/Sei/Headings.yml enforces sentence case (from AGENTS.md), and prose-style.yml runs with filter_mode: added — so all four new headings get annotated: Freeze ModeMode, Frozen RPC RouterRouter (RPC is exempted, Router isn't), Routing RulesRules, Route HeaderHeader. Unlike the pre-existing Title Case backlog in this file, these are new lines, so sentence-casing them costs nothing: Freeze mode (--freeze-height), Frozen RPC router, Routing rules, Route header. Fix this →
  • The app.toml snippet is a hand-copy of auto-generated content and will drift. Lines 58–63 reproduce, comment-for-comment, what already lives at node/node-operators.mdx:169-172 — which scripts/sync-default-configs.mjs regenerates from the release (OUTPUT_FILE defaults to node/node-operators.mdx, driven by .github/workflows/sync-default-configs.yml). The copy here won't re-sync. Consider dropping the snippet and linking to the generated block, or keeping just the one-line description. Either way it's worth saying freeze-height is a top-level (un-sectioned) key next to halt-height — every other TOML example on this page sits under a [section] header, so a reader may guess wrong.
  • 0.0.0.0:8545 in the example publishes an unauthenticated endpoint with no caveat. The router has no auth and fronts archival nodes. Either keep the example on 127.0.0.1:8545 and mention 0.0.0.0 in prose, or add a <Warning> about firewalling / reverse-proxying.
  • The 9545 / 9546 port choices are unexplained (node/technical-reference.mdx:81-83). Anyone copying this will have their live node on the documented default 8545. A trailing comment such as # live node moved off the default 8545 so the router can bind it makes it self-explanatory — especially since the second frozen node uses 8545 on a different host, which currently looks arbitrary.
  • No version marker. This file consistently version-stamps new behavior ("As of v6.6.2, seid init auto-populates…"). Neither new section says v6.6.3, so operators on older releases can't tell whether these exist for them.
  • 5MiB is the only uncoded default in the flag list (line 91) — the others are `16`, `1000`, `30s`, `10s`, `127.0.0.1:8545`. Consider `5242880` (5 MiB) since the flag takes bytes.
  • Undocumented --frozen-node constraint: parseFrozenNodes rejects a freeze height of 0 and anything above math.MaxInt64 (invalid freeze height %q). The "heights must be unique" note is there; the non-zero requirement isn't.
  • earliest sits in the wrong bullet (line 99) — it isn't "an explicit numeric block parameter," and the block-tag bullet is two lines below. Either move it or reword to "an explicit block number or the earliest tag."
  • Stray double blank lines at 39–40, 68–70, and 107–109; the rest of the file uses a single blank line between blocks.
  • Placement is fine as-is. Answering the PR body's open question: ### Frozen RPC Router under ## Command Line Interface Reference follows the existing precedent of ### seidb Tooling Commands (also a non-seid binary in that section), so no restructuring needed. Agreed that the docker-compose topology from docker/README.md is repo-internal and correctly left out.

Read-only review — no commits pushed.
· docs-bridge/release-v6.6.3

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A well-researched docs catch-up whose flag defaults, error codes, and freeze-mode semantics I verified line-by-line against sei-chain PRs #4006/#4024/#4034/#4048 — but the "Route Header" section overstates the guarantee (router-generated errors and non-POST traffic carry no Sei-RPC-Route header), and the routing rules omit the sei_* legacy-method gap that source PR #4024 explicitly flags for release/v6.6. Both are small edits.

Findings: 2 blocking | 12 non-blocking | 8 posted inline

Blockers

  • node/technical-reference.mdx claims every HTTP response carries a Sei-RPC-Route header; verified against cmd/frozen-rpc-router/router.go on release/v6.6 this is false for router-generated errors and for non-POST traffic. See the inline comment on line 106.
  • 1 blocking issue(s) flagged inline on specific lines.

Non-blocking

  • Neither second-opinion pass produced output: codex-review.md and cursor-review.md are both empty. REVIEW_GUIDELINES.md is also empty, so this review applied AGENTS.md and STYLE_GUIDE.md instead.
  • Three runs of consecutive blank lines were introduced (before #### Freeze Mode, between the <Warning> and ### Frozen RPC Router, and between #### Route Header and ### seidb Tooling Commands). The file otherwise uses a single blank line between sections. There is no Prettier config in the repo so nothing will normalize these automatically.
  • The four new headings are Title Case (Freeze Mode, Frozen RPC Router, Routing Rules, Route Header). AGENTS.md asks for sentence case and the Sei.Headings Vale rule will annotate them, but the rest of technical-reference.mdx is Title Case throughout, so matching the file is defensible. Flagging only so the Vale annotations on the PR are not a surprise — prose-style.yml sets fail_on_error: false, so the build will not fail.
  • freeze-height is documented in the CLI section but not added to the Complete app.toml Configuration accordion under ### App.toml Parameters, so that reference block is now incomplete relative to the prose above it.
  • Consider linking the new node-types.mdx router mention to /node/technical-reference#frozen-rpc-router; STYLE_GUIDE.md favours descriptive cross-links over leaving the reader to search.
  • 7 suggestion(s)/nit(s) flagged inline on specific lines.

Inline comments (could not post inline; listed here)

  • node/technical-reference.mdx:106 (RIGHT) -- [blocker] "Every HTTP response carries a Sei-RPC-Route header" is not accurate. In cmd/frozen-rpc-router/router.go on release/v6.6:

  • writeRPCError only sets Content-Type and writes the body — so -32600 (batch too large), -32000 (range spanning intervals), parse errors, and invalid-request errors all come back without the header.

  • The oversized-body and unreadable-body paths use http.Error(...) directly (HTTP 413 / 400) — also no header.

  • Non-POST requests are handed to liveProxy, a plain httputil.NewSingleHostReverseProxy with no ModifyResponse. So GET traffic and WebSocket upgrades — which this page tells the reader are routed to the live node — return no header either.

Only proxy() (w.Header().Set(rpcRouteHeader, target.routeName())) and the mixed-batch path set it. The upstream cmd/frozen-rpc-router/README.md is careful about this: "Single-backend HTTP responses include Sei-RPC-Route: frozen:<height> or Sei-RPC-Route: live."

This matters because reading a route header per response is exactly how an operator would build monitoring on top of the router, and "every" invites treating a missing header as an anomaly rather than the normal error path. Suggested rewording:

Responses proxied to a single backend carry a Sei-RPC-Route header identifying which backend served them: frozen:<height> for a frozen node at that freeze height, or live for the live node. A batch split across multiple backends returns mixed. Errors generated by the router itself (oversized requests, malformed JSON, unsupported block ranges) and non-POST traffic forwarded to the live node do not carry the header.

  • node/technical-reference.mdx:99 (RIGHT) -- [suggestion] Worth a <Warning> here about the legacy sei_* surface. blockParameterIndexes in router.go covers only eth_* and debug_* methods, so block-scoped legacy methods — sei_getBlockByNumber, sei_getBlockReceipts, sei_getLogs and friends — miss the table entirely and fall through to the live node under the "methods without a block parameter" rule. At a pre-freeze height that returns not-found, with a Sei-RPC-Route: live header suggesting the routing was deliberate.

This is not speculation: source PR #4024 calls it out as a named caveat for the release owner, and notes the exposure is wider on release/v6.6 (33 legacy methods) than on main (3), which is the branch this v6.6.3 catch-up documents. Production impact requires widening enabled_legacy_sei_apis beyond the default three non-block-scoped helpers — but an operator who has done that is exactly the operator likely to deploy the router. One sentence saying "only eth_* and debug_* methods are height-routed; block-scoped sei_* legacy methods are forwarded to the live node" would close the gap.

  • node/node-types.mdx:27 (RIGHT) -- [suggestion] This adds a second 8545 bullet to a list keyed by port number, appended after 26660 rather than next to the existing 8545 entry on line 24 — so the list now has a duplicate key and is no longer grouped.

More substantively, "It shares the standard EVM JSON-RPC port convention with the live node" glosses over the operational consequence: the router's default listen address really is 127.0.0.1:8545 (confirmed in cmd/frozen-rpc-router/config.go), so running it on the same host as a live node is a direct bind conflict. The example over in technical-reference.mdx quietly works around this by putting the live node on 9545, but a reader of this page gets no warning.

Suggest folding it into the line 24 bullet and stating the collision plainly, e.g.: "8545: The default port for EVM HTTP RPC ... This is also the default listen address (127.0.0.1:8545) for the frozen-rpc-router binary, so when running the router on the same host as a live node, move one of them to a different port."

  • node/technical-reference.mdx:79 (RIGHT) -- [suggestion] go run ./cmd/frozen-rpc-router presumes the reader has the sei-chain repository checked out, has a Go toolchain installed, and is sitting in the repo root — none of which this page states, and none of which is a safe assumption for docs.sei.io node operators. STYLE_GUIDE.md asks that code blocks be directly copyable.

PR #4024 adds build and packaging for the router alongside seid, so there is likely a shipped binary to point at instead. Either reference that, or add the prerequisite lines the style guide models elsewhere:

git clone https://github.com/sei-protocol/sei-chain
cd sei-chain
go build ./cmd/frozen-rpc-router
  • node/technical-reference.mdx:62 (RIGHT) -- [suggestion] This snippet does not say where in app.toml the key belongs. freeze-height is a top-level base-config field (it sits alongside minimum-gas-prices, before any [section] header) — worth stating, since a reader who drops it under the last section they were editing gets silently different behaviour. A # app.toml (top level, before any [section]) comment would do it.
  • node/technical-reference.mdx:81 (RIGHT) -- [nit] The example puts the live node on 9545 rather than the standard 8545 without saying why — the reason is that the router itself is binding 8545 on line 80. One clause makes the example self-explanatory: --live-node localhost:9545 \ # live node moved off 8545, which the router now owns.
  • node/technical-reference.mdx:91 (RIGHT) -- [nit] 5MiB is missing the backticks and the space that the sibling bullets use for their defaults (16, 1000, 30s, 10s). Suggest (default `5 MiB`). The value itself is correct — defaultMaxRequestBodySize = int64(5 << 20).
  • node/technical-reference.mdx:108 (RIGHT) -- [nit] Three consecutive blank lines before ### seidb Tooling Commands; same pattern appears before #### Freeze Mode and before ### Frozen RPC Router. The rest of the file uses a single blank line between sections.

Verified against sei-chain release/v6.6 (v6.6.3) before changing:

- Route header: only single-backend proxied responses carry
  Sei-RPC-Route; router-generated errors and non-POST traffic do not
- Routing rules: only POST is inspected; WebSocket upgrades are passed
  to the live node's HTTP endpoint, which does not serve WS, so
  subscription clients must use 8546 directly
- Warn that block-scoped legacy sei_*/sei2_* methods are not
  height-routed (release/v6.6 still gates 33 of them)
- Build the router with `make build-frozen-rpc-router` instead of
  `go run`; example binds 127.0.0.1 and explains the 9545/9546 ports;
  warn that the router has no authentication
- Note freeze-height is a top-level app.toml key next to halt-height,
  link to the generated default app.toml, and add it to the accordion
- Add "as of v6.6.3" markers, code-format the 5 MiB default with its
  byte value, require positive freeze heights, move `earliest` to the
  right bullet, sentence-case headings, drop stray blank lines
- node-types: fold the duplicate 8545 bullet into the existing one and
  state the bind conflict with a live node on the same host

Co-authored-by: Cursor <cursoragent@cursor.com>

@seidroid seidroid Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well-structured, internally consistent docs addition for freeze mode and the frozen-rpc-router; cross-links, anchors, config-key placement, and repo style conventions all check out. No confirmed defects, but the page asserts many upstream-derived specifics (build target, error strings, JSON-RPC codes, flag defaults) that a human must verify against the four source sei-chain PRs before merging.

Findings: 0 blocking | 11 non-blocking | 6 posted inline

Blockers

  • None at the file/PR level.

Non-blocking

  • Both second-opinion passes produced no output: codex-review.md and cursor-review.md are empty (0 findings, not 0 issues). This review is therefore single-source — consider re-running those tools before merge.
  • REVIEW_GUIDELINES.md is empty on the base branch, so no repo-specific review standards were applied. I substituted the conventions in AGENTS.md (sentence-case headings, <Warning> callouts, lowercase code-formatted seid, no speculation about unreleased features) — the PR conforms to all of them.
  • I had no network access to sei-protocol/sei-chain, so these upstream-derived claims are unverified and should be checked against the source PRs: the ErrReadOnly / RPC writes are disabled in freeze mode and freeze height is not supported in <mode> mode error strings; JSON-RPC codes -32600 (batch too large) and -32000 (block ranges spanning multiple frozen-node intervals are not supported); the Sei-RPC-Route header name and its frozen:<height> / live / mixed values; and all flag defaults (5242880, 16, 1000, 30s, 10s).
  • freeze-height and halt-height are now documented as adjacent top-level app.toml keys, but their interaction is never stated — e.g. what happens when both are set to non-zero values, or whether a frozen node still honors halt-height. Worth one sentence in the freeze-mode section.
  • Verified as correct, no action needed: the /node/technical-reference#frozen-rpc-router and /node/node-operators#default-configurations anchors both resolve, node-operators.mdx:172 already contains freeze-height = 0 next to halt-height (so the "see the generated default app.toml" cross-link is live today, not pending a sync), and the security <Warning> about the router's lack of authentication is a good addition.
  • 6 suggestion(s)/nit(s) flagged inline on specific lines.

Inline comments (could not post inline; listed here)

  • node/technical-reference.mdx:78 (RIGHT) -- [suggestion] Please confirm the build-frozen-rpc-router make target and the ./build/frozen-rpc-router output path exist in the v6.6.3 tag. This PR's own reviewer notes for sei-protocol/sei-chain#4024 describe the router as "a standalone go run ./cmd/frozen-rpc-router command" — which contradicts these build instructions. Both can be true if #4024 also added the Makefile target, but if it did not, every reader fails on the very first step. I could not reach sei-chain to check.
  • node/technical-reference.mdx:44 (RIGHT) -- [suggestion] BroadcastTx* / BroadcastEvidence are CometBFT RPC methods (port 26657), but the section header just says "Query RPC remains available" without naming a surface. Since the whole point of a frozen node here is serving EVM JSON-RPC to the router, readers will want to know what eth_sendRawTransaction on 8545 does in freeze mode — rejected, or silently accepted into a mempool that never gossips? Worth stating the EVM write path explicitly alongside the CometBFT one.
  • node/technical-reference.mdx:68 (RIGHT) -- [suggestion] The rationale for multiple frozen nodes is missing, and it's the first thing an operator will wonder about. Since a freeze height is an exclusive upper boundary, the node frozen at 2000000 already holds every block below 1000000 too — so on its face the highest-frozen node alone could serve all history. One sentence on why you'd actually shard (state-store pruning, consensus-breaking upgrade boundaries, per-node disk limits) would make the two-node example in the code block motivated rather than arbitrary.
  • node/technical-reference.mdx:118 (RIGHT) -- [suggestion] This warning conflicts with evm/reference.mdx:1349, which states "The sei2_* namespace has been removed. Most legacy sei_* methods have also been removed, including block, filter, log, ... methods." This new text instead implies sei2_getBlockByNumber, sei_getLogs, etc. can still be enabled and forwarded. The allowlist in node/node-operators.mdx:455-488 backs this page (they're listed as commentable-in options), so the outlier looks pre-existing in evm/reference.mdx — but the two pages shouldn't contradict each other. Worth reconciling, or dropping sei2_* from this warning if it really is gone in v6.6.3.
  • node/technical-reference.mdx:101 (RIGHT) -- [nit] "Bare ip:port ... accepted" reads as excluding hostnames, but the example two blocks up uses 1000000=localhost:9546, and --live-node localhost:9545 is a hostname as well. Suggest "bare host:port" to match what the examples actually show.
  • node/node-types.mdx:24 (RIGHT) -- [nit] "move one of them to a different port" leaves the reader to pick. The technical-reference example resolves this a specific way — it keeps the router on 8545 and moves the nodes to 9545/9546. Mirroring that choice here (or just linking to the example) avoids operators picking the opposite convention and then finding the linked example doesn't match their setup.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Automated PR from sei-docs-bridge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant