Skip to content

Commit 4d39139

Browse files
author
CloudLobster
committed
fix: claim verification uses ownerOf + auto-upgrade if already bought
Issues: - Reverse resolution fails when primary name not set on-chain - User bought daaaaab.base.eth but banner said 'You don't own it' Fixes: - Claim flow now calls PUT /upgrade directly (which uses ownerOf) - If upgrade succeeds → redirect to dashboard (email upgraded!) - Buy flow: if name unavailable, auto-checks if USER owns it - If yes → auto-upgrades and redirects - If no → shows 'already taken by someone else'
1 parent 94cd13f commit 4d39139

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

web/src/pages/Dashboard.tsx

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2501,16 +2501,27 @@ function PendingActionBanner({
25012501
setChecking(true);
25022502
try {
25032503
if (action.type === 'claim') {
2504-
// Verify ownership (public endpoint)
2505-
const res = await fetch(`${API_BASE}/api/register/check/${auth.wallet}`);
2506-
const data = await res.json();
2507-
const resolvedName = data.basename?.replace('.base.eth', '').toLowerCase();
2508-
if (resolvedName === action.name.toLowerCase()) {
2504+
// Verify ownership via upgrade endpoint (checks ownerOf on-chain)
2505+
const upgradeRes = await apiFetch('/api/register/upgrade', auth.token, {
2506+
method: 'PUT',
2507+
body: JSON.stringify({ basename: `${action.name}.base.eth` }),
2508+
});
2509+
if (upgradeRes.ok) {
2510+
// Upgrade succeeded — ownership verified and email upgraded!
2511+
const data = await upgradeRes.json();
25092512
setOwnsName(true);
25102513
setChecking(false);
2514+
// Reload auth state
2515+
window.location.href = '/dashboard';
25112516
return;
25122517
}
2513-
setError(`Your wallet does not own ${action.name}.base.eth. You can buy it below.`);
2518+
const errData = await upgradeRes.json().catch(() => ({}));
2519+
// If "already has Basename handle" — user already upgraded
2520+
if (errData.error?.includes('already has')) {
2521+
window.location.href = '/dashboard';
2522+
return;
2523+
}
2524+
setError(errData.error || `Could not verify ownership of ${action.name}.base.eth.`);
25142525
}
25152526

25162527
// Get buy data from API (public endpoint, no auth needed)
@@ -2523,7 +2534,26 @@ function PendingActionBanner({
25232534
setStep('ready');
25242535
} else {
25252536
const err = await buyRes.json().catch(() => ({}));
2526-
setError(err.error || `${action.name}.base.eth is not available.`);
2537+
if (err.error?.includes('not available')) {
2538+
// Name was already bought — maybe by this user! Try claiming it.
2539+
const upgradeRes = await apiFetch('/api/register/upgrade', auth.token, {
2540+
method: 'PUT',
2541+
body: JSON.stringify({ basename: `${action.name}.base.eth` }),
2542+
});
2543+
if (upgradeRes.ok) {
2544+
// User owns it! Upgrade succeeded.
2545+
window.location.href = '/dashboard';
2546+
return;
2547+
}
2548+
const upgradeErr = await upgradeRes.json().catch(() => ({}));
2549+
if (upgradeErr.error?.includes('already has')) {
2550+
window.location.href = '/dashboard';
2551+
return;
2552+
}
2553+
setError(`${action.name}.base.eth is already taken. ${upgradeErr.error || 'Someone else owns it.'}`);
2554+
} else {
2555+
setError(err.error || `${action.name}.base.eth is not available.`);
2556+
}
25272557
}
25282558
} catch (e: any) {
25292559
setError(e.message || 'Failed to check availability');

0 commit comments

Comments
 (0)