Solana模拟pump.fun买入指令失败,报错AccountNotFound求助
Solana模拟pump.fun交易报错AccountNotFound问题
问题描述
在Solana上模拟pump.fun的代币买入交易时触发AccountNotFound错误,但创建交易签名并确认时却能成功买入代币。已知代币铸币地址正确,疑问:模拟交易是否需要账户有资金?
相关代码
main.py
from solders.pubkey import Pubkey from pumpfun.pumpfun import buy buy(Pubkey.from_string('token_mint_string'), 0.05)
pumpfun.py
def buy(token_mint_address: Pubkey, sol_buy_amount: float): # ... (部分无关代码省略) compiled_message: MessageV0 = MessageV0.try_compile( payer=owner_pubkey, instructions=instructions, address_lookup_table_accounts=[], recent_blockhash=client.get_latest_blockhash().value.blockhash, ) transaction: VersionedTransaction = VersionedTransaction(compiled_message, [payer_keypair]) print(client.simulate_transaction(transaction))
模拟交易报错输出
SimulateTransactionResp { context: RpcResponseContext { slot: 277011621, api_version: Some("1.18.15") }, value: RpcSimulateTransactionResult(RpcSimulateTransactionResult { err: Some(AccountNotFound), logs: Some([]), accounts: None, units_consumed: Some(0), return_data: None, inner_instructions: None }) }
解答
- 模拟交易不需要账户有资金,报错的核心原因是交易依赖的某些账户(比如代币关联的ATA账户)尚未初始化,而模拟环境默认不会自动创建未存在的账户。
- 真实交易成功的逻辑:pump.fun的买入指令会自动包含创建ATA账户的逻辑,链上执行时会自动初始化所需账户;但模拟交易时,除非显式配置,否则RPC节点不会预创建这些账户,导致
AccountNotFound。 - 修复模拟报错的方案:
- 调用
simulate_transaction时传入replace_recent_blockhash=True参数,让节点允许模拟未初始化账户的创建逻辑; - 使用
accounts参数指定需要预加载的账户(比如通过ATA推导公式算出的目标账户地址),告知模拟环境这些账户会在交易中被创建。
- 调用
内容的提问来源于stack exchange,提问作者user26339579
相关产品推荐
相关产品推荐

