Module: Solana::Ruby::Kit::Programs::AssociatedTokenAccount

Extended by:
T::Sig
Defined in:
lib/solana/ruby/kit/programs/associated_token_account.rb

Overview

Ruby interface for the SPL Associated Token Account on-chain program.

An Associated Token Account (ATA) is a Program Derived Address that holds SPL token balances for a given wallet + mint pair. The ATA address is deterministic: given a wallet and a mint, there is exactly one “canonical” token account for that combination.

Seeds used for PDA derivation (all raw 32-byte address buffers):

[ wallet_bytes, token_program_bytes, mint_bytes ]

Program: PROGRAM_ID (the Associated Token Account program)

Reference: github.com/solana-program/associated-token-account

Constant Summary collapse

PROGRAM_ID =

SPL Associated Token Account program.

T.let(
  Addresses::Address.new('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'),
  Addresses::Address
)
TOKEN_PROGRAM_ID =

Original SPL Token program (spl-token).

T.let(
  Addresses::Address.new('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'),
  Addresses::Address
)
TOKEN_2022_PROGRAM_ID =

Token Extensions program (spl-token-2022).

T.let(
  Addresses::Address.new('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'),
  Addresses::Address
)
SYSTEM_PROGRAM_ID =

Solana System Program.

T.let(
  Addresses::Address.new('11111111111111111111111111111111'),
  Addresses::Address
)

Class Method Summary collapse

Class Method Details

.create_instruction(payer:, wallet:, mint:, token_program_id: TOKEN_PROGRAM_ID, idempotent: false) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/solana/ruby/kit/programs/associated_token_account.rb', line 106

def create_instruction(
  payer:,
  wallet:,
  mint:,
  token_program_id: TOKEN_PROGRAM_ID,
  idempotent: false
)
  ata = get_associated_token_address(wallet: wallet, mint: mint, token_program_id: token_program_id)

  # Discriminator: none for "Create", 0x01 for "CreateIdempotent"
  data = idempotent ? "\x01".b : nil

  Instructions::Instruction.new(
    program_address: PROGRAM_ID,
    accounts: [
      Instructions.(payer),          # 0 payer
      Instructions.(ata.address),            # 1 ATA to create
      Instructions.(wallet),                  # 2 owner (readonly)
      Instructions.(mint),                    # 3 mint
      Instructions.(SYSTEM_PROGRAM_ID),      # 4 System Program
      Instructions.(token_program_id),       # 5 Token Program
    ],
    data: data
  )
end

.get_associated_token_address(wallet:, mint:, token_program_id: TOKEN_PROGRAM_ID) ⇒ Object



66
67
68
69
70
71
72
73
74
75
# File 'lib/solana/ruby/kit/programs/associated_token_account.rb', line 66

def get_associated_token_address(wallet:, mint:, token_program_id: TOKEN_PROGRAM_ID)
  wallet_bytes        = Addresses.decode_address(wallet)
  token_program_bytes = Addresses.decode_address(token_program_id)
  mint_bytes          = Addresses.decode_address(mint)

  Addresses.get_program_derived_address(
    program_address: PROGRAM_ID,
    seeds:           [wallet_bytes, token_program_bytes, mint_bytes]
  )
end