Skip to content

fix(wallet): the bare-scheme retry does not rescue a warm wallet either — say so - #35

Merged
ehsan6sha merged 1 commit into
mainfrom
fix/wallet-warm-resume-honesty
Sep 4, 2026
Merged

fix(wallet): the bare-scheme retry does not rescue a warm wallet either — say so#35
ehsan6sha merged 1 commit into
mainfrom
fix/wallet-warm-resume-honesty

Conversation

@ehsan6sha

Copy link
Copy Markdown
Member

#33 shipped a guess, and the guess was wrong.

When the request-scoped link had already been tried and produced nothing, the next tap sent a bare metamask:// instead — on the theory that …/wc?requestId= was the part that wedged MetaMask: that it put the wallet into a route waiting for a request to arrive over its own Android-suspended socket, and that asking only for the app would sidestep it.

Tested on the reporter's phone: it does not. A warm MetaMask sits on its splash screen for the bare scheme exactly as it does for the request link. Both retries were made without force-quitting, and both hung; killing MetaMask and tapping again went through, as it always has. The wallet deadlocks on being resumed by a deep link at all, and there is no URL a web page can produce that avoids it.

What changes

What stays from #33

Both still correct, and untouched:

  • The interceptor no longer swallows our own app-switch — that was a real, deterministic bug affecting every universal-link wallet, and it had nothing to do with the splash hang.
  • Coming back to the page with the request unanswered shows the recovery hint at once, instead of waiting out a 12 s timer that ran while the user was inside the wallet. That is now more valuable, not less: it is how the user learns to force-quit without having to discover it.

Testing

npm test --workspaces 943 passing, npm run typecheck --workspaces and npm run lint clean. The test that pinned the bare-scheme retry now pins the request link, with the device result written into the comment so the next person does not re-derive the same dead end.

🤖 Generated with Claude Code

https://claude.ai/code/session_013BpqXrkEPA9odTyRdK5Mnx

…er -- say so

#33 shipped a guess. When the request-scoped link had already been tried and
produced nothing, the next tap sent a bare `metamask://` instead, on the theory
that `.../wc?requestId=` was the part that wedged MetaMask -- that it put the
wallet into a route waiting for a request to arrive over its own Android-suspended
socket, and that asking only for the app would sidestep it.

Tested on the reporter's phone: wrong. A warm MetaMask sits on its splash screen
for the bare scheme exactly as it does for the request link. Both retries were
made without force-quitting, and both hung; killing MetaMask and tapping again
went through, as before. The wallet deadlocks on being resumed by a deep link at
all, and there is no URL a web page can produce that avoids it.

So the link stops changing. Always the request-scoped one, which is the right
link for the case that does work -- a cold wallet, where it surfaces THIS prompt
rather than the home screen -- and one less moving part on the path that is the
user's only way through.

The hint goes back to leading with the force-quit, and now says outright that
tapping again without closing the wallet first will not help. #33 reordered it on
the assumption that the cheap step worked; it does not, and a hint that offers a
step that fails first is worse than no hint.

Kept from #33, both still correct: the interceptor no longer swallows our own
app-switch, and coming back to the page with the request unanswered shows the
recovery hint at once instead of waiting out a 12s timer that ran while the user
was inside the wallet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013BpqXrkEPA9odTyRdK5Mnx
@ehsan6sha
ehsan6sha merged commit 778392a into main Sep 4, 2026
2 checks passed
@ehsan6sha
ehsan6sha deleted the fix/wallet-warm-resume-honesty branch September 4, 2026 15:18
ehsan6sha added a commit to functionland/docs that referenced this pull request Sep 4, 2026
…178)

#177 reordered the stuck-wallet advice to lead with "tap Open wallet to approve
again", on the theory -- shipped alongside it in functionland/fxblox-web#33 --
that a second tap opened the wallet a different way and would usually get past
the splash screen.

Tested on a phone since: it does not. A warm MetaMask hangs on the retry exactly
as it hangs on the first attempt. Only closing MetaMask from recents and then
tapping clears it, which is what these pages said before #177 and what
functionland/fxblox-web#35 puts back in the app's own hint.

So the force-quit leads again, and each place now says plainly that tapping
without closing the wallet first returns you to the same stuck screen -- the
thing a user will otherwise try twice before giving up. Also says where the fault
is: inside the wallet app, where a web page cannot reach.

The "give the page a few seconds when you come back" guidance from #177 is
untouched -- that part was about our own reconnect and is still right.


Claude-Session: https://claude.ai/code/session_013BpqXrkEPA9odTyRdK5Mnx

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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