执行SPL代币转账时触发InvalidProgramForExecution错误求助
问题排查与修复方案
错误根源
你遇到的InvalidProgramForExecution错误,核心原因是**TransferParams里的program_id填错了**:你把代币的mint地址(3hALJzSz2bx8gxgrHg7EQQtdiHxG7d7LNswxVMXrUApw)当成了SPL Token Program的地址。SPL转账指令必须调用官方的Token Program,而不是代币本身的地址。
另外还有一个潜在问题:source参数应该填发送方的代币关联账户地址,而不是钱包地址(EckcvMCmpkKwF4hDhWxq8cm4qy8JBkb2vBVQDu4WvxmM)——每个钱包对应每个代币都有一个独立的关联账户,直接用钱包地址会导致找不到代币余额。
修复后的代码
from spl.token.instructions import transfer, TransferParams, create_associated_token_account, CreateAssociatedTokenAccountParams from spl.token.client import Client from solana.publickey import PublicKey from solana.transaction import Transaction from solana.keypair import Keypair import base64 # 替换为你的实际信息 address = "EckcvMCmpkKwF4hDhWxq8cm4qy8JBkb2vBVQDu4WvxmM" # 发送方钱包地址 my_token_mint = "3hALJzSz2bx8gxgrHg7EQQtdiHxG7d7LNswxVMXrUApw" # 代币mint地址 private_key = base64.b64decode("你的64位私钥字符串") # 私钥需解码为字节数组 # SPL Token Program官方地址(Devnet/Mainnet通用) SPL_TOKEN_PROGRAM_ID = PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") def send_payouts_spl(dest_wallet, amount): solana_client = Client("https://api.devnet.solana.com") # 获取发送方的代币关联账户地址 source_token_account = solana_client.get_associated_token_account_address( owner=PublicKey(address), mint=PublicKey(my_token_mint) ) # 获取接收方的代币关联账户地址 dest_token_account = solana_client.get_associated_token_account_address( owner=PublicKey(dest_wallet), mint=PublicKey(my_token_mint) ) transfer_params = TransferParams( amount=amount, dest=PublicKey(dest_token_account), owner=PublicKey(address), program_id=SPL_TOKEN_PROGRAM_ID, # 使用官方Token Program地址 source=PublicKey(source_token_account) ) txn = Transaction() txn.add(transfer(transfer_params)) # 从私钥字节创建Keypair owner = Keypair.from_secret_key(private_key) # 检查接收方是否存在代币关联账户,不存在则自动创建 dest_account_info = solana_client.get_account_info(PublicKey(dest_token_account)) if not dest_account_info.value: create_ata_params = CreateAssociatedTokenAccountParams( payer=owner.public_key, owner=PublicKey(dest_wallet), mint=PublicKey(my_token_mint), program_id=SPL_TOKEN_PROGRAM_ID ) txn.add(create_associated_token_account(create_ata_params)) tx_id = solana_client.send_transaction(txn, owner) return tx_id
关键修复点说明
program_id修正:替换为SPL Token Program的官方地址TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,该地址在所有Solana网络(Devnet、Mainnet、Testnet)通用。- 代币关联账户:通过
get_associated_token_account_address获取发送方和接收方的代币账户地址,而非直接使用钱包地址。 - 私钥处理:
Keypair.from_secret_key需要字节数组,若私钥是base64字符串,需先解码。 - 自动创建接收方账户:若接收方未持有该代币的关联账户,转账前需添加创建指令,否则交易会失败。
内容的提问来源于stack exchange,提问作者AD DAB
相关产品推荐
相关产品推荐

