Skip to content

feat(frontend): ENS サブネームを Namestone から Namespace へ移行 - #564

Merged
yu23ki14 merged 1 commit into
mainfrom
issue/555
Aug 19, 2026
Merged

feat(frontend): ENS サブネームを Namestone から Namespace へ移行#564
yu23ki14 merged 1 commit into
mainfrom
issue/555

Conversation

@yu23ki14

Copy link
Copy Markdown
Member

Refs #555, #557, #527

背景 — 移行ではなく作り直しになりました

調査の結果、NameStone は 2026-08-03 に営業を停止済みでした。

確認項目 結果
サービス状態 2026-08-03 停止(namestone.com トップに掲示)
REST API namestone.xyz/api/public_v1/* 応答なし(40 秒でタイムアウト。存在しないパスは即 404 なのでバックエンドが死んでいる)
CCIP-read ゲートウェイ gateway.namestone.com HTTP 503
toban.eth の resolver(mainnet) 0xA87361C4E58B619c390f469B9E6F27d759715125 = NameStone の resolver のまま
toban.eth owner 0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401(ENS NameWrapper)
バックアップ リポジトリ・Pinata・identity D1 のいずれにも無し

既存の *.toban.eth レコード(name / address / avatar / description)は復旧できません。 #556(データ退避・投入・突合)は成立しないのでクローズ相当です。

副作用: 本番アプリも 8/3 から壊れていた

/api/namestone/* はタイムアウトせずハングするため、

という詰み方をしていました。

そのため #557 の Phase 3(二重書き込み)/Phase 5(段階的な読み込み切替・ロールバックフラグ)はすべて不要になり、Namespace への単純な置き換えとしています。失われた名前はユーザーに再登録してもらう方針です。

変更内容

Provider 抽象化 app/.server/ens/NameProviderNamespaceProvider.server/ は React Router の Vite プラグインが強制するため、API キーがクライアントバンドルに混入しない
HTTP 入口 /api/namestone/*/api/ens/*
NameData / TextRecordstypes/ens へ。形は従来どおりなので消費側 約30 ファイルは import 元の変更のみ
SDK バグ回避 書き込みは createSubname のみ(updateSubname 等は owner を落とす)。getSingleSubname は型に反して 404 で throw するので provider 側で吸収
既存バグ修正 409 が 500 に化ける件(try 内の throw data()NameApiError 経由に)/自分の名前を再登録すると 409 になる件
ハング対策 SDK に 8 秒のタイムアウト。上流が死んでも関数が張り付かない
#527 名前解決に失敗・タイムアウトした場合は /signup ではなく /workspace へ。解決できなかっただけの既存ユーザーにとって /signup は行き止まりになる
環境変数 VITE_NAMESTONE_API_KEY を廃止 → サーバー専用の NAMESPACE_API_KEY / NAMESPACE_MODE / ENS_PARENT_NAME / NAMESPACE_TIMEOUT_MS
テスト frontend に Vitest を導入。provider と API ルートの契約テスト 19 件

検証済み

  • pnpm frontend test — 19 passed
  • pnpm frontend typecheck — pass
  • pnpm frontend build — pass
  • npx biome check . — pass
  • ビルド成果物を grep して、Namespace SDK / API キーが build/client/ に含まれないことを確認

未検証(API キー待ち)

  • Namespace への実疎通(Sepolia ステージング staging.offchain-manager.namespace.ninja
  • foo.split.toban.eth 形式(ドット入りラベル)が通るか。 OpenAPI にドット禁止の記述は無く SDK もバリデーションしていないが docs に "nested" の記述は 0 件で動作保証がない。provider は dto.label ではなく fullName から label を導出するので、API 側で再パースされても名前は壊れない作りにしてある

マージ後に必要な作業

  1. Namespace で API キーを発行https://app.namespace.ninja/toban.eth owner ウォレットで)→ Vercel に VITE_ 無しで登録。未設定だと /api/ens/* は 503 を返す
  2. toban.eth の resolver を Hybrid Resolver へ差し替え[ens] toban.eth の resolver を Namespace Hybrid Resolver へ差し替え #558)。投入完了待ちというブロッカーは消滅した(今の resolver は死んでいるので失うものが無い)。旧アドレス 0xA87361C4E58B619c390f469B9E6F27d759715125 はロールバック用に記録済み
  3. Namespace の発行上限(初期 2,000 件)の確認

🤖 Generated with Claude Code

NameStone は 2026-08-03 に営業を停止し、REST API も CCIP-read ゲートウェイ
(gateway.namestone.com) も応答しない。toban.eth の resolver は NameStone のもの
(0xA87361C4E58B619c390f469B9E6F27d759715125) のままなので、既存の *.toban.eth は
オンチェーンからもアプリからも解決できず、レコードの退避手段も残っていない。

副作用としてアプリ側も 8/3 から壊れていた。/api/namestone/* がタイムアウトせず
ハングするため、名前・アバターの表示が止まり、login.tsx の 5 秒フォールバックが
既存ユーザーを全員 /signup へ送り、その /signup も set-name が死んでいて完了できない。

そのため二重書き込みや段階的な読み込み切替は行わず、Namespace
(@thenamespace/offchain-manager) への単純な置き換えとする。既存の名前は復旧不能なので、
ユーザーには再登録してもらう。

- app/.server/ens/ に NameProvider インタフェースと NamespaceProvider を追加。
  .server/ なので API キーがクライアントバンドルへ漏れない
- HTTP 入口を /api/namestone/* から /api/ens/* へ移動
- NameData / TextRecords を types/ens に定義。形は従来どおりなので消費側 約30 ファイルは
  import 元の変更のみ
- SDK の実装バグを回避: 書き込みは createSubname のみ(updateSubname 等は owner を
  落とす)、getSingleSubname は 404 で throw するため provider 側で吸収
- 409 が 500 に化けるバグを修正(try 内の throw data() をやめ NameApiError 経由に)
- 自分の名前を再登録すると 409 になるバグを修正
- 上流無応答でハングしないよう SDK にタイムアウト(既定 8s)を設定
- #527: 名前解決に失敗・タイムアウトしたときは /signup ではなく /workspace へ。
  解決できなかっただけの既存ユーザーにとって /signup は行き止まりになる
- VITE_NAMESTONE_API_KEY を廃し、サーバー専用の NAMESPACE_API_KEY / NAMESPACE_MODE /
  ENS_PARENT_NAME / NAMESPACE_TIMEOUT_MS へ。dev では vite.config.ts が .env から
  process.env へ橋渡しする
- frontend に Vitest を追加し、provider と API ルートの契約テストを 19 件用意

Refs #555, #557, #527. Closes は API キー投入と疎通確認の後。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
toban Ready Ready Preview Aug 19, 2026 4:32pm

Request Review

@yu23ki14

Copy link
Copy Markdown
Member Author

疎通確認完了 — 未検証項目はすべて解消しました

本番 toban.eth テナントに対して API キーで実測しました。検証用レコードは全削除済み(最終状態 totalItems = 0)。

1. API キー / エンドポイント

結果
mainnet(offchain-manager.namespace.ninja ✅ 疎通。現在のサブネーム数 0 件(Namestone のデータは当然移っていない)
sepolia staging(staging.offchain-manager.namespace.ninja ❌ 書き込みが 401 Unauthorized。キーは mainnet の dev portal 発行で toban.eth も mainnet 名のため、staging は別テナント扱い

staging が使えないため、以降の検証はすべて mainnet の空テナントに対して実施し、都度削除しました。

2. foo.split.toban.eth(ドット入りラベル)→ 問題なし

親イシューから残っていた唯一の未確定事項です。label: "zzz-toban-probe.split" で作成し、読み戻した結果:

fullName=zzz-toban-probe.split.toban.eth
label=zzz-toban-probe.split
parentName=toban.eth

API 側で再パース(label: "foo" / parentName: "split.toban.eth" への分割)は起きません。 作成・読み出し・owner 検索・削除すべて成功。$treeId_.splits.new.tsx${splitterName}.split はそのままで動きます。フラット化(案A)も別親名(案B)も不要です。

なお provider は dto.label ではなく fullName から label を導出しているので、仮に将来 API の挙動が変わっても名前は壊れません。

3. アプリ経由の E2E(pnpm frontend dev/api/ens/*

# 検証 結果
1 set-name 新規登録 ✅ 200
2 resolve-names(アドレス→名前) NameData 互換シェイプで返却
3 resolve-addresses(exact_match) ✅ 200
4 同一アドレスによる自分の名前の再登録 ✅ 200(旧実装の 409 バグが直っていることを確認)
5 別アドレスからの同名登録 409(500 に化けない)
6 update-name による改名 ✅ 200
7 旧名の自動削除 ✅ 旧名は [[]]、新名のみ残存
8 description: "" でのレコード削除 text_records が空に
9 .split 形式の set-name ✅ 200・name=zzz-e2e.split で解決
10 未知の operation ✅ 404

avatar: "" が送られたケースでレコードが作られないことも確認しました(空文字はレコード削除として扱う仕様どおり)。

サーバー専用の環境変数(VITE_ 無し)が vite.config.ts の橋渡しで dev サーバーに渡ることも、この E2E で併せて確認できています。

残る作業

コード側はこれでマージ可能です。残りは #558toban.eth の resolver を Namespace Hybrid Resolver へ差し替え(owner は NameWrapper 経由)のみ。旧 resolver 0xA87361C4E58B619c390f469B9E6F27d759715125 はロールバック用に記録済みです。

@yu23ki14
yu23ki14 merged commit cb342fc into main Aug 19, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant