UNPKG

@wuwei-labs/srsly

Version:
60 lines 2.22 kB
/** * Token account derivation utilities * @module pda/token */ import { address, getProgramDerivedAddress, getAddressEncoder } from '@solana/kit'; import { getSignerAddress } from '../utils/signer'; /** * SPL Token program address */ const TOKEN_PROGRAM = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'; /** * SPL Associated Token Account program address */ const ASSOCIATED_TOKEN_PROGRAM = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'; /** * Address encoder for PDA seeds */ const addressEncoder = getAddressEncoder(); /** * Derive an Associated Token Account (ATA) address * * ATAs are deterministic token accounts owned by a wallet for a specific token mint. * This is the standard way to derive token account addresses in Solana. * * @param owner - The wallet public key that owns the ATA * @param mint - The token mint public key * @param tokenProgramAddress - Optional token program address (defaults to SPL Token) * @param associatedTokenProgramAddress - Optional ATA program address (defaults to SPL ATA) * @returns The derived ATA address * * @example * ```typescript * import { deriveAssociatedTokenAccount } from './token'; * * const ata = await deriveAssociatedTokenAccount( * walletAddress, * atlasMintAddress * ); * ``` */ export async function deriveAssociatedTokenAccount(owner, mint, tokenProgramAddress, associatedTokenProgramAddress) { const ownerAddress = getSignerAddress(owner); const mintAddress = getSignerAddress(mint); const tokenProgram = tokenProgramAddress ? getSignerAddress(tokenProgramAddress) : address(TOKEN_PROGRAM); const ataProgram = associatedTokenProgramAddress ? getSignerAddress(associatedTokenProgramAddress) : address(ASSOCIATED_TOKEN_PROGRAM); // Encode all address seeds to bytes for PDA derivation const ownerBytes = addressEncoder.encode(ownerAddress); const tokenProgramBytes = addressEncoder.encode(tokenProgram); const mintBytes = addressEncoder.encode(mintAddress); const [pda] = await getProgramDerivedAddress({ programAddress: ataProgram, seeds: [ownerBytes, tokenProgramBytes, mintBytes], }); return pda; } //# sourceMappingURL=token.js.map