Hana Wallet implements the Wallet Standard for Solana blockchain interactions. This allows your dApp to seamlessly connect with Hana Wallet and utilize its features for signing transactions and messages.
Features
Hana Wallet's Solana provider supports:
Connecting to wallet accounts
Disconnecting from wallet accounts
Signing transactions (legacy and v0)
Signing messages
Listening for account change events
Integration
Detecting Hana Wallet
const wallets = window.navigator.wallets; const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
Connecting to Hana Wallet
async function connectToHanaWallet() {
try {
const wallets = window.navigator.wallets;
const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
if (!hanaWallet) {
console.error('Hana Wallet not found');
return;
}
const connectFeature = hanaWallet.features['standard:connect'];
const { accounts } = await connectFeature.connect();
console.log('Connected accounts:', accounts);
return accounts;
} catch (error) {
console.error('Failed to connect to Hana Wallet:', error);
throw error;
}
}
Signing Transactions
async function signTransaction(account, transaction) {
try {
const wallets = window.navigator.wallets;
const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
const signFeature = hanaWallet.features['solana:signTransaction'];
const signedTransactions = await signFeature.signTransaction({
account,
transaction
});
return signedTransactions[0].signedTransaction;
} catch (error) {
console.error('Failed to sign transaction:', error);
throw error;
}
}
Signing Messages
async function signMessage(account, message) {
try {
const wallets = window.navigator.wallets;
const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
const signFeature = hanaWallet.features['solana:signMessage'];
const signedMessages = await signFeature.signMessage({
account,
message
});
return {
signature: signedMessages[0].signature,
signedMessage: signedMessages[0].signedMessage
};
} catch (error) {
console.error('Failed to sign message:', error);
throw error;
}
}
Listening for Account Changes
function listenForAccountChanges(callback) {
const wallets = window.navigator.wallets;
const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
const eventsFeature = hanaWallet.features['standard:events'];
const removeListener = eventsFeature.on('change', (event) => {
if (event.accounts) {
callback(event.accounts);
}
});
return removeListener;
}
Disconnecting from Hana Wallet
async function disconnectFromHanaWallet() {
try {
const wallets = window.navigator.wallets;
const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
const disconnectFeature = hanaWallet.features['standard:disconnect'];
await disconnectFeature.disconnect();
console.log('Disconnected from Hana Wallet');
} catch (error) {
console.error('Failed to disconnect from Hana Wallet:', error);
throw error;
}
}
Supported Transaction Versions
Hana Wallet supports:
Legacy transactions
Version 0 transactions
Check supportedTransactionVersions
inside the solana:signTransaction
feature.
Chains
Hana Wallet currently supports:
Solana Mainnet (
solana:mainnet
)
Complete Example
async function initializeHanaWallet() {
try {
const wallets = window.navigator.wallets;
const hanaWallet = wallets.find(wallet => wallet.name === 'Hana Wallet');
if (!hanaWallet) {
throw new Error('Hana Wallet not found. Please install Hana Wallet extension.');
}
const connectFeature = hanaWallet.features['standard:connect'];
const { accounts } = await connectFeature.connect();
if (accounts.length === 0) {
throw new Error('No accounts found in Hana Wallet');
}
console.log('Connected to Hana Wallet:', accounts[0].address);
const eventsFeature = hanaWallet.features['standard:events'];
const removeListener = eventsFeature.on('change', (event) => {
console.log('Wallet accounts changed:', event.accounts);
});
return {
wallet: hanaWallet,
account: accounts[0],
removeListener
};
} catch (error) {
console.error('Failed to initialize Hana Wallet:', error);
throw error;
}
}
async function runExample() {
let walletConnection;
try {
walletConnection = await initializeHanaWallet();
const { wallet, account } = walletConnection;
const transaction = {
toString: () => 'serialized-transaction-data'
};
const signFeature = wallet.features['solana:signTransaction'];
const signedTransactions = await signFeature.signTransaction({
account,
transaction
});
console.log('Transaction signed:', signedTransactions[0].signedTransaction);
const message = new TextEncoder().encode('Hello from my dApp!');
const messageSignFeature = wallet.features['solana:signMessage'];
const signedMessages = await messageSignFeature.signMessage({
account,
message
});
console.log('Message signed:', signedMessages[0].signature);
} catch (error) {
console.error('Error in example:', error);
} finally {
if (walletConnection) {
const disconnectFeature = walletConnection.wallet.features['standard:disconnect'];
await disconnectFeature.disconnect();
walletConnection.removeListener();
console.log('Disconnected from Hana Wallet');
}
}
}
runExample();
Best Practices
Error Handling: Always catch and handle user rejections or wallet issues
Check Accounts: Confirm connected accounts exist before signing
Transaction Versions: Use versions Hana supports
Memory Management: Remove unused listeners
UX: Inform users clearly of connection, signing, and errors
Troubleshooting
Common Issues
Problem | Solution |
Wallet not found | Ensure Hana Wallet is installed and enabled |
Signing failed | Check transaction structure and network balance |
Listeners not triggering | Ensure correct setup of |