SIWE-format (EIP-4361) sign-in challenge with EIP-55 checksummed address so wallets show their friendly Sign-in UI instead of a raw-signature warning

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-08-19 15:44:07 -05:00
parent 0754a858c3
commit 02290f1200
+11 -1
View File
@@ -57,10 +57,20 @@ function recoverAddress(msg, signature) {
// ---- auth ----
const ADDR_RE = /^0x[0-9a-fA-F]{40}$/;
// EIP-55 checksum (needed for the SIWE message format; wallets render
// EIP-4361-formatted requests with their friendly "Sign-in" UI instead of a
// raw-signature warning — matters for member trust in MetaMask)
function checksumAddress(address) {
const a = address.toLowerCase().replace(/^0x/, '');
const h = keccak256(a);
let out = '0x';
for (let i = 0; i < a.length; i++) out += parseInt(h[i], 16) >= 8 ? a[i].toUpperCase() : a[i];
return out;
}
function makeChallenge(address) {
const a = address.toLowerCase();
const nonce = crypto.randomBytes(16).toString('hex');
const message = `RM Circle member sign-in\n\nWallet: ${a}\nNonce: ${nonce}\n\nSigning is free, proves you own this wallet to rmcircle.team, and cannot move funds or approve anything.`;
const message = `rmcircle.team wants you to sign in with your Ethereum account:\n${checksumAddress(a)}\n\nRM Circle member sign-in for on-site messaging. This signature is free and cannot move funds or approve anything.\n\nURI: https://rmcircle.team\nVersion: 1\nChain ID: 137\nNonce: ${nonce}\nIssued At: ${new Date().toISOString()}`;
challenges.set(a, { message, exp: Date.now() + CHALLENGE_TTL });
return message;
}