@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
60 lines • 2.22 kB
JavaScript
/**
* 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