Skip to main content

Overview

The Bank precompile provides access to Sei’s native token operations, allowing you to query balances, transfer tokens, and retrieve token metadata directly from EVM contracts. This precompile bridges EVM and Cosmos SDK bank module functionality. Contract Address: 0x0000000000000000000000000000000000001001

Key Features

  • Balance Queries: Check token balances for any address and denomination
  • Token Transfers: Send native tokens between addresses
  • Token Metadata: Get token name, symbol, decimals, and total supply
  • Multi-Denomination Support: Work with any native token denomination

Available Functions

View Functions

Get the balance of a specific token denomination for an address.Parameters:
  • acc (address): The account address to query
  • denom (string): The token denomination (e.g., “usei”)
Returns: Token balance as uint256
const balance = await bankContract.balance(
  "0x742d35Cc6634C0532925a3b8D6Ac0c2fb15d8d2A", 
  "usei"
);
Get all token balances for an address across all denominations.Parameters:
  • acc (address): The account address to query
Returns: Array of Coin structs with amount and denomination
const balances = await bankContract.all_balances(
  "0x742d35Cc6634C0532925a3b8D6Ac0c2fb15d8d2A"
);
// Returns: [{ amount: 1000000n, denom: "usei" }, ...]
Get the display name for a token denomination.Parameters:
  • denom (string): The token denomination
Returns: Human-readable token name
const name = await bankContract.name("usei");
// Returns: "Sei"
Get the symbol for a token denomination.Parameters:
  • denom (string): The token denomination
Returns: Token symbol
const symbol = await bankContract.symbol("usei");
// Returns: "SEI"
Get the number of decimals for a token denomination.Parameters:
  • denom (string): The token denomination
Returns: Number of decimal places
const decimals = await bankContract.decimals("usei");
// Returns: 6
Get the total supply of a token denomination.Parameters:
  • denom (string): The token denomination
Returns: Total token supply
const supply = await bankContract.supply("usei");

State-Changing Functions

Transfer tokens between addresses.Parameters:
  • fromAddress (address): Source address
  • toAddress (address): Destination address
  • denom (string): Token denomination
  • amount (uint256): Amount to transfer
Returns: Success boolean
const success = await bankContract.send(
  "0x742d35Cc6634C0532925a3b8D6Ac0c2fb15d8d2A",
  "0x8ba1f109551bD432803012645Hac136c",
  "usei",
  1000000n
);
Send native SEI tokens to a Cosmos address.Parameters:
  • toNativeAddress (string): Destination Cosmos address
Returns: Success booleanNote: This function is payable - send SEI with the transaction
const success = await bankContract.sendNative(
  "sei1...", 
  { value: parseEther("1.0") }
);

Usage Examples

import { createPublicClient, http, formatEther } from 'viem';
import { 
  seiTestnet,
  BANK_PRECOMPILE_ABI,
  BANK_PRECOMPILE_ADDRESS 
} from '@sei-js/precompiles/viem';

const client = createPublicClient({
  chain: seiTestnet,
  transport: http()
});

// Get SEI balance
async function getSeiBalance(address: string) {
  const balance = await client.readContract({
    address: BANK_PRECOMPILE_ADDRESS,
    abi: BANK_PRECOMPILE_ABI,
    functionName: 'balance',
    args: [address, 'usei']
  });
  
  return formatEther(balance);
}

// Get all balances
async function getAllBalances(address: string) {
  const balances = await client.readContract({
    address: BANK_PRECOMPILE_ADDRESS,
    abi: BANK_PRECOMPILE_ABI,
    functionName: 'all_balances',
    args: [address]
  });
  
  return balances.map(coin => ({
    denom: coin.denom,
    amount: formatEther(coin.amount)
  }));
}

// Get token metadata
async function getTokenInfo(denom: string) {
  const [name, symbol, decimals] = await Promise.all([
    client.readContract({
      address: BANK_PRECOMPILE_ADDRESS,
      abi: BANK_PRECOMPILE_ABI,
      functionName: 'name',
      args: [denom]
    }),
    client.readContract({
      address: BANK_PRECOMPILE_ADDRESS,
      abi: BANK_PRECOMPILE_ABI,
      functionName: 'symbol',
      args: [denom]
    }),
    client.readContract({
      address: BANK_PRECOMPILE_ADDRESS,
      abi: BANK_PRECOMPILE_ABI,
      functionName: 'decimals',
      args: [denom]
    })
  ]);
  
  return { name, symbol, decimals };
}

Common Use Cases

DeFi Integration

  • Query user token balances before swaps
  • Check available liquidity across denominations
  • Validate token transfers in smart contracts

Wallet Applications

  • Display user portfolio across all native tokens
  • Enable native token transfers
  • Show token metadata and formatting

Cross-Chain Applications

  • Bridge native tokens to other chains
  • Query token supplies for economic analysis
  • Handle multi-denomination transactions

Error Handling

Common errors when using the Bank precompile:
  • Invalid address format: Ensure addresses are valid EVM addresses
  • Unknown denomination: Verify the token denomination exists
  • Insufficient balance: Check balance before attempting transfers
  • Invalid amount: Ensure transfer amounts are positive and within limits
try {
  const balance = await bankContract.balance(address, 'usei');
  console.log('Balance:', formatEther(balance));
} catch (error) {
  if (error.message.includes('invalid address')) {
    console.error('Invalid address format');
  } else if (error.message.includes('unknown denomination')) {
    console.error('Token denomination not found');
  } else {
    console.error('Unexpected error:', error);
  }
}