Create and manage SPL token accounts for holding tokens on Solana. This includes creating Associated Token Accounts (ATAs) and closing empty accounts to reclaim SOL.

Setup Solana Libraries First

import { useParaSolana } from './hooks/useParaSolana';
import { Transaction, PublicKey } from '@solana/web3.js';
import { 
  createAssociatedTokenAccountInstruction,
  getAssociatedTokenAddress,
  createCloseAccountInstruction,
  TOKEN_PROGRAM_ID,
  ASSOCIATED_TOKEN_PROGRAM_ID
} from '@solana/spl-token';

function ManageTokenAccounts() {
  const { connection, signer } = useParaSolana();
  
  const createTokenAccount = async (mint: string, owner?: string) => {
    const mintPubkey = new PublicKey(mint);
    const ownerPubkey = owner ? new PublicKey(owner) : signer.sender;
    
    const ata = await getAssociatedTokenAddress(mintPubkey, ownerPubkey);
    
    const accountInfo = await connection.getAccountInfo(ata);
    if (accountInfo) {
      console.log("Token account already exists:", ata.toString());
      return ata;
    }
    
    const transaction = new Transaction().add(
      createAssociatedTokenAccountInstruction(
        signer.sender,
        ata,
        ownerPubkey,
        mintPubkey,
        TOKEN_PROGRAM_ID,
        ASSOCIATED_TOKEN_PROGRAM_ID
      )
    );
    
    try {
      const signature = await signer.sendTransaction(transaction);
      console.log("Created token account:", ata.toString());
      console.log("Transaction signature:", signature);
      return ata;
    } catch (error) {
      console.error("Failed to create token account:", error);
      throw error;
    }
  };
  
  const closeTokenAccount = async (tokenAccount: string) => {
    const tokenAccountPubkey = new PublicKey(tokenAccount);
    
    const transaction = new Transaction().add(
      createCloseAccountInstruction(
        tokenAccountPubkey,
        signer.sender,
        signer.sender,
        [],
        TOKEN_PROGRAM_ID
      )
    );
    
    try {
      const signature = await signer.sendTransaction(transaction);
      console.log("Closed token account:", tokenAccount);
      console.log("Transaction signature:", signature);
      return signature;
    } catch (error) {
      console.error("Failed to close token account:", error);
      throw error;
    }
  };
  
  return (
    <div>
      <button onClick={() => createTokenAccount("USDC_MINT_ADDRESS")}>
        Create USDC Account
      </button>
      <button onClick={() => closeTokenAccount("TOKEN_ACCOUNT_ADDRESS")}>
        Close Token Account
      </button>
    </div>
  );
}

Next Steps