Message Signing
Last updated
Was this helpful?
Was this helpful?
import { connect, isConnected } from '@stacks/connect';
async function connectWallet() {
if (!isConnected()) {
const response = await connect();
console.log('Connected addresses:', response.addresses);
}
}import { request } from '@stacks/connect';
async function signMessage() {
const message = 'Hello World';
const response = await request('stx_signMessage', {
message,
});
console.log('Signature:', response.signature);
console.log('Public key:', response.publicKey);
return response;
}import { request } from '@stacks/connect';
import { Cl } from '@stacks/transactions';
async function signStructuredMessage() {
const message = Cl.tuple({
action: Cl.stringAscii('transfer'),
amount: Cl.uint(1000),
recipient: Cl.stringAscii('alice.btc')
});
const domain = Cl.tuple({
name: Cl.stringAscii('My App'),
version: Cl.stringAscii('1.0.0'),
'chain-id': Cl.uint(1) // 1 for mainnet
});
const response = await request('stx_signStructuredMessage', {
message,
domain
});
return response;
}import { verifyMessageSignatureRsv } from '@stacks/encryption';
async function verifySignature(
message: string,
signature: string,
publicKey: string
): Promise<boolean> {
const isValid = verifyMessageSignatureRsv({
message,
signature,
publicKey
});
if (isValid) {
console.log('✓ Signature verified successfully');
} else {
console.log('✗ Invalid signature');
}
return isValid;
}async function signAndVerify() {
// Request signature
const message = 'Authorize login at ' + new Date().toISOString();
const signResponse = await request('stx_signMessage', { message });
// Verify immediately
const isValid = await verifySignature(
message,
signResponse.signature,
signResponse.publicKey
);
if (isValid) {
// Proceed with authenticated action
console.log('Authentication successful');
}
}// Generate a unique challenge
function generateChallenge(): string {
const nonce = Math.random().toString(36).substring(7);
const timestamp = Date.now();
return `Sign this message to authenticate:\nNonce: ${nonce}\nTime: ${timestamp}`;
}
// Complete auth flow
async function authenticate() {
const challenge = generateChallenge();
try {
const response = await request('stx_signMessage', {
message: challenge
});
const isValid = verifyMessageSignatureRsv({
message: challenge,
signature: response.signature,
publicKey: response.publicKey
});
if (isValid) {
// Store auth token or session
localStorage.setItem('auth', JSON.stringify({
publicKey: response.publicKey,
timestamp: Date.now()
}));
return { success: true };
}
} catch (error) {
console.error('Authentication failed:', error);
}
return { success: false };
}