New members are signed in to their inbox right after registering, so the profile gate actually fires
Found by checking the live data: 59 positions registered in the 36h to 2026-09-16 and not one has a profile row, including #785 which registered 20 minutes after the gate deployed. The join flow redirects to /my/<newId> but the member arrives with no inbox session, so the gate never runs and the leader still cannot reach them. join-now.js now takes the one free personal_sign immediately after the registration confirms, while the wallet is still connected, which is the cheapest moment to ask. Best-effort: declining does not block the join, and they are asked again on their next sign-in. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -77,6 +77,22 @@ fetch('/api/public/config').then(function(r){return r.json()}).then(function(c){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var lastBal=null;
|
var lastBal=null;
|
||||||
|
// One free signature straight after the join, while the wallet is still connected:
|
||||||
|
// it opens their inbox session so the member-profile gate can ask for a username
|
||||||
|
// and email on the dashboard. Best-effort — if they decline, the join still stands
|
||||||
|
// and they are asked again the first time they sign in.
|
||||||
|
async function signInNewMember(newId){
|
||||||
|
try{
|
||||||
|
$('resultSub').innerHTML='Welcome to the team! One free signature sets up your member profile…';
|
||||||
|
var ch=await (await fetch('/api/public/msg-challenge',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({address:account})})).json();
|
||||||
|
if(!ch||!ch.message) return;
|
||||||
|
var hex='0x'; for(var i=0,b=new TextEncoder().encode(ch.message);i<b.length;i++) hex+=b[i].toString(16).padStart(2,'0');
|
||||||
|
var sig=await req('personal_sign',[hex,account]);
|
||||||
|
var v=await (await fetch('/api/public/msg-verify',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({address:account,signature:sig})})).json();
|
||||||
|
if(v&&v.ok) $('resultSub').innerHTML='Signed in. Taking you to your position page…';
|
||||||
|
else $('resultSub').innerHTML='Welcome to the team! Taking you to your position page…';
|
||||||
|
}catch(e){ try{ $('resultSub').innerHTML='Welcome to the team! Taking you to your position page…'; }catch(x){} }
|
||||||
|
}
|
||||||
async function refreshBalance(){ try{ var b=await req('eth_getBalance',[account,'latest']); lastBal=BigInt(b); $('bal').textContent=polStr(lastBal)+' POL'; updateFundBox(); }catch(e){} }
|
async function refreshBalance(){ try{ var b=await req('eth_getBalance',[account,'latest']); lastBal=BigInt(b); $('bal').textContent=polStr(lastBal)+' POL'; updateFundBox(); }catch(e){} }
|
||||||
|
|
||||||
// Card on-ramp: shown only when the connected wallet can't cover the entry.
|
// Card on-ramp: shown only when the connected wallet can't cover the entry.
|
||||||
@@ -174,6 +190,7 @@ fetch('/api/public/config').then(function(r){return r.json()}).then(function(c){
|
|||||||
log('🎉 Confirmed — your position is <strong>#'+newId+'</strong>. Redirecting to your dashboard…','ok');
|
log('🎉 Confirmed — your position is <strong>#'+newId+'</strong>. Redirecting to your dashboard…','ok');
|
||||||
try{ el_scroll('result'); }catch(e){}
|
try{ el_scroll('result'); }catch(e){}
|
||||||
try{sessionStorage.setItem('rmc.fresh','1');}catch(e){}
|
try{sessionStorage.setItem('rmc.fresh','1');}catch(e){}
|
||||||
|
signInNewMember(newId);
|
||||||
setTimeout(function(){ location.href='/my/'+newId; }, 4500);
|
setTimeout(function(){ location.href='/my/'+newId; }, 4500);
|
||||||
} else {
|
} else {
|
||||||
log('Confirmed on-chain. Open your dashboard at <a href="/my">/my</a> and enter your new ID (also shown on Polygonscan).','ok');
|
log('Confirmed on-chain. Open your dashboard at <a href="/my">/my</a> and enter your new ID (also shown on Polygonscan).','ok');
|
||||||
|
|||||||
Reference in New Issue
Block a user