Skip to main content
All CollectionsHana WalletDevelopers
Hana Wallet Polkadot Integration Guide

Hana Wallet Polkadot Integration Guide

Integrate Hana Wallet with Substrate/Polkadot.js chains. Connect accounts, sign messages, and send native token transactions.

David avatar
Written by David
Updated over a week ago

This guide will help you integrate Hana Wallet into your dApp for Substrate/Polkadot.JS chains. You'll learn how to connect to the wallet, retrieve addresses, sign messages, and send transactions.


Prerequisites

Install the required dependencies:

npm install @polkadot/api @polkadot/extension-dapp @polkadot/util

Connecting to Hana Wallet

import { web3Enable } from '@polkadot/extension-dapp';

async function connectToHanaWallet() {
try {
const extensions = await web3Enable('Your dApp Name');
const hanaExtension = extensions.find(ext => ext.name === 'hana');

if (hanaExtension) {
console.log('Successfully connected to Hana Wallet!');
console.log('Hana Wallet version:', hanaExtension.version);
return hanaExtension;
} else {
console.error('Hana Wallet not found. Please install it first.');
return null;
}
} catch (error) {
console.error('Error connecting to wallet:', error);
return null;
}
}

Getting User Accounts

import { web3Accounts } from '@polkadot/extension-dapp';

async function getAccounts() {
try {
const allAccounts = await web3Accounts();
console.log('Available accounts:', allAccounts);

if (allAccounts.length > 0) {
const firstAccount = allAccounts[0];
console.log('Selected account address:', firstAccount.address);
return firstAccount;
} else {
console.log('No accounts found');
return null;
}
} catch (error) {
console.error('Error getting accounts:', error);
return null;
}
}

Or, to get accounts specifically from Hana Wallet:

async function getHanaAccounts(hanaExtension) {
return new Promise((resolve) => {
hanaExtension.accounts.subscribe((accounts) => {
console.log('Hana Wallet accounts:', accounts);
resolve(accounts);
});
});
}

Connecting to a Substrate Chain

import { ApiPromise, WsProvider } from '@polkadot/api';

async function connectToNetwork(networkEndpoint) {
try {
const wsProvider = new WsProvider(networkEndpoint);
const api = await ApiPromise.create({ provider: wsProvider });

const chainName = await api.rpc.system.chain();
const genesisHash = api.genesisHash.toHex();

console.log(`Connected to chain: ${chainName}`);
console.log(`Genesis hash: ${genesisHash}`);

return api;
} catch (error) {
console.error('Error connecting to network:', error);
return null;
}
}

Common endpoints:

  • Polkadot: wss://rpc.polkadot.io

  • Kusama: wss://kusama-rpc.polkadot.io

  • Westend: wss://westend-rpc.polkadot.io


Signing a Message

import { web3FromAddress } from '@polkadot/extension-dapp';
import { stringToHex } from '@polkadot/util';

async function signMessage(address, message) {
try {
const injector = await web3FromAddress(address);
const signRaw = injector?.signer?.signRaw;

if (!signRaw) throw new Error('Signing not supported by the extension');

const { signature } = await signRaw({
address: address,
data: stringToHex(message),
type: 'bytes'
});

console.log('Message signed successfully!');
console.log('Signature:', signature);
return signature;
} catch (error) {
console.error('Error signing message:', error);
return null;
}
}

Sending a Transaction

import { web3FromAddress } from '@polkadot/extension-dapp';

async function sendNativeTokens(api, senderAddress, recipientAddress, amount) {
try {
const transferExtrinsic = api.tx.balances.transfer(recipientAddress, amount);
const injector = await web3FromAddress(senderAddress);

const txResult = await transferExtrinsic.signAndSend(
senderAddress,
{ signer: injector.signer },
({ status, events }) => {
if (status.isInBlock) {
console.log(`Included in block: ${status.asInBlock.toString()}`);
} else if (status.isFinalized) {
console.log(`Finalized in block: ${status.asFinalized.toString()}`);
events.forEach(({ event }) => {
if (api.events.system.ExtrinsicSuccess.is(event)) {
console.log('Transaction succeeded!');
} else if (api.events.system.ExtrinsicFailed.is(event)) {
console.error('Transaction failed!');
}
});
}
}
);

console.log('Transaction submitted');
return txResult;
} catch (error) {
console.error('Error sending transaction:', error);
return null;
}
}

Troubleshooting

Common Issues

  1. Wallet not detected

    • Ensure Hana Wallet is installed and enabled

    • Use the correct name: "hana"

  2. Permission denied

    • User may have denied connection request

    • Prompt the user to approve access

  3. Transaction failed

    • Insufficient balance

    • Incorrect parameters

    • Network congestion


Best Practices

  1. Error Handling

    • Always wrap wallet and blockchain calls in try/catch

    • Display helpful messages to users

  2. UI Feedback

    • Show loaders during transactions or wallet requests

    • Confirm submission and success/failure

  3. Network Flexibility

    • Let users pick a network

    • Store their choice for convenience

  4. Security

    • Never store private keys in your frontend

    • Validate and sanitize all inputs


With Hana Wallet, your dApp can now easily interact with Polkadot and other Substrate-based chains. You’ve learned how to:

  • Connect to Hana Wallet

  • Retrieve user accounts

  • Connect to a blockchain network

  • Sign messages

  • Send native token transactions

You're now ready to launch dApps on the Polkadot ecosystem with Hana Wallet support!

Did this answer your question?