Skip to content

chore(i18n): 画面に描かれていない smart account の error の文を消す (PR-28a) - #1094

Merged
cipherwebllc merged 1 commit into
mainfrom
chore/r10-pr28a-remove-unrendered-sa-error-messages
Nov 13, 2026
Merged

cipherwebllc merged 1 commit into
mainfrom
chore/r10-pr28a-remove-unrendered-sa-error-messages

Conversation

@cipherwebllc

Copy link
Copy Markdown
Owner

何をするか

第 10 回レビューの片づけ PR-28a (user 裁定 2026-11-12: 消す)。画面に描かれていない smart account の error の文を、messages から消す。

IncompatibleSmartAccountError (lib/accountDetection.ts) の i18nKey の 7 つの名前は、PaymentForm・TipForm・CheckoutForm の namespace に同じ名前の文を持っていた (3 namespace × 7 key = 21 個・ja と en で計 42 行)。3 フォームは i18nKey を 'errorPristineNoBootstrap' かどうかの判定にだけ使い、文は SmartAccountFallback の namespace から出す (components/SmartAccountFallbackBanner.tsx)。どの画面も、この 21 個を引いていない。

t(saError.i18nKey …) で描いていたのは c1a64ff で、021d847e (未対応 Smart Account の standard モード fallback) で banner に替わってから、描く所が無くなっていた (git log -S"t(saError.i18nKey" -- components)。

変わること / 変わらないこと

変わること

  • messages/ja.json と messages/en.json の PaymentForm・TipForm・CheckoutForm から、下の 7 key を 1 行ずつ消す (各 file 21 行)。
  • tests/lib/i18nKeys.test.ts の検査 2 つを 1 つに替える (下の「既存のテストを変えた所」)。
  • docs とコメントを今の姿に合わせる: docs/DEPLOY_CHECKLIST.md 9.6・docs/plans/tip-widget-parity-plan.md (追記 1 か所)・lib/accountDetection.ts (型の上に説明のコメント 3 行)・tests/lib/smartAccount/mav2.test.ts (コメント 2 か所)。

変わらないこと

  • 画面に出る文は 1 つも変わらない (消したのは引かれていない文だけ)。公開文言の追加・変更は無い。
  • コードの i18nKey の型 (IncompatibleSmartAccountI18nKey)・値・error の message・errorPristineNoBootstrap の判定は触っていない。lib/accountDetection.ts の差分はコメントだけ。
  • messages のほかの key・値・並び (下の「消し方の確かめ」)。
  • First Load JS (下の「bundle の実測」)。

消した key (ja の文つき)

3 namespace とも 7 key 全部を消した。en も同じ 21 個を消した。

PaymentForm

key ja の文 (消した)
errorIncompatibleSmartAccount お使いのウォレットは OpenPay 未対応の Smart Account 実装に委任されています (delegate: {address})。MetaMask の場合は「アカウント詳細 → Smart account」をオフにすると元の EOA に戻せます。または別のウォレット (Rabby / Frame 等) でお試しください。
errorMav2Disabled 現在 HashPort 等の一部ウォレット (Alchemy Modular Account v2) での決済は段階公開中です。少々お待ちください。
errorMav2KaiaPolygon Kaia チェーン上では Alchemy Modular Account v2 に委任されたウォレットでは決済できません。お手数ですが Polygon / Base / Arbitrum / Optimism 等の他チェーン版 QR をご利用いただくか、別のウォレットでお試しください。
errorMetaMaskKaia Kaia チェーン上では MetaMask Smart Account には現在対応していません (MetaMask は Kaia への delegator を未 deploy)。MetaMask の場合は「アカウント詳細 → Smart account」をオフにして元の EOA に戻すか、別のウォレットでお試しください。
errorPristineNoBootstrap このウォレットはまだガスレス決済の準備ができていません。通常決済 (ガス代自己負担) で今すぐ支払えます。
errorChainNo7702 このチェーンでは現在 USDC ガスレス決済に対応していません (このチェーンの EIP-7702 実装が標準と異なるため)。通常決済 (ガス代自己負担) で今すぐ支払えます。
errorMetaMaskGaslessUnavailable MetaMask Smart Account でのガスレス決済は現在ご利用いただけません (ウォレット側の互換性問題のため一時停止中)。通常決済 (ガス代自己負担) で今すぐ支払えます。

TipForm

key ja の文 (消した)
errorIncompatibleSmartAccount お使いのウォレットは OpenPay 未対応の Smart Account 実装に委任されています (delegate: {address})。MetaMask の場合は「アカウント詳細 → Smart account」をオフにすると元の EOA に戻せます。または別のウォレット (Rabby / Frame 等) でお試しください。
errorMav2Disabled 現在 HashPort 等の一部ウォレット (Alchemy Modular Account v2) でのチップ送信は段階公開中です。少々お待ちください。
errorMav2KaiaPolygon Kaia チェーン上では Alchemy Modular Account v2 に委任されたウォレットからチップを送れません。お手数ですが Polygon / Base / Arbitrum / Optimism 等の他チェーン版 Tip リンクをご利用いただくか、別のウォレットでお試しください。
errorMetaMaskKaia Kaia チェーン上では MetaMask Smart Account には現在対応していません。MetaMask の「アカウント詳細 → Smart account」をオフにするか、別のウォレットでお試しください。
errorPristineNoBootstrap このウォレットはまだガスレス決済の準備ができていません。チップにはガスレスモードが必要です。ガスレス対応済みのウォレットでお試しください。
errorChainNo7702 このチェーンでは現在 USDC ガスレスに対応していないため、チップを送れません (このチェーンの EIP-7702 実装が標準と異なるため)。Polygon / Base / Arbitrum / Optimism 等の他チェーンをご利用ください。
errorMetaMaskGaslessUnavailable MetaMask Smart Account でのガスレス決済は現在ご利用いただけません (ウォレット側の互換性問題のため一時停止中)。チップにはガスレスが必要なため、ガスレス対応済みの別ウォレットでお試しください。

CheckoutForm

key ja の文 (消した)
errorIncompatibleSmartAccount お使いのウォレットは OpenPay 未対応の Smart Account 実装に委任されています (delegate: {address})。MetaMask の場合は「アカウント詳細 → Smart account」をオフにすると元の EOA に戻せます。または別のウォレット (Rabby / Frame 等) でお試しください。
errorMav2Disabled 現在 HashPort 等の一部ウォレット (Alchemy Modular Account v2) での決済は段階公開中です。少々お待ちください。
errorMav2KaiaPolygon Kaia チェーン上では Alchemy Modular Account v2 に委任されたウォレットでチェックアウトできません。お手数ですが Polygon / Base / Arbitrum / Optimism 等の他チェーン版のチェックアウト URL をご利用いただくか、別のウォレットでお試しください。
errorMetaMaskKaia Kaia チェーン上では MetaMask Smart Account には現在対応していません。MetaMask の「アカウント詳細 → Smart account」をオフにするか、別のウォレットでお試しください。
errorPristineNoBootstrap このウォレットはまだガスレス決済の準備ができていません。通常決済 (ガス代自己負担) で今すぐ支払えます。
errorChainNo7702 このチェーンでは現在 USDC ガスレス決済に対応していません (このチェーンの EIP-7702 実装が標準と異なるため)。通常決済 (ガス代自己負担) で今すぐ支払えます。
errorMetaMaskGaslessUnavailable MetaMask Smart Account でのガスレス決済は現在ご利用いただけません (ウォレット側の互換性問題のため一時停止中)。通常決済 (ガス代自己負担) で今すぐ支払えます。

残した key

無い (候補の 21 個は全部、描かれていないと確かめて消した)。

7 つの名前は、ja/en とも この 3 namespace にしか無かった (入れ子も含めて全 namespace を歩いて数えた: ja 21・en 21。別の namespace に同名の key は無い)。画面が出す SmartAccountFallback の 8 key (bannerTitle・bannerBody・switchButton・tipOnlyTitle・tipOnlyBody・pristineTitle・pristineBannerBody・pristineTipBody) は触っていない。

描かれていないと確かめた方法

検索の範囲は components/ lib/ app/ hooks/ i18n/ tests/ e2e/ scripts/ (key の名前は docs/ packages/ public/ も)。出力は file に書いて全部読んだ (head で切っていない)。

検索 式 結果
key の名前の全出現 grep -rnE "errorMetaMaskKaia|errorMav2KaiaPolygon|errorIncompatibleSmartAccount|errorChainNo7702|errorPristineNoBootstrap|errorMav2Disabled|errorMetaMaskGaslessUnavailable" messages のほかは、(a) i18nKey: の値と型 (lib/accountDetection.ts・lib/smartAccount/metamask.ts・mav2.ts・hooks/useSmartAccount.ts)・(b) 3 フォームの saError.i18nKey === 'errorPristineNoBootstrap' (PaymentForm.tsx:1269・CheckoutForm.tsx:1921・TipForm.tsx:1048)・(c) コメント・(d) tests・docs。t('error…') の形は 0 件
i18nKey を読む所 grep -rnE "\.i18nKey|\bi18nKey\b\s*[,}]|\[['\"]i18nKey['\"]\]" components app hooks lib (HistoryToolbar・税区分の別の i18nKey を除く) 上の (b) の 3 行と、class の中 (message の組み立て・代入) の 2 行だけ。translator に渡す所は 0 件
3 namespace の translator を持つ file grep -rlE "(useTranslations|getTranslations)\(\s*['\"](PaymentForm|CheckoutForm|TipForm)['\"]" と、namespace を変数で受ける所 (useTranslations(namespace) = OnrampCta・config.namespace = EntitlementPaywall・opts.name.namespace = lib/routeMetadata.ts) 19 file + 3 file。EntitlementPaywall は 'Pro' | 'CsvPass'、routeMetadata の呼び出しは 3 namespace を渡さない。OnrampCta は literal の 3 key だけを引く
その file の中で literal でない key を引く所 grep -nE "\b(t|tp|tc|tu|…)(\.rich|\.has|\.raw|\.markup)?\(\s*[^'\"[:space:]]" 3 namespace の translator では、literal 同士の三項 (foreignSettlementTitle など)・t(relayErrorKey(…)) (戻り値の型は errorRelay… の 6 つだけ = lib/relay/relayErrorMessage.ts)・t(`storeDevice.previous.${…}`) と t(`storeDevice.error.${…}`) (入れ子の key) だけ。tc は CircleErrors・tu は UrlErrors・HistoryRow と PayerReceiptDetail の変数の key は History・PayerReceipt の translator
translator をよそへ渡す所 grep -nE "\bt=\{t\}|\bt:\s*t\b|[(,]\s*t\s*[,)]" phaseLabel(standard.phase, t)・checkoutPhaseLabel(standard.phase, t) の 2 つ。中は literal の btnStandard…・btnSending だけ
key を組み立てる形 template literal を translator に渡す全箇所 (\bt[A-Za-z]{0,12}(\.rich|\.has|\.raw|\.markup)?\(\s* + backtick) と、'error…' + の連結 3 namespace で error から始まる名前を組み立てる所は 0 件 (あるのは上の storeDevice.error. だけ)
t.has・t.raw・t.markup grep -rnE "\bt[A-Za-z]{0,12}\.(has|raw|markup)\(" t.raw('urlExample') の 1 件だけ
namespace.key の形・createTranslator・useMessages・getMessages それぞれ grep 3 namespace の 7 key に届く所は 0 件 (createTranslator は tests の別の namespace・getMessages は i18n/clientMessages.ts の namespace 単位の pick だけ)
文の断片 (ja/en) 7 つの文の特徴のある断片 16 個 (ja 9・en 7) を、上の範囲と docs packages public messages で grep messages の消す行と、SmartAccountFallback の別の文 (残す) だけ。tests・e2e が文を待っている所は 0 件
型が messages の key を指す仕組み grep -rnE "IntlMessages|AppConfig|declare module ['\"]next-intl|declare module ['\"]use-intl" 0 件 (next-intl の型の拡張は無い)。typecheck は通る

build の出力でも確かめた: 消した文の断片 (「段階公開中です」・rolled out gradually) は .next/static (client の JS) にも .next/server/app (prerender) にも無い。

消し方の確かめ

行を落とすだけの script で消し、HEAD (8c1a317) の JSON から 3 namespace × 7 key を消したものと、作業ツリーの JSON が JSON.stringify で一致することを確かめた (ほかの namespace・key・値・並びが同じ)。7 つの名前は、どの namespace にも (入れ子にも) 残っていない。

file 行 byte
messages/ja.json 21 行減 391,543 → 385,898 (5,645 減)
messages/en.json 21 行減 325,640 → 321,297 (4,343 減)

既存のテストを変えた所

tests/lib/i18nKeys.test.ts

  • 消した: i18n: smart account 互換性エラー (3 form 名前空間 × ja/en) (6 key × 3 namespace × ja/en が非空の文字列) と、i18n: errorMetaMaskKaia (3 form 名前空間 × ja/en) (3 namespace だけにあり、Kaia のほかのチェーンの名前を出さない)。どちらも、消した key が「ある」ことを名前で縛っていたので、そのままだと落ちる。
  • 足した: i18n: smart account 互換性 error の文は messages に無い (描くのは SmartAccountFallback)。7 つの名前の文が、ja/en のどの namespace にも無いことを縛る。
  • 替えた理由: 同じ file の「使われていないキーが無い」の検査は、leaf 名が本番のソースに 1 回でも出れば使用中とみなす。7 つの名前は i18nKey の値としてコードに残るので、文が戻ってもその検査は落ちない。未使用の検査の一覧・許可リスト (DYNAMIC_KEY_PATTERNS・UNUSED_PUBLIC_COPY_PENDING) に、この 7 key は載っていなかったので、そちらは触っていない。
  • 変異: 消した文を 1 つ (TipForm.errorMav2Disabled) ja/en に戻すと、足した検査の 2 件だけが落ちる (Tests 2 failed | 975 passed (977)・「使われていないキーが無い」は通ったまま)。戻して diff が空なことを確かめた。

tests/lib/smartAccount/mav2.test.ts はコメントだけ (「他 chain を案内する」という説明を今の姿に)。assert と test の名前は変えていない。

検証

検査 結果
./node_modules/.bin/tsc --noEmit exit 0
./node_modules/.bin/eslint (tests/lib/i18nKeys.test.ts・tests/lib/smartAccount/mav2.test.ts・lib/accountDetection.ts) exit 0 (出力なし)
関係するテスト 5 file Test Files 5 passed (5)・Tests 1077 passed (1077)・exit 0
full vitest (56e9d73・1 回) Test Files 926 passed (926)・Tests 25585 passed (25585)・exit 0
node scripts/check-bundle-budget.mjs --build (中で npm run build = next build・本番 flag のベクター) 変更前も後も exit 0・51 行とも [OK]

bundle の実測

変わらなかった。main 8c1a317 と この PR の head 56e9d73 を、同じ worktree で順に node scripts/check-bundle-budget.mjs --build で build し、.next/app-build-manifest.json の route ごとの JS を gzip (level 9) して足した。

route 変更前 gzip (byte) 変更後 gzip (byte) 差 raw (前 = 後) Route 表 / 予算
/[locale]/pay 408,663 408,663 0 1,282,034 409 kB / 409 kB
/[locale]/checkout 432,840 432,840 0 1,361,746 433 kB / 433 kB
/[locale]/[handle] 447,660 447,660 0 1,384,322 448 kB / 448 kB
/[locale]/tip/[address] 400,940 400,940 0 1,258,719 401 kB / 402 kB
  • chunk の数も raw の byte も、4 route とも同じ。file 名 (hash) が違う chunk は 4 つ (webpack の runtime・main-app・7156・9406) で、どれも raw の byte は同じ、gzip は −2・−1・+2・+1 で足すと 0。main-app と 7156 は Sentry の release に git の sha が入っているのを確かめた (globalThis.SENTRY_RELEASE={id:"56e9d73f…"})。webpack の runtime と 9406 の中身の差は、変更前の chunk が次の build で上書きされて残っていないので、比べていない。
  • messages が client の JS に入っていないことは、変更後の build で確かめた: PaymentForm と SmartAccountFallback の今ある文 (「ガス代見積の取得に失敗しました」など) は .next/static に 0 件で、.next/server (prerender の .rsc / .html) にある。messages は server の layout から NextIntlClientProvider に渡る (i18n/clientMessages.ts の namespace 単位の pick)。
  • 減るのは、ページの HTML / RSC に載る messages の分。JSON として ja は PaymentForm 1,821・TipForm 1,920・CheckoutForm 1,778 byte、en は 1,421・1,449・1,347 byte (圧縮前・HTML の大きさそのものは測っていない)。
  • 予算の数字は変えていない。/pay・/checkout・/[handle] は今も予算ちょうど (checkout は 433,000 まで あと 160 byte)。scripts/check-bundle-budget.mjs の注記の「Phase 3 の後に実測で下げ直す」は、この PR (文だけ) では下げる分が出ない。

確かめられなかったこと

  • 実機の画面は見ていない (描かれている文は変えていないので、スクショは撮っていない)。e2e は手元で流していない (CI が権威)。
  • ページの HTML の大きさの前後は測っていない (上の JSON の byte は計算)。
  • 変更前後で hash が違う 4 chunk のうち、webpack の runtime と 9406 の差の中身。

user に見てほしい点

  • docs/plans/tip-widget-parity-plan.md は決定済みの計画の記録だが、消した文を「UI fallback 済」の根拠に挙げていたので、追記を 1 つ入れた。記録は触らない方針なら、この 1 行は戻す。
  • tests/lib/i18nKeys.test.ts は「ある」の検査を消すだけでなく、「無い」の検査を 1 つ足した (理由は上)。

🤖 Generated with Claude Code

https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc

第 10 回レビューの片づけ (user 裁定 2026-11-12)。

IncompatibleSmartAccountError の i18nKey の 7 つの名前は、PaymentForm・TipForm・CheckoutForm の
namespace に同じ名前の文を持っていた (3 namespace × 7 key = 21 個・ja と en)。3 フォームは i18nKey を
errorPristineNoBootstrap かどうかの判定にだけ使い、文は SmartAccountFallback の namespace から出す
(components/SmartAccountFallbackBanner.tsx)。どの画面も、この 21 個を引いていない。

- messages/ja.json と en.json の 3 namespace から 7 key ずつ消す (各 21 行・ほかの行と並びは同じ)
- コードの i18nKey の型・値・判定は変えない (lib/accountDetection.ts は説明のコメントを足すだけ)
- tests/lib/i18nKeys.test.ts の「3 namespace にある」の検査 2 つを、「7 つの名前の文がどの namespace にも無い」
  の検査 1 つに替える (名前はコードに残るので、未使用の検査は文が戻っても落ちない)
- docs/DEPLOY_CHECKLIST.md 9.6 と docs/plans/tip-widget-parity-plan.md の、この文への参照を今の姿に合わせる

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc
@vercel

vercel Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated
openpay Ignored Ignored Preview Nov 13, 2026 3:16pm UTC

Request Review

@cipherwebllc
cipherwebllc merged commit 623e870 into main Nov 13, 2026
8 checks passed
@cipherwebllc
cipherwebllc deleted the chore/r10-pr28a-remove-unrendered-sa-error-messages branch November 13, 2026 16:35
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