81 lines
1.7 KiB
TypeScript
81 lines
1.7 KiB
TypeScript
import {
|
|
PublicKey,
|
|
SystemProgram,
|
|
SYSVAR_RENT_PUBKEY,
|
|
TransactionInstruction,
|
|
} from '@solana/web3.js'
|
|
import { TOKEN_PROGRAM_ID } from '@solana/spl-token'
|
|
|
|
const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID: PublicKey = new PublicKey(
|
|
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'
|
|
)
|
|
|
|
export async function findAssociatedTokenAddress(
|
|
walletAddress: PublicKey,
|
|
tokenMintAddress: PublicKey
|
|
): Promise<PublicKey> {
|
|
return (
|
|
await PublicKey.findProgramAddress(
|
|
[
|
|
walletAddress.toBuffer(),
|
|
TOKEN_PROGRAM_ID.toBuffer(),
|
|
tokenMintAddress.toBuffer(),
|
|
],
|
|
SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID
|
|
)
|
|
)[0]
|
|
}
|
|
|
|
export async function createAssociatedTokenAccount(
|
|
fundingAddress: PublicKey,
|
|
walletAddress: PublicKey,
|
|
splTokenMintAddress: PublicKey
|
|
): Promise<TransactionInstruction> {
|
|
const associatedTokenAddress = await findAssociatedTokenAddress(
|
|
walletAddress,
|
|
splTokenMintAddress
|
|
)
|
|
const keys = [
|
|
{
|
|
pubkey: fundingAddress,
|
|
isSigner: true,
|
|
isWritable: true,
|
|
},
|
|
{
|
|
pubkey: associatedTokenAddress,
|
|
isSigner: false,
|
|
isWritable: true,
|
|
},
|
|
{
|
|
pubkey: walletAddress,
|
|
isSigner: false,
|
|
isWritable: false,
|
|
},
|
|
{
|
|
pubkey: splTokenMintAddress,
|
|
isSigner: false,
|
|
isWritable: false,
|
|
},
|
|
{
|
|
pubkey: SystemProgram.programId,
|
|
isSigner: false,
|
|
isWritable: false,
|
|
},
|
|
{
|
|
pubkey: TOKEN_PROGRAM_ID,
|
|
isSigner: false,
|
|
isWritable: false,
|
|
},
|
|
{
|
|
pubkey: SYSVAR_RENT_PUBKEY,
|
|
isSigner: false,
|
|
isWritable: false,
|
|
},
|
|
]
|
|
return new TransactionInstruction({
|
|
keys,
|
|
programId: SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID,
|
|
data: Buffer.from([]),
|
|
})
|
|
}
|