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
- Wallet not detected - Ensure Hana Wallet is installed and enabled 
- Use the correct name: - "hana"
 
- Permission denied - User may have denied connection request 
- Prompt the user to approve access 
 
- Transaction failed - Insufficient balance 
- Incorrect parameters 
- Network congestion 
 
Best Practices
- Error Handling - Always wrap wallet and blockchain calls in - try/catch
- Display helpful messages to users 
 
- UI Feedback - Show loaders during transactions or wallet requests 
- Confirm submission and success/failure 
 
- Network Flexibility - Let users pick a network 
- Store their choice for convenience 
 
- 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!

