关于 meteora
meteora 是面向应用开发者的 Solana DeFi 基础设施与 SDK 指南,涵盖流动性市场、代币发行、金库及相关仓位和费用操作。
主要功能
- 01使用 DLMM 集中流动性池
- 02创建和管理 DAMM 池
- 03构建可定制的绑定曲线发行
- 04操作动态金库
- 05管理仓位、费用和奖励
适用场景
- 01构建 Solana 流动性应用
- 02发行并自动迁移至 AMM 的代币
- 03管理集中流动性仓位
- 04集成基于金库的收益策略
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sendaifun/ skills --skill meteora安装后在 Claude Code 中输入/meteora确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
docs/fee-structures.mdmigration-guide.mdstrategy-guide.mdtroubleshooting.mdexamples/alpha-vault/participation.tsexamples/bonding-curve/create-token.tsgraduation.tstrade.tsexamples/damm-v1/basic-operations.tsexamples/damm-v2/create-pool.tsmanage-position.tsswap.tsexamples/dlmm/add-liquidity.tsclaim-fees.tsswap.tsexamples/stake-for-fee/staking.tsexamples/vault/deposit-withdraw.tsexamples/zap/zap-operations.tsresources/alpha-vault-reference.mdbonding-curve-reference.mddamm-v1-api-reference.mddamm-v2-api-reference.mddlmm-api-reference.mdgithub-repos.mdm3m3-api-reference.mdpool-farms-reference.mdprogram-addresses.mdvault-api-reference.mdzap-api-reference.mdtemplates/liquidity-manager.ts详细介绍
Meteora Protocol 开发指南
使用 Meteora 的一系列 SDK 在 Solana 上构建 DeFi 应用的综合指南——Meteora 是 Solana 领先的流动性基础设施。
什么是 Meteora?
Meteora 是 Solana 首屈一指的流动性层,为连接流动性提供者(LP)、代币发行方和交易者的基础设施提供支持。它提供:
- 超过 20 亿美元的总锁仓价值,覆盖所有协议
- 多种 AMM 类型——DLMM(集中式)、DAMM v2/v1(恒定乘积)
- 代币发行基础设施——动态联合曲线、Alpha Vault 反机器人保护
- 收益优化——动态金库、质押赚取手续费(M3M3)
- 开发者工具——TypeScript/Go SDK、CLI 工具、支持单代币入场的 Zap
为什么使用 Meteora?
| 功能 | 优势 |
|---|---|
| 低廉的池创建成本 | 0.022 SOL(而竞品为 0.25+ SOL) |
| 动态手续费 | 根据波动率调整手续费,最大化 LP 回报 |
| 防狙击保护 | 手续费调度器和 Alpha Vault 可防止机器人利用漏洞 |
| 支持 Token-2022 | 完全兼容 Token Extensions |
| 无需许可 | 无需审批即可创建池、农场和发行项目 |
| 自动毕业 | 联合曲线会自动迁移至 AMM 池 |
概述
Meteora 在 Solana 上提供完整的 DeFi 基础设施栈:
- DLMM(动态流动性做市商):提供动态手续费的集中流动性
- DAMM v2(动态 AMM):新一代恒定乘积 AMM,支持头寸 NFT
- DAMM v1(旧版 AMM):原始恒定乘积 AMM,支持稳定池和加权池
- 动态联合曲线:可自定义代币发行曲线,并支持自动毕业
- 动态金库:针对收益优化的代币金库
- Alpha Vault:为代币发行提供反机器人保护
- 质押赚取手续费(M3M3):通过交易手续费获得质押奖励
- Zap SDK:通过单一代币进入或退出流动性头寸
- 预售金库 (Beta):代币预售基础设施
快速开始
安装
# DLMM SDK - Concentrated liquidity
npm install @meteora-ag/dlmm @coral-xyz/anchor @solana/web3.js
# DAMM v2 SDK - Next-gen constant product AMM
npm install @meteora-ag/cp-amm-sdk @solana/web3.js
# DAMM v1 SDK - Legacy AMM (stable pools, weighted pools)
npm install @meteora-ag/dynamic-amm @solana/web3.js @coral-xyz/anchor
# Dynamic Bonding Curve SDK - Token launches
npm install @meteora-ag/dynamic-bonding-curve-sdk
# Vault SDK - Yield optimization
npm install @meteora-ag/vault-sdk @coral-xyz/anchor @solana/web3.js @solana/spl-token
# Alpha Vault SDK - Anti-bot protection
npm install @meteora-ag/alpha-vault
# Stake-for-Fee (M3M3) SDK - Fee staking
npm install @meteora-ag/m3m3 @coral-xyz/anchor @solana/web3.js @solana/spl-token
# Zap SDK - Single-token entry/exit (requires Jupiter API key)
npm install @meteora-ag/zap-sdk
# Pool Farms SDK - Farm creation and staking
npm install @meteora-ag/farming
程序地址
| 程序 | 主网/开发网地址 |
|---|---|
| DLMM | LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo |
| DAMM v2 | cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG |
| DAMM v1 | Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB |
| 动态联合曲线 | dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN |
| 动态金库 | 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi |
| 质押赚取手续费 | FEESngU3neckdwib9X3KWqdL7Mjmqk9XNp3uh5JbP4KP |
| Zap | zapvX9M3uf5pvy4wRPAbQgdQsM1xmuiFnkfHKPvwMiz |
DLMM SDK(动态流动性做市商)
DLMM SDK 提供对 Meteora 集中流动性协议的程序化访问,该协议会根据波动率动态调整手续费。
基本设置
import { Connection, PublicKey, Keypair } from '@solana/web3.js';
import DLMM from '@meteora-ag/dlmm';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const poolAddress = new PublicKey('POOL_ADDRESS');
// Create DLMM instance for existing pool
const dlmm = await DLMM.create(connection, poolAddress);
// Create multiple pools
const dlmmPools = await DLMM.createMultiple(connection, [pool1, pool2, pool3]);
核心操作
获取活跃 Bin(当前价格)
const activeBin = await dlmm.getActiveBin();
console.log('Active Bin ID:', activeBin.binId);
console.log('Price:', activeBin.price);
console.log('X Amount:', activeBin.xAmount.toString());
console.log('Y Amount:', activeBin.yAmount.toString());
价格与 Bin 转换
// Get price from bin ID
const price = dlmm.getPriceOfBinByBinId(binId);
// Get bin ID from price
const binId = dlmm.getBinIdFromPrice(price, true); // true = round down
// Convert to/from lamport representation
const lamportPrice = dlmm.toPricePerLamport(21.23);
const realPrice = dlmm.fromPricePerLamport(lamportPrice);
// Get bins in a range
const bins = await dlmm.getBinsBetweenLowerAndUpperBound(minBinId, maxBinId);
// Get bins around active bin
const surroundingBins = await dlmm.getBinsAroundActiveBin(10); // 10 bins each side
兑换操作
import { BN } from '@coral-xyz/anchor';
// Get swap quote
const swapAmount = new BN(1_000_000); // 1 USDC (6 decimals)
const swapForY = true; // Swap X for Y
const slippageBps = 100; // 1% slippage
const binArrays = await dlmm.getBinArrayForSwap(swapForY);
const swapQuote = dlmm.swapQuote(swapAmount, swapForY, slippageBps, binArrays);
console.log('Amount In:', swapQuote.consumedInAmount.toString());
console.log('Amount Out:', swapQuote.outAmount.toString());
console.log('Min Amount Out:', swapQuote.minOutAmount.toString());
console.log('Price Impact:', swapQuote.priceImpact);
console.log('Fee:', swapQuote.fee.toString());
// Execute swap
const swapTx = await dlmm.swap({
inToken: tokenXMint,
outToken: tokenYMint,
inAmount: swapAmount,
minOutAmount: swapQuote.minOutAmount,
lbPair: dlmm.pubkey,
user: wallet.publicKey,
binArraysPubkey: swapQuote.binArraysPubkey,
});
const txHash = await sendAndConfirmTransaction(connection, swapTx, [wallet]);
流动性管理
import { StrategyType } from '@meteora-ag/dlmm';
// Get user positions
const positions = await dlmm.getPositionsByUserAndLbPair(wallet.publicKey);
// Initialize position and add liquidity with strategy
const newPositionTx = await dlmm.initializePositionAndAddLiquidityByStrategy({
positionPubKey: newPositionKeypair.publicKey,
user: wallet.publicKey,
totalXAmount: new BN(100_000_000), // 100 tokens
totalYAmount: new BN(100_000_000),
strategy: {
maxBinId: activeBin.binId + 10,
minBinId: activeBin.binId - 10,
strategyType: StrategyType.SpotBalanced,
},
});
// Add liquidity to existing position
const addLiquidityTx = await dlmm.addLiquidityByStrategy({
positionPubKey: existingPosition.publicKey,
user: wallet.publicKey,
totalXAmount: new BN(50_000_000),
totalYAmount: new BN(50_000_000),
strategy: {
maxBinId: activeBin.binId + 5,
minBinId: activeBin.binId - 5,
strategyType: StrategyType.SpotBalanced,
},
});
// Remove liquidity
const removeLiquidityTx = await dlmm.removeLiquidity({
position: position.publicKey,
user: wallet.publicKey,
binIds: position.positionData.positionBinData.map(b => b.binId),
bps: new BN(10000), // 100% (basis points)
shouldClaimAndClose: true,
});
领取手续费和奖励
// Get claimable fees
const claimableFees = await DLMM.getClaimableSwapFee(connection, position.publicKey);
console.log('Claimable Fee X:', claimableFees.feeX.toString());
console.log('Claimable Fee Y:', claimableFees.feeY.toString());
// Get claimable LM rewards
const claimableRewards = await DLMM.getClaimableLMReward(connection, position.publicKey);
// Claim swap fees
const claimFeeTx = await dlmm.claimSwapFee({
owner: wallet.publicKey,
position: position.publicKey,
});
// Claim all fees from multiple positions
const claimAllFeesTx = await dlmm.claimAllSwapFee({
owner: wallet.publicKey,
positions: positions.map(p => p.publicKey),
});
// Claim LM rewards
const claimRewardTx = await dlmm.claimLMReward({
owner: wallet.publicKey,
position: position.publicKey,
});
// Claim all rewards
const claimAllTx = await dlmm.claimAllRewards({
owner: wallet.publicKey,
positions: positions.map(p => p.publicKey),
});
头寸策略
import { StrategyType } from '@meteora-ag/dlmm';
// Available strategies
StrategyType.SpotOneSide // Single-sided liquidity at current price
StrategyType.CurveOneSide // Curve distribution on one side
StrategyType.BidAskOneSide // Bid/ask distribution on one side
StrategyType.SpotBalanced // Balanced around current price
StrategyType.CurveBalanced // Curve distribution around current price
StrategyType.BidAskBalanced // Bid/ask distribution around current price
StrategyType.SpotImBalanced // Imbalanced spot distribution
StrategyType.CurveImBalanced // Imbalanced curve distribution
StrategyType.BidAskImBalanced // Imbalanced bid/ask distribution
DAMM v2 SDK(CP-AMM)
DAMM v2 SDK 为 Meteora 新一代恒定乘积 AMM 提供全面的接口,相比 V1 有显著改进。
DAMM v2 主要特性(2025 年新增)
| 功能 | 描述 |
|---|---|
| 动态手续费 | 可选的手续费调度器,带有防狙击机制 |
| 头寸 NFT | LP 会获得可转让的 NFT,而不是 LP 代币 |
| 支持 Token2022 | 完全支持 Token Extensions 标准 |
| 锁定流动性 | 内置流动性锁定选项 |
| 无需许可的农场 | 无需协议审批即可创建农场 |
| 更低成本 | 创建池仅需 0.022 SOL(而旧版 DLMM 需要 0.25 SOL) |
手续费调度器(防狙击)
手续费调度器会先收取较高的兑换手续费,再随时间推移逐渐降低,从而防止狙击:
// Create pool with fee scheduler
const createPoolTx = await cpAmm.createCustomPool({
// ... other params
poolFees: {
baseFee: {
cliffFeeNumerator: new BN(10000000), // 1% initial fee
numberOfPeriod: 10,
reductionFactor: new BN(500000), // Reduce by 0.05% each period
periodFrequency: new BN(300), // Every 5 minutes
feeSchedulerMode: 1, // Linear reduction
},
// ...
},
});
基本设置
import { Connection } from '@solana/web3.js';
import { CpAmm } from '@meteora-ag/cp-amm-sdk';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const cpAmm = new CpAmm(connection);
池管理
创建池
// Create standard pool from config
const createPoolTx = await cpAmm.createPool({
creator: wallet.publicKey,
configAddress: configPubkey,
tokenAMint,
tokenBMint,
tokenAAmount: new BN(1_000_000_000),
tokenBAmount: new BN(1_000_000_000),
});
// Create custom pool with specific parameters
const createCustomPoolTx = await cpAmm.createCustomPool({
creator: wallet.publicKey,
tokenAMint,
tokenBMint,
tokenAAmount: new BN(1_000_000_000),
tokenBAmount: new BN(1_000_000_000),
poolFees: {
baseFee: {
cliffFeeNumerator: new BN(2500000), // 0.25%
numberOfPeriod: 0,
reductionFactor: new BN(0),
periodFrequency: new BN(0),
feeSchedulerMode: 0,
},
dynamicFee: null,
protocolFeePercent: 20,
partnerFeePercent: 0,
referralFeePercent: 20,
dynamicFeeConfig: null,
},
hasAlphaVault: false,
activationType: 0, // 0 = slot, 1 = timestamp
activationPoint: null, // null = immediate
collectFeeMode: 0,
});
获取池状态
// Fetch single pool
const poolState = await cpAmm.fetchPoolState(poolAddress);
console.log('Token A Vault:', poolState.tokenAVault.toString());
console.log('Token B Vault:', poolState.tokenBVault.toString());
console.log('Sqrt Price:', poolState.sqrtPrice.toString());
console.log('Liquidity:', poolState.liquidity.toString());
// Fetch all pools
const allPools = await cpAmm.getAllPools();
// Check if pool exists
const exists = await cpAmm.isPoolExist(tokenAMint, tokenBMint);
头寸操作
创建和管理头寸
// Create position
const createPositionTx = await cpAmm.createPosition({
owner: wallet.publicKey,
pool: poolAddress,
});
// Add liquidity
const addLiquidityTx = await cpAmm.addLiquidity({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
tokenAAmountIn: new BN(100_000_000),
tokenBAmountIn: new BN(100_000_000),
liquidityMin: new BN(0),
});
// Get deposit quote
const depositQuote = cpAmm.getDepositQuote({
poolState,
tokenAAmount: new BN(100_000_000),
tokenBAmount: new BN(100_000_000),
slippageBps: 100,
});
// Remove liquidity
const removeLiquidityTx = await cpAmm.removeLiquidity({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
liquidityAmount: new BN(50_000_000),
tokenAAmountMin: new BN(0),
tokenBAmountMin: new BN(0),
});
// Get withdraw quote
const withdrawQuote = cpAmm.getWithdrawQuote({
poolState,
positionState,
liquidityAmount: new BN(50_000_000),
slippageBps: 100,
});
// Merge positions
const mergePositionTx = await cpAmm.mergePosition({
owner: wallet.publicKey,
pool: poolAddress,
sourcePositions: [position1, position2],
destinationPosition: destPosition,
});
// Split position
const splitPositionTx = await cpAmm.splitPosition({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
percentage: 50, // Split 50%
newPosition: newPositionKeypair.publicKey,
});
兑换
import { SwapMode } from '@meteora-ag/cp-amm-sdk';
// Available swap modes
SwapMode.ExactIn // Specify exact input amount
SwapMode.ExactOut // Specify exact output amount
SwapMode.PartialFill // Allow partial fills
// Get swap quote
const quote = cpAmm.getQuote({
poolState,
inputTokenMint: tokenAMint,
outputTokenMint: tokenBMint,
amount: new BN(1_000_000),
slippageBps: 100,
swapMode: SwapMode.ExactIn,
});
console.log('Input Amount:', quote.inputAmount.toString());
console.log('Output Amount:', quote.outputAmount.toString());
console.log('Min Output:', quote.minimumOutputAmount.toString());
console.log('Price Impact:', quote.priceImpact);
console.log('Fee:', quote.fee.toString());
// Execute swap
const swapTx = await cpAmm.swap({
payer: wallet.publicKey,
pool: poolAddress,
inputTokenMint: tokenAMint,
outputTokenMint: tokenBMint,
amountIn: new BN(1_000_000),
minimumAmountOut: quote.minimumOutputAmount,
referralAccount: null,
});
费用与奖励管理
// Claim position fees
const claimFeeTx = await cpAmm.claimPositionFee({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
});
// Initialize reward (pool creator only)
const initRewardTx = await cpAmm.initializeReward({
pool: poolAddress,
rewardMint,
rewardDuration: new BN(86400 * 7), // 7 days
funder: wallet.publicKey,
});
// Fund reward
const fundRewardTx = await cpAmm.fundReward({
pool: poolAddress,
rewardMint,
amount: new BN(1_000_000_000),
funder: wallet.publicKey,
});
// Claim rewards
const claimRewardTx = await cpAmm.claimReward({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
rewardIndex: 0,
});
仓位锁定与归属
// Lock position with vesting schedule
const lockPositionTx = await cpAmm.lockPosition({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
vestingDuration: new BN(86400 * 30), // 30 days
cliffDuration: new BN(86400 * 7), // 7 day cliff
});
// Permanent lock (irreversible)
const permanentLockTx = await cpAmm.permanentLockPosition({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
liquidityAmount: new BN(50_000_000), // Amount to permanently lock
});
// Refresh vesting (unlock available tokens)
const refreshVestingTx = await cpAmm.refreshVesting({
owner: wallet.publicKey,
pool: poolAddress,
position: positionAddress,
});
// Check if position is locked
const isLocked = cpAmm.isLockedPosition(positionState);
辅助函数
// Price conversions
const price = cpAmm.getPriceFromSqrtPrice(sqrtPrice, tokenADecimals, tokenBDecimals);
const sqrtPrice = cpAmm.getSqrtPriceFromPrice(price, tokenADecimals, tokenBDecimals);
// Fee conversions
const feeNumerator = cpAmm.bpsToFeeNumerator(25); // 0.25% = 25 bps
const bps = cpAmm.feeNumeratorToBps(feeNumerator);
// Slippage calculations
const minAmount = cpAmm.getAmountWithSlippage(amount, slippageBps, false);
const maxAmount = cpAmm.getMaxAmountWithSlippage(amount, slippageBps);
// Get price impact
const priceImpact = cpAmm.getPriceImpact(amountIn, amountOut, currentPrice);
// Get liquidity delta
const liquidityDelta = cpAmm.getLiquidityDelta({
poolState,
tokenAAmount: new BN(100_000_000),
tokenBAmount: new BN(100_000_000),
});
动态联合曲线 SDK
动态联合曲线 SDK 支持构建可自定义的代币发行,并在满足条件后自动升级到 DAMM。
基本设置
import { Connection } from '@solana/web3.js';
import { DynamicBondingCurve } from '@meteora-ag/dynamic-bonding-curve-sdk';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const dbc = new DynamicBondingCurve(connection, 'confirmed');
代币发行流程
DBC 包含 5 个步骤:
- 合作方配置:设置池参数
- 创建池:创建者启动联合曲线
- 交易阶段:用户在曲线上买入/卖出
- 升级:达到阈值后自动迁移到 DAMM v1 或 v2
- 升级后:在升级后的 AMM 上交易
使用联合曲线创建池
// Create a new bonding curve pool
const createPoolTx = await dbc.createPool({
creator: wallet.publicKey,
baseMint: baseTokenMint,
quoteMint: quoteTokenMint, // Usually SOL or USDC
config: configAddress,
baseAmount: new BN(1_000_000_000_000), // Total supply
quoteAmount: new BN(0), // Initial quote (usually 0)
name: 'My Token',
symbol: 'MTK',
uri: 'https://arweave.net/metadata.json',
});
在联合曲线上交易
// Get quote for buying tokens
const buyQuote = await dbc.getBuyQuote({
pool: poolAddress,
quoteAmount: new BN(1_000_000_000), // 1 SOL
});
console.log('Tokens to receive:', buyQuote.baseAmount.toString());
console.log('Price per token:', buyQuote.price.toString());
// Execute buy
const buyTx = await dbc.buy({
payer: wallet.publicKey,
pool: poolAddress,
quoteAmount: new BN(1_000_000_000),
minBaseAmount: buyQuote.minBaseAmount,
});
// Get quote for selling tokens
const sellQuote = await dbc.getSellQuote({
pool: poolAddress,
baseAmount: new BN(1_000_000), // Tokens to sell
});
// Execute sell
const sellTx = await dbc.sell({
payer: wallet.publicKey,
pool: poolAddress,
baseAmount: new BN(1_000_000),
minQuoteAmount: sellQuote.minQuoteAmount,
});
池升级
// Check graduation status
const poolState = await dbc.fetchPoolState(poolAddress);
const isGraduated = poolState.graduated;
const graduationThreshold = poolState.graduationThreshold;
const currentMarketCap = poolState.currentMarketCap;
// Manual migration to DAMM v2 (if auto-graduation not triggered)
const migrateTx = await dbc.migrateToDAMMV2({
pool: poolAddress,
payer: wallet.publicKey,
});
// For DAMM v1 migration (more steps required)
// 1. Create metadata
const createMetadataTx = await dbc.createMetadata({
pool: poolAddress,
payer: wallet.publicKey,
});
// 2. Execute migration
const migrateToDammV1Tx = await dbc.migrateToDAMMV1({
pool: poolAddress,
payer: wallet.publicKey,
});
// 3. Lock LP tokens (optional)
const lockLpTx = await dbc.lockLpTokens({
pool: poolAddress,
payer: wallet.publicKey,
lockDuration: new BN(86400 * 365), // 1 year
});
// 4. Claim LP tokens after lock expires
const claimLpTx = await dbc.claimLpTokens({
pool: poolAddress,
payer: wallet.publicKey,
});
费用配置选项
DBC 支持多种费用等级配置:
| 等级 | 费用(基点) | 用途 |
|---|---|---|
| 1 | 25 | 标准发行 |
| 2 | 50 | 社区代币 |
| 3 | 100 | Meme 代币 |
| 4 | 200 | 高波动性 |
| 5 | 400 | 实验性 |
| 6 | 600 | 最高保护 |
动态金库 SDK
金库 SDK 提供收益优化型代币存储,并自动管理策略。
基本设置
import { Connection, PublicKey } from '@solana/web3.js';
import { VaultImpl } from '@meteora-ag/vault-sdk';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const tokenMint = new PublicKey('TOKEN_MINT_ADDRESS');
// Create vault instance
const vault = await VaultImpl.create(connection, tokenMint);
// With affiliate ID (for partner integrations)
const vaultWithAffiliate = await VaultImpl.create(connection, tokenMint, {
affiliateId: new PublicKey('PARTNER_KEY'),
});
金库操作
// Get vault information
const lpSupply = vault.lpSupply; // Or use vault.getVaultSupply() to refresh
const withdrawableAmount = await vault.getWithdrawableAmount();
console.log('Total LP Supply:', lpSupply.toString());
console.log('Locked Amount:', withdrawableAmount.locked.toString());
console.log('Unlocked Amount:', withdrawableAmount.unlocked.toString());
// Get user balance
const userLpBalance = await vault.getUserBalance(wallet.publicKey);
// Deposit tokens
const depositTx = await vault.deposit(wallet.publicKey, new BN(1_000_000_000));
await sendAndConfirmTransaction(connection, depositTx, [wallet]);
// Withdraw tokens
const withdrawTx = await vault.withdraw(wallet.publicKey, new BN(500_000_000));
await sendAndConfirmTransaction(connection, withdrawTx, [wallet]);
份额计算
import { getAmountByShare, getUnmintAmount } from '@meteora-ag/vault-sdk';
// Convert LP tokens to underlying amount
const underlyingAmount = getAmountByShare(
userLpBalance, // User's LP tokens
unlockedAmount, // Vault's unlocked balance
lpSupply // Total LP supply
);
// Calculate LP tokens needed for specific withdrawal
const lpNeeded = getUnmintAmount(
targetWithdrawAmount, // Amount to withdraw
unlockedAmount, // Vault's unlocked balance
lpSupply // Total LP supply
);
联盟集成
// Get affiliate info
const affiliateInfo = await vault.getAffiliateInfo();
console.log('Partner:', affiliateInfo.partner.toString());
console.log('Fee Rate:', affiliateInfo.feeRate);
console.log('Outstanding Fee:', affiliateInfo.outstandingFee.toString());
Alpha 金库 SDK
Alpha 金库 SDK 为代币发行提供反机器人保护,确保公平分配。
基本设置
import { Connection, PublicKey } from '@solana/web3.js';
import { AlphaVault } from '@meteora-ag/alpha-vault';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const vaultAddress = new PublicKey('VAULT_ADDRESS');
const alphaVault = await AlphaVault.create(connection, vaultAddress);
金库操作
// Get vault state
const vaultState = await alphaVault.getVaultState();
console.log('Total Deposited:', vaultState.totalDeposited.toString());
console.log('Max Deposit:', vaultState.maxDeposit.toString());
console.log('Start Time:', vaultState.startTime.toString());
console.log('End Time:', vaultState.endTime.toString());
// Deposit to vault (during deposit window)
const depositTx = await alphaVault.deposit({
payer: wallet.publicKey,
amount: new BN(1_000_000_000), // 1 SOL
});
// Withdraw from vault (if allowed)
const withdrawTx = await alphaVault.withdraw({
payer: wallet.publicKey,
amount: new BN(500_000_000),
});
// Claim tokens (after launch)
const claimTx = await alphaVault.claimTokens({
payer: wallet.publicKey,
});
// Get user allocation
const allocation = await alphaVault.getUserAllocation(wallet.publicKey);
console.log('Deposit Amount:', allocation.depositAmount.toString());
console.log('Token Allocation:', allocation.tokenAllocation.toString());
console.log('Claimed:', allocation.claimed);
质押赚取费用 SDK(M3M3)
M3M3 SDK 支持通过质押代币赚取交易活动产生的费用。
基本设置
import { Connection, PublicKey } from '@solana/web3.js';
import { StakeForFee } from '@meteora-ag/m3m3';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const poolAddress = new PublicKey('POOL_ADDRESS');
const m3m3 = await StakeForFee.create(connection, poolAddress);
质押操作
// Get user stake and claimable balance
const userBalance = await m3m3.getUserStakeAndClaimBalance(wallet.publicKey);
console.log('Staked Amount:', userBalance.stakedAmount.toString());
console.log('Claimable Fees:', userBalance.claimableFees.toString());
// Stake tokens
const stakeTx = await m3m3.stake(new BN(1_000_000_000), wallet.publicKey);
await sendAndConfirmTransaction(connection, stakeTx, [wallet]);
// Claim accumulated fees
const claimTx = await m3m3.claimFee(wallet.publicKey, null); // null = claim all
await sendAndConfirmTransaction(connection, claimTx, [wallet]);
// Initiate unstake (starts lock period)
const unstakeTx = await m3m3.unstake(
new BN(500_000_000),
destinationTokenAccount,
wallet.publicKey
);
// Cancel pending unstake
const cancelUnstakeTx = await m3m3.cancelUnstake(escrowAddress, wallet.publicKey);
// Complete withdrawal (after lock period)
const withdrawTx = await m3m3.withdraw(escrowAddress, wallet.publicKey);
// Get unstake period
const unstakePeriod = m3m3.getUnstakePeriod(); // Duration in seconds
// Refresh states
await m3m3.refreshStates();
DAMM v1 SDK(旧版动态 AMM)
DAMM v1 SDK 是最初的恒定乘积 AMM,至今仍广泛用于稳定池、加权池和 LST 池。虽然新建池推荐使用 DAMM v2,但 v1 仍受全面支持。
基本设置
import { Connection, PublicKey, Keypair } from '@solana/web3.js';
import AmmImpl from '@meteora-ag/dynamic-amm';
const connection = new Connection('https://api.mainnet-beta.solana.com');
// Create pool instance
const pool = await AmmImpl.create(connection, new PublicKey('POOL_ADDRESS'));
// Or create multiple pools
const pools = await AmmImpl.createMultiple(connection, [poolAddress1, poolAddress2]);
创建池
// Create permissionless constant product pool
const createPoolTx = await AmmImpl.createPermissionlessConstantProductPoolWithConfig(
connection,
wallet.publicKey,
tokenAMint,
tokenBMint,
tokenAAmount,
tokenBAmount,
configAddress, // Fee configuration
{
lockLiquidity: false, // Lock initial liquidity
activationPoint: null, // Optional delayed activation
}
);
// Create memecoin pool (optimized for token launches)
const memePoolTx = await AmmImpl.createPermissionlessConstantProductMemecoinPoolWithConfig(
connection,
wallet.publicKey,
tokenAMint,
tokenBMint,
tokenAAmount,
tokenBAmount,
configAddress,
{
lockLiquidity: true, // Lock liquidity for trust
}
);
查询池状态
// Get LP token supply
const lpSupply = await pool.getLpSupply();
// Get user's LP token balance
const userBalance = await pool.getUserBalance(wallet.publicKey);
// Get swap quote
const swapQuote = pool.getSwapQuote(
inputMint,
inputAmount,
slippageBps // 100 = 1%
);
console.log('Output amount:', swapQuote.outAmount.toString());
console.log('Fee:', swapQuote.fee.toString());
console.log('Price impact:', swapQuote.priceImpact);
// Get deposit quote
const depositQuote = pool.getDepositQuote(
tokenAAmount,
tokenBAmount,
true, // balanced deposit
slippageBps
);
console.log('LP tokens to receive:', depositQuote.lpAmount.toString());
// Get withdraw quote
const withdrawQuote = pool.getWithdrawQuote(
lpAmount,
slippageBps
);
console.log('Token A out:', withdrawQuote.tokenAAmount.toString());
console.log('Token B out:', withdrawQuote.tokenBAmount.toString());
// Refresh pool state
await pool.updateState();
流动性操作
// Deposit liquidity
const depositTx = await pool.deposit(
wallet.publicKey,
tokenAAmount,
tokenBAmount,
lpAmountMin // Minimum LP tokens to receive
);
// Withdraw liquidity
const withdrawTx = await pool.withdraw(
wallet.publicKey,
lpAmount,
tokenAMin, // Minimum token A to receive
tokenBMin // Minimum token B to receive
);
兑换
// Execute swap
const swapTx = await pool.swap(
wallet.publicKey,
inputMint,
inputAmount,
minOutputAmount
);
池类型
| 池类型 | 用途 | 特性 |
|---|---|---|
| 恒定乘积 | 通用交易对 | 标准 x*y=k AMM |
| 稳定池 | 稳定币交易对(USDC/USDT) | 降低锚定资产的滑点 |
| 加权池 | 非均衡池(80/20) | 自定义代币权重 |
| LST | 流动性质押代币 | 针对质押衍生品优化 |
Zap SDK
Zap SDK 支持使用单一代币进入和退出流动性仓位,并自动通过 Jupiter 或池内置路由处理兑换。
基本设置
import { Connection, PublicKey } from '@solana/web3.js';
import { Zap } from '@meteora-ag/zap-sdk';
const connection = new Connection('https://api.mainnet-beta.solana.com');
// Jupiter API key is required (get from Jupiter Portal)
const JUPITER_API_URL = 'https://api.jup.ag/swap/v1';
const JUPITER_API_KEY = 'your-api-key';
const zap = new Zap(connection, JUPITER_API_URL, JUPITER_API_KEY);
使用 Zap 进入 DLMM 仓位
// Zap single token into DLMM concentrated liquidity position
const zapInDlmmTx = await zap.zapInDlmm({
user: wallet.publicKey,
lbPairAddress: dlmmPoolAddress,
inputMint: SOL_MINT,
inputAmount: new BN(1_000_000_000), // 1 SOL
slippageBps: 100, // 1%
positionPubkey: positionAddress, // Existing or new position
strategyType: 'SpotBalanced', // Distribution strategy
minBinId: activeBinId - 10,
maxBinId: activeBinId + 10,
});
await sendAndConfirmTransaction(connection, zapInDlmmTx, [wallet]);
使用 Zap 进入 DAMM v2 仓位
// Zap single token into DAMM v2 pool
const zapInDammV2Tx = await zap.zapInDammV2({
user: wallet.publicKey,
poolAddress: dammV2PoolAddress,
inputMint: USDC_MINT,
inputAmount: new BN(100_000_000), // 100 USDC
slippageBps: 100,
positionPubkey: positionAddress,
});
await sendAndConfirmTransaction(connection, zapInDammV2Tx, [wallet]);
Zap 退出操作
// Zap out from DLMM to single token
const zapOutDlmmTx = await zap.zapOutDlmm({
user: wallet.publicKey,
lbPairAddress: dlmmPoolAddress,
outputMint: SOL_MINT, // Receive everything as SOL
positionPubkey: positionAddress,
percentageToZap: 100, // 100% of position
slippageBps: 100,
});
// Zap out from DAMM v2 to single token
const zapOutDammV2Tx = await zap.zapOutDammV2({
user: wallet.publicKey,
poolAddress: dammV2PoolAddress,
outputMint: USDC_MINT,
positionPubkey: positionAddress,
percentageToZap: 50, // 50% of position
slippageBps: 100,
});
通过 Jupiter 使用 Zap
// Get Jupiter quote for optimal routing
const jupiterQuote = await zap.getJupiterQuote({
inputMint: SOL_MINT,
outputMint: USDC_MINT,
amount: new BN(1_000_000_000),
slippageBps: 50,
});
// Zap out through Jupiter aggregator
const zapOutJupiterTx = await zap.zapOutThroughJupiter({
user: wallet.publicKey,
inputMint: tokenMint,
outputMint: SOL_MINT,
jupiterSwapResponse: jupiterQuote,
maxSwapAmount: new BN(1_000_000_000),
percentageToZap: 100,
});
辅助函数
// Get token program from mint
const tokenProgram = await zap.getTokenProgramFromMint(connection, mintAddress);
// Get Jupiter swap instruction
const swapIx = await zap.getJupiterSwapInstruction(jupiterQuote, wallet.publicKey);
池农场 SDK
池农场 SDK 支持在 DAMM v1 池上创建和管理流动性挖矿农场。
基本设置
import { Connection, PublicKey } from '@solana/web3.js';
import { FarmImpl } from '@meteora-ag/farming';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const farmAddress = new PublicKey('FARM_ADDRESS');
const farm = await FarmImpl.create(connection, farmAddress);
农场操作
// Deposit LP tokens to farm
const depositTx = await farm.deposit(
wallet.publicKey,
lpAmount
);
// Withdraw LP tokens from farm
const withdrawTx = await farm.withdraw(
wallet.publicKey,
lpAmount
);
// Claim farming rewards
const claimTx = await farm.claim(wallet.publicKey);
// Get pending rewards
const pendingRewards = await farm.getPendingRewards(wallet.publicKey);
console.log('Pending rewards:', pendingRewards.toString());
// Get user stake info
const stakeInfo = await farm.getUserStakeInfo(wallet.publicKey);
console.log('Staked amount:', stakeInfo.amount.toString());
常见模式
模式 1:使用钱包初始化
import { Connection, Keypair } from '@solana/web3.js';
import { Wallet, AnchorProvider } from '@coral-xyz/anchor';
import DLMM from '@meteora-ag/dlmm';
const connection = new Connection('https://api.mainnet-beta.solana.com');
const keypair = Keypair.fromSecretKey(/* your secret key */);
const wallet = new Wallet(keypair);
const provider = new AnchorProvider(connection, wallet, {
commitment: 'confirmed',
});
// Now use provider.wallet.publicKey for transactions
const dlmm = await DLMM.create(connection, poolAddress);
模式 2:错误处理
try {
const swapTx = await dlmm.swap(swapParams);
const txHash = await sendAndConfirmTransaction(connection, swapTx, [wallet]);
console.log('Success:', txHash);
} catch (error) {
if (error.message.includes('Slippage')) {
console.error('Slippage exceeded - try increasing tolerance');
} else if (error.message.includes('InsufficientFunds')) {
console.error('Not enough balance for this trade');
} else if (error.message.includes('PoolNotFound')) {
console.error('Pool does not exist');
} else {
throw error;
}
}
模式 3:批量操作
import { Transaction } from '@solana/web3.js';
// Combine multiple instructions in one transaction
const transaction = new Transaction();
const claimFeeIx = await dlmm.claimSwapFee({ owner: wallet.publicKey, position: pos1 });
const claimRewardIx = await dlmm.claimLMReward({ owner: wallet.publicKey, position: pos1 });
transaction.add(...claimFeeIx.instructions);
transaction.add(...claimRewardIx.instructions);
const txHash = await sendAndConfirmTransaction(connection, transaction, [wallet]);
模式 4:监控池状态
// Periodically refresh pool state
async function monitorPool(dlmm: DLMM, interval: number = 5000) {
setInterval(async () => {
await dlmm.refetchStates();
const activeBin = await dlmm.getActiveBin();
console.log(`Current price: ${activeBin.price}`);
const feeInfo = dlmm.getFeeInfo();
console.log(`Current fee rate: ${feeInfo.baseFeeRate}%`);
}, interval);
}
新功能(2025-2026)
DLMM 限价单
DLMM 现在支持免手续费的链上限价单:
// Place limit order on DLMM
const limitOrderTx = await dlmm.placeLimitOrder({
user: wallet.publicKey,
binId: targetBinId,
amount: new BN(1_000_000),
side: "buy", // or "sell"
});
自动金库(预计于 2026 年第 1 季度推出)
自动金库会自动复投费用,并通过 API 支持自定义做市策略。这些金库帮助用户以更少的精力获得更多收益。
通用曲线(DBC)
动态联合曲线现在支持可编程的 16 点曲线,让 LP 能够精确控制价格轨迹:
// Create pool with custom curve
const createPoolTx = await dbc.createPoolWithCurve({
creator: wallet.publicKey,
baseMint,
quoteMint,
curvePoints: [
{ price: 0.001, supply: 0 },
{ price: 0.01, supply: 100_000_000 },
{ price: 0.1, supply: 500_000_000 },
// ... up to 16 points
],
});
Presale Vault (Beta)
Presale Vault 是 Meteora 的代币预售基础设施,目前处于 Beta 阶段。它支持项目通过内置保护机制开展预售。
注意: Presale Vault 正在积极开发中。请查看 Meteora 文档了解最新信息。
GitHub 仓库
TypeScript SDK
| 仓库 | 描述 | Stars |
|---|---|---|
| dlmm-sdk | DLMM 集中流动性 SDK | 280+ |
| damm-v2-sdk | DAMM v2 恒定乘积 AMM SDK | 44+ |
| damm-v1-sdk | 旧版 DAMM v1 SDK | 126+ |
| dynamic-bonding-curve-sdk | 代币发行绑定曲线 | 35+ |
| zap-sdk | 单代币进入/退出 | 2+ |
| vault-sdk | 动态金库 SDK | - |
| alpha-vault-sdk | 防机器人发行保护 | - |
| m3m3 | 质押换手续费 SDK | - |
Go SDK
| 仓库 | 描述 |
|---|---|
| damm-v2-go | DAMM v2 Go 实现 |
| dbc-go | Dynamic Bonding Curve Go SDK |
核心程序(Rust)
| 仓库 | 描述 | Stars |
|---|---|---|
| damm-v2 | DAMM v2 程序 | 98+ |
| dynamic-bonding-curve | DBC 程序 | 86+ |
| zap-program | Zap 链上程序 | - |
Meteora Invent(CLI 工具)
Metsumi 是 Meteora 的 CLI 工具,可通过最少的配置发行代币并执行链上操作。
安装
# Prerequisites: Node.js ≥ 18.0.0, pnpm ≥ 10.0.0
git clone https://github.com/MeteoraAg/meteora-invent.git
cd meteora-invent
npm install -g pnpm
pnpm install
可用命令
DLMM 操作
# Create permissionless pool
pnpm dlmm-create-pool
# Seed liquidity
pnpm dlmm-seed-liquidity-lfg
pnpm dlmm-seed-liquidity-single-bin
# Control pool trading
pnpm dlmm-set-pool-status
DAMM v2 操作
# Create pools
pnpm damm-v2-create-balanced-pool
pnpm damm-v2-create-one-sided-pool
# Manage liquidity
pnpm damm-v2-add-liquidity
pnpm damm-v2-remove-liquidity
pnpm damm-v2-split-position
# Claim fees
pnpm damm-v2-claim-position-fee
Dynamic Bonding Curve 操作
# Create bonding curve
pnpm dbc-create-config
pnpm dbc-create-pool
# Trade on curve
pnpm dbc-swap
# Graduate to AMM
pnpm dbc-migrate-to-damm-v1
pnpm dbc-migrate-to-damm-v2
金库操作
# Alpha Vault for anti-bot launches
pnpm alpha-vault-create
# Presale Vault (beta)
pnpm presale-vault-create
配置文件
配置存储在 studio/config/ 中:
dlmm_config.jsonc- DLMM 池设置damm_v1_config.jsonc- DAMM v1 设置damm_v2_config.jsonc- DAMM v2 设置dbc_config.jsonc- 绑定曲线设置alpha_vault_config.jsonc- Alpha vault 设置
资源
技能结构
meteora/
├── SKILL.md # This file
├── resources/
│ ├── dlmm-api-reference.md # DLMM SDK complete API
│ ├── damm-v2-api-reference.md # DAMM v2 SDK complete API
│ ├── damm-v1-api-reference.md # DAMM v1 SDK complete API
│ ├── zap-api-reference.md # Zap SDK API reference
│ ├── pool-farms-reference.md # Pool Farms SDK reference
│ ├── bonding-curve-reference.md # DBC SDK reference
│ ├── vault-api-reference.md # Vault SDK reference
│ ├── alpha-vault-reference.md # Alpha Vault SDK reference
│ ├── m3m3-api-reference.md # Stake-for-Fee SDK reference
│ ├── github-repos.md # All GitHub repositories
│ └── program-addresses.md # All program addresses
├── examples/
│ ├── dlmm/
│ │ ├── swap.ts # Basic swap example
│ │ ├── add-liquidity.ts # Adding liquidity
│ │ └── claim-fees.ts # Claiming fees/rewards
│ ├── damm-v2/
│ │ ├── create-pool.ts # Pool creation
│ │ ├── swap.ts # Swapping tokens
│ │ └── manage-position.ts # Position management
│ ├── damm-v1/
│ │ └── basic-operations.ts # DAMM v1 pool operations
│ ├── zap/
│ │ └── zap-operations.ts # Zap in/out examples
│ ├── bonding-curve/
│ │ ├── create-token.ts # Launch token on curve
│ │ ├── trade.ts # Buy/sell on curve
│ │ └── graduation.ts # Pool graduation
│ ├── vault/
│ │ └── deposit-withdraw.ts # Vault operations
│ ├── alpha-vault/
│ │ └── participation.ts # Alpha vault participation
│ └── stake-for-fee/
│ └── staking.ts # Staking operations
├── templates/
│ ├── trading-bot.ts # Market making template
│ ├── token-launch.ts # Token launch template
│ └── liquidity-manager.ts # LP management template
└── docs/
├── fee-structures.md # Fee configuration guide
├── migration-guide.md # DBC to DAMM migration
├── strategy-guide.md # Liquidity strategies
└── troubleshooting.md # Common issues