encodedMessage.length !== message.length when fullUrl is a contains grapheme cluster that are UTF-8 encoded in more than 1 byte (e.g., emojis).
return new Response('The short URL is too long (maximum length is 80 characters).', { status: 400, headers: { 'Content-Type': 'text/plain; charset=UTF-8' } });
}
const message = `Sign this message to confirm you want to create https://alu.bz/${shortUrl} to redirect to ${fullUrl}.`; // Must match frontend exactly
- const personalMessage = `\x19Ethereum Signed Message:\n${message.length}${message}`; // ERC-191
+ const encodedMessage = new TextEncoder().encode(message);
+ const personalMessage = `\x19Ethereum Signed Message:\n${encodedMessage.length}${message}`; // ERC-191
const personalMessageHash = keccak256(new TextEncoder().encode(personalMessage));
const signatureObj = Signature.fromCompact(signature.substring(2, 130)).addRecoveryBit(signature.slice(-2) === '1b' ? 0 : 1);
const signingPublicKey = signatureObj.recoverPublicKey(personalMessageHash);