Skip to main content

Overview

This guide shows you how to sign messages with your Solana wallet. Message signing is commonly used for authentication, nonce verification, and data integrity checks on Solana.

Prerequisites

Basic Message Signing

import { authenticatedSvmClient } from './client';

const svmClient = await authenticatedSvmClient();

const signature = await svmClient.signMessage({
  message: 'Hello, World!',
  accountAddress: 'YourSolanaWalletAddress',
});

console.log('Message signed:', signature);

Simple Message Signing

Whether you need to provide externalServerKeyShares depends on how you created your wallet: If you created your wallet with backUpToClientShareService: true, you don’t need to provide external key shares:
// ✅ Simple signing - no externalServerKeyShares needed
const signature = await svmClient.signMessage({
  message: 'Hello, World!',
  accountAddress: 'YourSolanaWalletAddress',
});

console.log('Message signed:', signature);

With Manual Backup

If you created your wallet with backUpToClientShareService: false, you must provide external key shares:
// First, retrieve your stored key shares
const keyShares = await retrieveStoredKeyShares('YourSolanaWalletAddress');

// ❌ Must provide externalServerKeyShares
const signature = await svmClient.signMessage({
  message: 'Hello, World!',
  accountAddress: 'YourSolanaWalletAddress',
  externalServerKeyShares: keyShares, // Required for manual backup!
  password: 'your-password', // Only if wallet was created with password
});

console.log('Message signed:', signature);
Password Handling Notes:
  • If your wallet was created without a password, omit the password parameter
  • If your wallet was created with a password, you must provide it for all operations
  • The password parameter is always optional in the API, but required if the wallet is password-protected

Common Use Cases

Authentication

const nonce = Date.now().toString();
const message = `Sign this message to authenticate: ${nonce}`;
const signature = await svmClient.signMessage({
  message,
  accountAddress: 'YourSolanaWalletAddress',
});

Data Integrity

const data = { userId: 123, action: 'transfer', amount: '100' };
const message = JSON.stringify(data);
const signature = await svmClient.signMessage({
  message,
  accountAddress: 'YourSolanaWalletAddress',
});

Next Steps

I