Comprehensive Python SDK for interacting with the Solana blockchain network including RPC clients, SPL Token support, and WebSocket subscriptions.
Comprehensive SPL Token program interface for token creation, account management, transfers, and advanced token operations. The library supports both the standard SPL Token program and the newer Token-2022 program with enhanced features.
Create token instances for interacting with existing tokens or initialize new tokens with mint authorities and program configurations.
class Token:
def __init__(self, conn: Client, pubkey: Pubkey, program_id: Pubkey, payer: Keypair):
"""
Initialize token client for existing token.
Parameters:
- conn: RPC client connection
- pubkey: Token mint public key
- program_id: Token program ID (TOKEN_PROGRAM_ID or TOKEN_2022_PROGRAM_ID)
- payer: Keypair for transaction fees
"""
class AsyncToken:
def __init__(self, conn: AsyncClient, pubkey: Pubkey, program_id: Pubkey, payer: Keypair):
"""
Initialize async token client for existing token.
Parameters:
- conn: Async RPC client connection
- pubkey: Token mint public key
- program_id: Token program ID
- payer: Keypair for transaction fees
"""Create new token mints with configurable decimal precision, mint authority, and optional freeze authority.
@staticmethod
def create_mint(conn: Client, payer: Keypair, mint_authority: Pubkey, decimals: int, program_id: Pubkey, freeze_authority: Optional[Pubkey] = None, skip_confirmation: bool = False, recent_blockhash: Optional[Blockhash] = None) -> "Token":
"""
Create a new token mint.
Parameters:
- conn: RPC client connection
- payer: Keypair to pay for mint creation and transaction fees
- mint_authority: Public key with authority to mint tokens
- decimals: Number of decimal places for the token (0-9)
- program_id: Token program ID
- freeze_authority: Optional authority to freeze token accounts
- skip_confirmation: Skip waiting for transaction confirmation
- recent_blockhash: Recent blockhash for transaction
Returns:
Token instance for the newly created mint
"""
@staticmethod
async def create_mint(conn: AsyncClient, payer: Keypair, mint_authority: Pubkey, decimals: int, program_id: Pubkey, freeze_authority: Optional[Pubkey] = None, skip_confirmation: bool = False, recent_blockhash: Optional[Blockhash] = None) -> "AsyncToken":
"""Async version of create_mint."""Create and manage token accounts including standard accounts, associated token accounts, wrapped SOL accounts, and multisig accounts.
def create_account(self, owner: Pubkey, skip_confirmation: bool = False, recent_blockhash: Optional[Blockhash] = None) -> Pubkey:
"""
Create a new token account.
Parameters:
- owner: Public key that will own the token account
- skip_confirmation: Skip waiting for transaction confirmation
- recent_blockhash: Recent blockhash for transaction
Returns:
Public key of the created token account
"""
def create_associated_token_account(self, owner: Pubkey, skip_confirmation: bool = False, recent_blockhash: Optional[Blockhash] = None) -> Pubkey:
"""
Create an associated token account (ATA).
Parameters:
- owner: Public key that will own the ATA
- skip_confirmation: Skip waiting for transaction confirmation
- recent_blockhash: Recent blockhash for transaction
Returns:
Public key of the created associated token account
"""
@staticmethod
def create_wrapped_native_account(conn: Client, program_id: Pubkey, owner: Pubkey, payer: Keypair, amount: int, skip_confirmation: bool = False, recent_blockhash: Optional[Blockhash] = None) -> Pubkey:
"""
Create a wrapped SOL account.
Parameters:
- conn: RPC client connection
- program_id: Token program ID
- owner: Owner of the wrapped SOL account
- payer: Keypair to pay for account creation and fund the account
- amount: Amount of SOL to wrap (in lamports)
- skip_confirmation: Skip waiting for transaction confirmation
- recent_blockhash: Recent blockhash for transaction
Returns:
Public key of the created wrapped SOL account
"""
def create_multisig(self, m: int, multi_signers: List[Pubkey], opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> Pubkey:
"""
Create a multisig account.
Parameters:
- m: Number of signatures required (1 <= m <= signers)
- multi_signers: List of signer public keys (max 11)
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
Public key of the created multisig account
"""Retrieve token account information, balances, mint details, and query accounts by ownership or delegation.
def get_balance(self, pubkey: Pubkey, commitment: Optional[Commitment] = None) -> GetTokenAccountBalanceResp:
"""
Get token account balance.
Parameters:
- pubkey: Token account public key
- commitment: Commitment level for the query
Returns:
GetTokenAccountBalanceResp with balance information
"""
def get_account_info(self, account: Pubkey, commitment: Optional[Commitment] = None) -> AccountInfo:
"""
Get detailed token account information.
Parameters:
- account: Token account public key
- commitment: Commitment level for the query
Returns:
AccountInfo with account details (mint, owner, amount, delegate, etc.)
"""
def get_mint_info(self) -> MintInfo:
"""
Get mint information for this token.
Returns:
MintInfo with mint details (authority, supply, decimals, freeze_authority)
"""
def get_accounts_by_owner(self, owner: Pubkey, commitment: Optional[Commitment] = None, encoding: str = "base64") -> GetTokenAccountsByOwnerResp:
"""
Get all token accounts owned by a specific address.
Parameters:
- owner: Owner public key
- commitment: Commitment level for the query
- encoding: Account data encoding
Returns:
GetTokenAccountsByOwnerResp with array of token accounts
"""
def get_accounts_by_delegate(self, owner: Pubkey, commitment: Optional[Commitment] = None, encoding: str = "base64") -> GetTokenAccountsByDelegateResp:
"""
Get all token accounts delegated to a specific address.
Parameters:
- owner: Delegate public key
- commitment: Commitment level for the query
- encoding: Account data encoding
Returns:
GetTokenAccountsByDelegateResp with array of delegated accounts
"""Transfer tokens, mint new tokens, burn tokens, and manage token approvals with comprehensive token transaction capabilities.
def transfer(self, source: Pubkey, dest: Pubkey, owner: Keypair, amount: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Transfer tokens between accounts.
Parameters:
- source: Source token account public key
- dest: Destination token account public key
- owner: Owner keypair or multisig account
- amount: Amount to transfer (in token's smallest unit)
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def mint_to(self, dest: Pubkey, mint_authority: Keypair, amount: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Mint tokens to an account.
Parameters:
- dest: Destination token account public key
- mint_authority: Mint authority keypair
- amount: Amount to mint (in token's smallest unit)
- multi_signers: Additional signers for multisig mint authority
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def burn(self, account: Pubkey, owner: Keypair, amount: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Burn tokens from an account.
Parameters:
- account: Token account to burn from
- owner: Account owner keypair
- amount: Amount to burn (in token's smallest unit)
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def approve(self, source: Pubkey, delegate: Pubkey, owner: Keypair, amount: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Approve a delegate to transfer tokens.
Parameters:
- source: Source token account public key
- delegate: Delegate public key
- owner: Account owner keypair
- amount: Amount to approve for delegation
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def revoke(self, account: Pubkey, owner: Keypair, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Revoke a delegate's approval.
Parameters:
- account: Token account public key
- owner: Account owner keypair
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""Token operations with additional validation including decimals checking for improved safety and error prevention.
def transfer_checked(self, source: Pubkey, dest: Pubkey, owner: Keypair, amount: int, decimals: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Transfer tokens with decimals validation.
Parameters:
- source: Source token account public key
- dest: Destination token account public key
- owner: Owner keypair
- amount: Amount to transfer
- decimals: Expected decimals for validation
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def mint_to_checked(self, dest: Pubkey, mint_authority: Keypair, amount: int, decimals: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Mint tokens with decimals validation.
Parameters:
- dest: Destination token account public key
- mint_authority: Mint authority keypair
- amount: Amount to mint
- decimals: Expected decimals for validation
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def burn_checked(self, account: Pubkey, owner: Keypair, amount: int, decimals: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Burn tokens with decimals validation.
Parameters:
- account: Token account to burn from
- owner: Account owner keypair
- amount: Amount to burn
- decimals: Expected decimals for validation
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def approve_checked(self, source: Pubkey, delegate: Pubkey, owner: Keypair, amount: int, decimals: int, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Approve delegate with decimals validation.
Parameters:
- source: Source token account public key
- delegate: Delegate public key
- owner: Account owner keypair
- amount: Amount to approve
- decimals: Expected decimals for validation
- multi_signers: Additional signers for multisig accounts
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""Manage token account authorities, freeze/unfreeze accounts, close accounts, and transfer ownership with comprehensive authority control.
def set_authority(self, account: Pubkey, current_authority: Keypair, authority_type: AuthorityType, new_authority: Optional[Pubkey] = None, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Change or remove authority for an account or mint.
Parameters:
- account: Account or mint public key
- current_authority: Current authority keypair
- authority_type: Type of authority to change (MINT_TOKENS, FREEZE_ACCOUNT, ACCOUNT_OWNER, CLOSE_ACCOUNT)
- new_authority: New authority public key (None to remove authority)
- multi_signers: Additional signers for multisig authorities
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def freeze_account(self, account: Pubkey, authority: Keypair, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Freeze a token account.
Parameters:
- account: Token account to freeze
- authority: Freeze authority keypair
- multi_signers: Additional signers for multisig authorities
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def thaw_account(self, account: Pubkey, authority: Keypair, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Unfreeze a token account.
Parameters:
- account: Token account to unfreeze
- authority: Freeze authority keypair
- multi_signers: Additional signers for multisig authorities
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""
def close_account(self, account: Pubkey, dest: Pubkey, authority: Keypair, multi_signers: Optional[List[Keypair]] = None, opts: Optional[TxOpts] = None, recent_blockhash: Optional[Blockhash] = None) -> SendTransactionResp:
"""
Close a token account and transfer remaining SOL.
Parameters:
- account: Token account to close
- dest: Destination for remaining SOL
- authority: Close authority keypair
- multi_signers: Additional signers for multisig authorities
- opts: Transaction options
- recent_blockhash: Recent blockhash for transaction
Returns:
SendTransactionResp with transaction signature
"""Helper functions for calculating rent exemption amounts and other token-related utilities.
@staticmethod
def get_min_balance_rent_for_exempt_for_account(conn: Client) -> int:
"""
Get minimum balance for rent exemption for token accounts.
Parameters:
- conn: RPC client connection
Returns:
Minimum balance in lamports for token account rent exemption
"""
@staticmethod
def get_min_balance_rent_for_exempt_for_mint(conn: Client) -> int:
"""
Get minimum balance for rent exemption for mint accounts.
Parameters:
- conn: RPC client connection
Returns:
Minimum balance in lamports for mint account rent exemption
"""
@staticmethod
def get_min_balance_rent_for_exempt_for_multisig(conn: Client) -> int:
"""
Get minimum balance for rent exemption for multisig accounts.
Parameters:
- conn: RPC client connection
Returns:
Minimum balance in lamports for multisig account rent exemption
"""Simple memo functionality for attaching messages to transactions.
def create_memo(params: MemoParams) -> Instruction:
"""
Create a memo instruction.
Parameters:
- params: MemoParams with program_id, signer, and message
Returns:
Instruction that can be added to transactions
"""
def decode_create_memo(instruction: Instruction) -> MemoParams:
"""
Decode a memo instruction.
Parameters:
- instruction: Memo instruction to decode
Returns:
MemoParams with decoded instruction parameters
"""class AccountInfo(NamedTuple):
mint: Pubkey
owner: Pubkey
amount: int
delegate: Optional[Pubkey]
delegated_amount: int
is_initialized: bool
is_frozen: bool
is_native: Optional[int]
rent_exempt_reserve: Optional[int]
close_authority: Optional[Pubkey]
class MintInfo(NamedTuple):
mint_authority: Optional[Pubkey]
supply: int
decimals: int
is_initialized: bool
freeze_authority: Optional[Pubkey]
class AuthorityType(IntEnum):
MINT_TOKENS = 0
FREEZE_ACCOUNT = 1
ACCOUNT_OWNER = 2
CLOSE_ACCOUNT = 3
class MemoParams(NamedTuple):
program_id: Pubkey # Memo program account
signer: Pubkey # Signing account
message: bytes # Memo message in bytes
class GetTokenAccountBalanceResp:
value: TokenAccountBalance
class TokenAccountBalance:
amount: str
decimals: int
ui_amount: Optional[float]
ui_amount_string: str
# Constants
TOKEN_PROGRAM_ID: Pubkey
TOKEN_2022_PROGRAM_ID: Pubkey
ASSOCIATED_TOKEN_PROGRAM_ID: Pubkey
WRAPPED_SOL_MINT: Pubkey
NATIVE_DECIMALS: int = 9
MINT_LEN: int = 82
ACCOUNT_LEN: int = 165
MULTISIG_LEN: int = 355
MEMO_PROGRAM_ID: PubkeyInstall with Tessl CLI
npx tessl i tessl/pypi-solana@0.36.1