docs: retire IBC and tokenfactory usage guidance - #66
Conversation
Route legacy URLs to status notices and narrow examples to supported native SEI and EVM workflows, while preserving deprecation context for existing users. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
There was a problem hiding this comment.
A well-executed documentation retirement: the anchors, redirects, and cross-references all check out, docs.json is valid, and no dangling references to removed helpers remain. No blocking issues, but several deletions reach past the stated IBC/tokenfactory scope (Bank precompile metadata queries, the IBC node-metrics reference, a generic registry helper), the Vale heading-exception removal will flag still-valid headings, and the committed llms-full.txt still ships the retired guidance.
Findings: 0 blocking | 17 non-blocking | 11 posted inline
Blockers
- None at the file/PR level.
Non-blocking
REVIEW_GUIDELINES.mdis empty, so there were no repo-specific review standards to apply; I reviewed againstAGENTS.mdandSTYLE_GUIDE.mdinstead.- The OpenAI Codex second-opinion pass produced no output (
codex-review.mdis empty) — no findings merged from it. - The Cursor second-opinion pass produced no output (
cursor-review.mdis empty) — no findings merged from it. - Stale generated artifacts.
llms-full.txtat the repo root still contains the retired content this PR removes: 5tokenfactorymentions and 15all_balances/getNativePointeroccurrences. Sincescripts/generate-llms.mjsfetches each page's.mdfrom the deployed site, it can't be regenerated in this PR — but perAGENTS.md:51("trigger it manually viaworkflow_dispatchafter large content updates"), theregenerate-llms.ymlworkflow should be dispatched once this deploys. Otherwise the newTokenfactory unsupportedguidance block added to the generator has no effect on what LLM consumers actually read. - Deletion vs. deprecation is applied inconsistently across the PR. Most pages keep the surface documented and add a
<Warning>/<Danger>banner narrowing its scope — which is the right call, and matches the PR's own statement that "legacy module and RPC surfaces may still exist for compatibility." But three places delete reference material outright instead: the Bank precompile's metadata/multi-balance queries, the IBC OpenTelemetry metrics tables innode/advanced-config-monitoring.mdx, and thefindByDenomregistry helper. None of those three are IBC- or tokenfactory-specific. Consider applying the banner treatment uniformly so the docs stay a complete reference to what the chain actually exposes. - Vale prose linting will now flag valid headings. Dropping
IBCfrom theHeadings.ymlexceptions makes the sentence-case rule fire on three headings that survive this PR inlearn/sip-03-migration.mdx:## Affected IBC assets(line 84),### Can I still bridge assets into or out of Sei over IBC?(line 256), and### I hold an IBC asset on Sei — is it gone?(line 260). Impact is limited becauseprose-style.ymlsetsfail_on_error: falseandfilter_mode: added, so CI won't break and the annotations only appear if those lines are later touched — but it's avoidable noise. See the inline comment. - 11 suggestion(s)/nit(s) flagged inline on specific lines.
| - CLI | ||
| - SDK | ||
| - NFT | ||
| - IBC |
There was a problem hiding this comment.
[suggestion] Consider keeping this exception. IBC is still a proper acronym in prose this PR deliberately retains, and removing it makes the sentence-case rule flag three headings that survive the change — learn/sip-03-migration.mdx:84 (## Affected IBC assets), :256, and :260. ## IBC is disabled escapes because $sentence allows a capitalized first word, but the mid-heading uses won't.
CI won't break (prose-style.yml uses fail_on_error: false and filter_mode: added), so this is advisory — but the exception list exists for exactly this case, and IBC hasn't stopped being an acronym just because the feature is disabled.
| /// Sends the attached native SEI to a native Sei address. | ||
| function sendNative( | ||
| string memory toNativeAddress | ||
| ) external payable returns (bool success); |
There was a problem hiding this comment.
[suggestion] This trims the documented interface further than the PR's stated scope. all_balances, name, symbol, decimals, and supply are not IBC- or tokenfactory-specific — they still exist on the precompile at 0x…1001 and are legitimate native-SEI queries. supply("usei") (total SEI supply) and decimals("usei") in particular are common, EVM-only-safe reads with no Cosmos-side equivalent reachable from Solidity.
Same concern for send(): it was the documented mechanism the registered ERC-20 native pointer uses, and with getNativePointer also removed from pointer-contracts.mdx, nothing in the docs now explains how native SEI moves through its ERC-20 pointer.
Suggest keeping these documented but scoped to usei (consistent with the <Warning> at line 10) rather than deleting them — the page currently under-describes the precompile's real surface, which pushes readers to the sei-chain source to find out what exists.
|
|
||
| # Install Sei EVM bindings for precompile addresses and ABIs | ||
| npm install @sei-js/precompiles@2.1.2 | ||
| npm install ethers @sei-js/precompiles |
There was a problem hiding this comment.
[nit] The version pin was dropped here. Every other precompile page pins it — staking.mdx:471, governance.mdx:126, addr.mdx:112, and the sibling cosmwasm.mdx:109 all use @sei-js/precompiles@2.1.2, and json.mdx uses @^2.1.2. Suggest npm install ethers @sei-js/precompiles@2.1.2 for consistency.
|
|
||
| </Tab> | ||
| <Tab title="Solidity"> | ||
| You can make the same query from Solidity: |
There was a problem hiding this comment.
[nit] The TypeScript and Solidity samples for the same operation are now consecutive bare code fences. AGENTS.md:33 asks for <Tabs>/<Tab> for parallel code samples, and the version this replaces did use them (<Tab title="JavaScript"> / <Tab title="Solidity">). Same applies to the pair under ## Send native SEI to a native address at line 96.
| /// @param contractAddress The Sei address of the contract to execute. | ||
| /// @param msg The msg to send for execution. The format is specified by the contract code. | ||
| /// @param coins Any non-sei denominations that the contract requires for execution. | ||
| /// @param coins A JSON-encoded coin list required by the legacy ABI. |
There was a problem hiding this comment.
[suggestion] "required by the legacy ABI" is both vague and slightly inaccurate as parameter documentation — coins is a parameter of the current precompile ABI, not a legacy artifact, and this phrasing tells a reader nothing about the expected shape.
Suggest keeping it factual and putting the policy in the surrounding <Danger> block (where you've already added it at line 14), e.g.: /// @param coins JSON-encoded array of Bank Module coins ([{"denom":"...","amount":"..."}]). Pass [] — see the note above.
| COUNTER_CONTRACT_ADDRESS, | ||
| toUtf8Bytes(JSON.stringify(executeMsg)), | ||
| toUtf8Bytes(JSON.stringify([{ denom: 'uusdc', amount: '100' }])), // Also send 100 uusdc | ||
| toUtf8Bytes(JSON.stringify([])), // No Bank Module funds attached |
There was a problem hiding this comment.
[suggestion] This comment is misleading in context: the section is "Executing a payable function" and overrides five lines up attaches ethers.parseEther('3.2'), so funds are being sent — and SEI is itself a Bank Module asset. A reader could reasonably conclude the donate call transfers nothing.
Suggest: // No additional coins — the 3.2 SEI is attached via msg.value.
| import { TOKEN_LIST } from '@sei-js/registry'; | ||
|
|
||
| // All tokens on mainnet | ||
| // Registry metadata on mainnet |
There was a problem hiding this comment.
[nit] Two nits in this hunk:
// Registry metadata on mainnetis less accurate than the// All tokens on mainnetit replaces —TOKEN_LIST['pacific-1']really is the full token list, and the new<Warning>above already handles the "presence ≠ supported" caveat.- The
findByDenomhelper removed just below is a generic lookup bybasedenom that works for native SEI and has nothing to do with tokenfactory. Since the<Warning>already tells readers not to treat legacy entries as integration targets, deleting the lookup pattern seems like collateral damage rather than intended scope.
| Sei runs two token execution environments side by side — EVM and CosmWasm. Pointer contracts are automatically deployed EVM contracts that proxy a CosmWasm token, and vice versa. | ||
|
|
||
| <Warning> | ||
| This guide covers pointers for already-deployed CosmWasm contracts only. It does not document native-denom pointer workflows. IBC is disabled in both directions, and tokenfactory is not a supported development path. See [IBC is disabled](/learn/sip-03-migration#ibc-is-disabled) and [Tokenfactory is not supported](/cosmos-sdk#tokenfactory-is-not-supported). |
There was a problem hiding this comment.
[suggestion] The banner text and the code changes don't quite line up. The warning says "Do not use native-denom pointers to build IBC or tokenfactory integrations" — a scoped prohibition — but the diff removes native-denom pointer lookup entirely, including the usei case, which isn't an IBC or tokenfactory denom.
This also drops the only documented use of getNativePointer in the repo, and it contradicts what learn/pointers.mdx said before this PR ("Native (Bank Module) pointers continue to work normally"). If native pointers for native SEI still function, consider keeping the row and the getNativePointer('usei') example and letting the banner do the narrowing — matching the approach taken on registry.mdx and cosmwasm.mdx.
|
|
||
| </Danger> | ||
|
|
||
| ## Tokenfactory is not supported |
There was a problem hiding this comment.
[suggestion] Worth reconsidering where this canonical notice lives. Six pages plus scripts/generate-llms.mjs, skill.md, and three docs.json redirects now all point at /cosmos-sdk#tokenfactory-is-not-supported, while the parallel IBC notice they cite in the same breath lives at /learn/sip-03-migration#ibc-is-disabled. Splitting the two deprecation policies across two pages hurts discoverability.
There's also a practical wrinkle: cosmos-sdk/** is excluded from prose linting (.vale.ini) and from spell-checking (_typos.toml), so this heavily-referenced policy text gets no CI coverage. Putting it in learn/sip-03-migration alongside ## IBC is disabled would fix both. The anchor itself resolves correctly, so this is a placement suggestion, not a defect.
| - The per-cache series that were previously separate metric names (for example `chunk_read_cache_*` and `chunk_write_cache_*`) are now the shared `litt_chunk_cache_*` metrics distinguished by the `cache` attribute. | ||
| - The `MetricsNamespace` and `MetricsRegistry` config fields no longer exist. Metric names are fixed, and metrics are always backed by the global OTel provider; supply the scrape port via `MetricsPort`. | ||
|
|
||
| ## IBC OpenTelemetry Metrics |
There was a problem hiding this comment.
[suggestion] This is node-operator observability reference material, not usage guidance — it documents metrics the binary emits, and the IBC modules are disabled by parameter, not removed from the build. Operators upgrading or building dashboards may still encounter these ibc_* series, and the PR itself states elsewhere that "legacy module and RPC surfaces may still exist for compatibility."
Everywhere else this PR keeps the reference and adds a banner; here it deletes ~56 lines with no replacement, so an operator seeing ibc_transfer_send in Prometheus now has nowhere in the docs to look it up. Suggest a short deprecation note above the tables ("these meters remain registered but stay at zero — IBC is disabled per Proposals 116/120/121") instead of removal.
The deletion itself is clean — no dangling intro text, and no page or docs.json entry links to #ibc-opentelemetry-metrics.
Summary
Test plan
docs.jsonwithpython3 -m json.toolscripts/generate-llms.mjswithnode --checkgit diff --checkmint broken-links(the Mintlify CLI does not support the local Node 26 runtime)Made with Cursor