Bank Precompile

Bank Precompile Example

This example demonstrates how to use the Bank precompile contract for token transfers.

Prerequisites

Before running this example, make sure you have:

  • Node.js v18 or later
  • Access to XPLA Chain testnet (Cube)
  • Test tokens in your wallet

Setup

Install the required dependencies:

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

Example Code

// examples/bank-precompile.js
import { JsonRpcProvider, Wallet } from 'ethers';
import { createPrecompileBank } from '@xpla/evm/precompiles';
import { EthSecp256k1HDWallet } from '@xpla/xpla/wallets/ethSecp256k1hd';
import * as bip39 from 'bip39';

async function bankPrecompileExample() {
  console.log('=== Bank Precompile Example ===\n');

  const RPC_URL = 'https://cube-evm-rpc.xpla.dev';
  const provider = new JsonRpcProvider(RPC_URL);

  // Generate wallets
  const mnemonic1 = bip39.generateMnemonic();
  const mnemonic2 = bip39.generateMnemonic();
  
  const wallet1 = Wallet.fromPhrase(mnemonic1);
  const wallet2 = Wallet.fromPhrase(mnemonic2);
  
  const senderAddress = wallet1.address;
  const receiverAddress = wallet2.address;
  
  console.log(`Sender: ${senderAddress}`);
  console.log(`Receiver: ${receiverAddress}\n`);

  // Create bank contract instance
  const bankContract = createPrecompileBank(provider);
  const bankContractWithSigner = bankContract.connect(wallet1.connect(provider));

  // Check initial balances
  const initialBalance = await provider.getBalance(senderAddress);
  console.log(`Initial Sender Balance: ${initialBalance} wei`);

  const receiverBalance = await provider.getBalance(receiverAddress);
  console.log(`Initial Receiver Balance: ${receiverBalance} wei\n`);

  // Prepare transfer amount
  const transferAmount = {
    denom: 'axpla',
    amount: '1000000000000000000' // 1 XPLA
  };

  try {
    // Execute transfer
    console.log('Executing transfer...');
    const txResponse = await bankContractWithSigner.send(
      senderAddress, 
      receiverAddress, 
      [transferAmount]
    );
    
    console.log(`Transaction Hash: ${txResponse.hash}`);
    
    // Wait for transaction confirmation
    const txReceipt = await txResponse.wait();
    console.log(`Transaction confirmed in block: ${txReceipt.blockNumber}\n`);

    // Check updated balances
    const newSenderBalance = await provider.getBalance(senderAddress);
    const newReceiverBalance = await provider.getBalance(receiverAddress);
    
    console.log(`New Sender Balance: ${newSenderBalance} wei`);
    console.log(`New Receiver Balance: ${newReceiverBalance} wei`);
    
    console.log('✅ Bank transfer completed successfully!');
    
  } catch (error) {
    console.error('❌ Transfer failed:', error);
  }
}

bankPrecompileExample().catch(console.error);

Running the Example

node examples/bank-precompile.js

Expected Output

=== Bank Precompile Example ===

Sender: 0x123...
Receiver: 0x456...

Initial Sender Balance: 1000000000000000000 wei
Initial Receiver Balance: 0 wei

Executing transfer...
Transaction Hash: 0xabc...
Transaction confirmed in block: 12345

New Sender Balance: 999000000000000000 wei
New Receiver Balance: 1000000000000000000 wei
✅ Bank transfer completed successfully!

Key Features

  • Token Transfer: Transfer native tokens using the Bank precompile
  • Balance Queries: Check account balances before and after transfers
  • Transaction Handling: Proper async/await pattern for transaction execution
  • Error Handling: Graceful handling of transfer failures