You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:18:42