调用Meteora DLMM API的getPositionsByUserAndLbPair接口返回410错误求助
解决Meteora DLMM API获取用户持仓的410错误问题
问题分析
你遇到的410 Gone错误,要么是当前用的Solana RPC节点禁用了该API依赖的特定RPC方法,要么是getPositionsByUserAndLbPair的参数传递不符合要求。而不带参数调用返回空数组,是因为方法缺少必要过滤条件,无法定位到你的实际持仓。
解决方案
1. 更换支持DLMM调用的RPC节点
默认的Solana公共RPC节点常因资源限制禁用部分方法,导致这类错误。你需要切换到支持DLMM相关调用的RPC节点:
import { Connection } from "@solana/web3.js"; import { DlmmPool } from "@meteora-ag/dlmm"; // 使用支持DLMM的RPC节点(如付费节点或Meteora推荐的节点) const connection = new Connection("https://your-valid-rpc-url", "confirmed"); // 初始化DLMM池时传入该connection实例 const dlmmPool = new DlmmPool( connection, new PublicKey("your-lb-pool-address"), // 其他必要参数 );
2. 传递正确的方法参数
getPositionsByUserAndLbPair需要两个必填参数:用户公钥和LB Pair的公钥,你之前只传了用户公钥,参数不完整触发错误。正确调用方式如下:
// 从已初始化的dlmmPool实例中获取LB Pair公钥 const lbPairPubkey = dlmmPool.lbPair.publicKey; // 传入两个参数调用方法 const { userPositions } = await dlmmPool.getPositionsByUserAndLbPair( WALLET_KEYPAIR.publicKey, lbPairPubkey );
3. 改用替代方法获取持仓
如果上述方法仍有问题,可使用getAllUserPositions获取用户全量DLMM持仓,再过滤当前池的内容:
// 获取用户所有DLMM持仓 const allUserPositions = await dlmmPool.getAllUserPositions(WALLET_KEYPAIR.publicKey); // 过滤出当前池的持仓 const targetPoolPositions = allUserPositions.filter(pos => pos.lbPairAddress.equals(dlmmPool.lbPair.publicKey) );
4. 更新Meteora DLMM SDK
旧版本SDK可能存在调用逻辑bug,更新到最新版本可解决兼容性问题:
# npm用户 npm update @meteora-ag/dlmm # yarn用户 yarn upgrade @meteora-ag/dlmm
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

