Skip to main content

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 10 months 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?