如何计算Raydium兑换的amountOut并获取poolKeys?求简单示例
Raydium兑换中获取poolKeys及计算amountOut的实现示例
获取Pool Keys
要计算兑换产出,首先得拿到对应交易对的poolKeys,可通过Raydium SDK的Liquidity.getPoolKeys方法获取,示例代码如下:
import { Liquidity, Token, TOKEN_PROGRAM_ID } from '@raydium-io/raydium-sdk'; import { Connection, PublicKey } from '@solana/web3.js'; // 初始化Solana节点连接 const connection = new Connection('https://api.mainnet-beta.solana.com'); // 定义交易对的代币Mint地址(示例为SOL-USDC) const solMint = new PublicKey('So11111111111111111111111111111111111111112'); const usdcMint = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'); // 获取poolKeys async function fetchPoolKeys() { const poolKeys = await Liquidity.getPoolKeys({ connection, mintA: solMint, mintB: usdcMint, // Raydium AMM主网程序ID,测试网需替换为对应ID programId: new PublicKey('675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8'), tokenProgramId: TOKEN_PROGRAM_ID, }); return poolKeys; }
获取Pool Info
拿到poolKeys后,需要获取池子的当前状态信息(储备金、手续费等),用于计算兑换产出:
async function fetchPoolInfo(poolKeys) { const poolAccountData = await connection.getAccountInfo(poolKeys.id); const poolInfo = Liquidity.getPoolInfo(poolAccountData.data); return poolInfo; }
计算预兑换产出(amountOut)
结合上述数据,调用Liquidity.computeAmountOut计算预计产出,注意传入的金额需为代币最小单位(比如1 SOL对应1e9个最小单位):
async function calculateAmountOut(inputAmount, slippageRate) { const poolKeys = await fetchPoolKeys(); const poolInfo = await fetchPoolInfo(poolKeys); // 定义输入输出代币(需对应正确的小数位数) const inputToken = new Token(solMint, 9); const outputToken = new Token(usdcMint, 6); const calculationResult = Liquidity.computeAmountOut({ poolKeys, poolInfo, amountIn: inputAmount, currencyIn: inputToken, currencyOut: outputToken, slippage: slippageRate, // 滑点比例,比如0.01代表1% }); return calculationResult.amountOut; } // 调用示例:计算兑换1 SOL(1e9最小单位)、滑点1%时的USDC产出 calculateAmountOut(1e9, 0.01) .then(output => console.log(`预计获得USDC:${output / 1e6}`)) .catch(error => console.error('计算失败:', error));
关键注意事项
- 确保使用的Raydium SDK版本为最新稳定版,避免接口兼容问题
- 测试环境需替换对应的程序ID和节点连接地址
- 所有金额参数必须转换为代币的最小单位(根据代币decimals计算)
- 若获取poolKeys失败,需检查代币对是否在Raydium上存在流动性池
内容的提问来源于stack exchange,提问作者forexmp45
相关产品推荐
相关产品推荐

