meteora について
meteoraは、アプリ開発者向けのSolana DeFi基盤とSDKのガイドです。流動性市場、トークン発行、ボルト、ポジションや手数料の操作を扱います。
主な機能
- 01DLMMの集中流動性プールを利用
- 02DAMMプールを作成・管理
- 03カスタマイズ可能なボンディングカーブ発行
- 04ダイナミックボルトを操作
- 05ポジション、手数料、報酬を管理
活用シーン
- 01Solanaの流動性アプリを構築
- 02AMMへ自動移行するトークンを発行
- 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 プロトコル開発ガイド
Solana を代表する流動性インフラである Meteora の SDK スイートを使用して、Solana DeFi アプリケーションを構築するための包括的なガイドです。
Meteora とは?
Meteora は Solana の主要な流動性レイヤーであり、流動性プロバイダー(LP)、トークンローンチ事業者、トレーダーをつなぐインフラを提供しています。以下の機能を備えています。
- プロトコル全体で 20 億ドル以上の TVL
- 複数の AMM タイプ - DLMM(集中流動性)、DAMM v2/v1(定積積)
- トークンローンチインフラ - Dynamic Bonding Curves、Alpha Vault のボット対策
- イールド最適化 - Dynamic Vaults、Stake-for-Fee(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(Dynamic Liquidity Market Maker):動的手数料を備えた集中流動性
- DAMM v2(Dynamic AMM):ポジション NFT を備えた次世代の定積積 AMM
- DAMM v1(Legacy AMM):ステーブル/加重プールを備えた従来の定積積 AMM
- Dynamic Bonding Curve:自動グラデュエーション機能を備えたカスタマイズ可能なトークンローンチカーブ
- Dynamic Vault:イールド最適化されたトークンボルト
- Alpha Vault:トークンローンチ向けのボット対策
- Stake-for-Fee(M3M3):取引手数料から得られるステーキング報酬
- Zap SDK:流動性ポジションへのシングルトークンでの参加/退出
- Presale Vault (ベータ):トークンのプレセールインフラ
クイックスタート
インストール
# 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
プログラムアドレス
| プログラム | Mainnet/Devnet アドレス |
|---|---|
| DLMM | LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo |
| DAMM v2 | cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG |
| DAMM v1 | Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB |
| Dynamic Bonding Curve | dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN |
| Dynamic Vault | 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi |
| Stake-for-Fee | FEESngU3neckdwib9X3KWqdL7Mjmqk9XNp3uh5JbP4KP |
| Zap | zapvX9M3uf5pvy4wRPAbQgdQsM1xmuiFnkfHKPvwMiz |
DLMM SDK(Dynamic Liquidity Market Maker)
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]);
主な操作
アクティブビンの取得(現在価格)
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());
価格とビンの変換
// 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 は、V1 から大幅に改善された、Meteora の次世代定積積 AMM を操作するための包括的なインターフェースを提供します。
DAMM V2 の主な機能(2025 年の新機能)
| 特徴 | 説明 |
|---|---|
| 動的手数料 | オプションのスナイパー対策機能付き手数料スケジューラー |
| ポジション NFT | LP は LP トークンの代わりに譲渡可能な NFT を受け取ります |
| 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),
});
Dynamic Bonding Curve SDK
Dynamic Bonding Curve 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 は複数の手数料ティア設定に対応しています。
| ティア | 手数料(bps) | 用途 |
|---|---|---|
| 1 | 25 | 標準的なローンチ |
| 2 | 50 | コミュニティトークン |
| 3 | 100 | ミームトークン |
| 4 | 200 | 高いボラティリティ |
| 5 | 400 | 実験的な用途 |
| 6 | 600 | 最大限の保護 |
Dynamic Vault SDK
Vault 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'),
});
Vault の操作
// 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 Vault SDK
Alpha Vault 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);
Vault の操作
// 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);
Stake-for-Fee 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(レガシー Dynamic AMM)
DAMM v1 SDK は、安定プール、加重プール、LST プールで現在も広く使用されている、従来の定積型 AMM です。新しいプールには 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);
DLMM ポジションへの Zap 入金
// 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]);
DAMM v2 ポジションへの Zap 入金
// 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);
Pool Farms SDK
Pool Farms 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"
});
Auto Vaults(2026 年第 1 四半期提供予定)
Auto Vaults は手数料を自動で複利運用し、API を通じたカスタムのマーケットメイク戦略に対応します。これらの Vault により、ユーザーは手間をかけずに収益を増やせます。
Universal Curve(DBC)
Dynamic Bonding Curve は、プログラム可能な 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(ベータ)
Presale Vault は Meteora のトークンプレセール基盤で、現在ベータ版です。組み込みの保護メカニズムを備えたプレセールをプロジェクトで実施できます。
Note: Presale Vault は現在開発中です。最新情報はMeteora のドキュメントをご確認ください。
GitHub リポジトリ
TypeScript SDK
| リポジトリ | 説明 | スター数 |
|---|---|---|
| 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 | ダイナミック Vault SDK | - |
| alpha-vault-sdk | ボット対策ローンチ保護 | - |
| m3m3 | ステーク・フォー・フィー SDK | - |
Go SDK
| リポジトリ | 説明 |
|---|---|
| damm-v2-go | DAMM v2 の Go 実装 |
| dbc-go | Dynamic Bonding Curve Go SDK |
コアプログラム(Rust)
| リポジトリ | 説明 | スター数 |
|---|---|---|
| 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
Vault 操作
# 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