Address Conversion

Address Conversion Example

This example demonstrates how to convert between Cosmos Bech32 addresses and EVM hex addresses.

Prerequisites

Before running this example, make sure you have:

  • Node.js v18 or later
  • Access to XPLA Chain testnet (Cube)

Setup

Install the required dependencies:

npm install @xpla/evm @xpla/xpla @interchainjs/cosmos @interchainjs/utils ethers bip39

Example Code

// examples/address-conversion.js
import { fromBech32, toBech32 } from '@interchainjs/encoding';
import { getAddress, hexlify } from 'ethers';
import { EthSecp256k1HDWallet } from '@xpla/xpla/wallets/ethSecp256k1hd';
import * as bip39 from 'bip39';

async function addressConversionExample() {
  console.log('=== Address Conversion Example ===\n');

  // Generate a new wallet
  const mnemonic = bip39.generateMnemonic();
  const wallet = await EthSecp256k1HDWallet.fromMnemonic(mnemonic, [{
      prefix: 'xpla',
      hdPath: "m/44'/60'/0'/0/0",
    }]
  );

  const accounts = await wallet.getAccounts();
  const cosmosAddress = accounts[0].address;
  
  // Convert to EVM address
  const { data: hexByteAddress } = fromBech32(cosmosAddress);
  const evmAddress = getAddress(hexlify(hexByteAddress));
  
  console.log(`Cosmos Address: ${cosmosAddress}`);
  console.log(`EVM Address: ${evmAddress}`);
  
  // Convert back to Cosmos address
  const convertedCosmosAddress = toBech32('xpla', hexByteAddress);
  console.log(`Converted Back: ${convertedCosmosAddress}`);
  
  // Verify conversion
  console.log(`Conversion Valid: ${cosmosAddress === convertedCosmosAddress}`);
}

addressConversionExample().catch(console.error);

Running the Example

node examples/address-conversion.js

Expected Output

=== Address Conversion Example ===

Cosmos Address: xpla1abc...
EVM Address: 0x123...
Converted Back: xpla1abc...
Conversion Valid: true

Key Concepts

  • Bech32 to EVM: Use fromBech32() to extract hex bytes, then convert to EVM address
  • EVM to Bech32: Use toBech32() with the appropriate prefix (‘xpla’ for XPLA Chain)
  • Address Validation: Both addresses represent the same account on different interfaces