Ana içeriğe atla

Genel Bakış

Metis, Jupiter’ın düşük seviyeli takas yönlendirme motorudur. Bir takas işleminin her boyutunu ayrıntılı biçimde kontrol etmeyi mümkün kılar: rota seçimi, talimat oluşturma, öncelik ücretleri, hesaplama birimi limitleri, kayma toleransı ve yayın. Jupiter Ultra’nın aksine Metis, bunları kendiniz yönetmenizi gerektirir — buna karşılık CPI, özel talimatlar veya belirli bir işlem yayın stratejisine ihtiyaç duyan entegrasyonlar için maksimum esneklik sunar. Metis’i şu durumlarda kullanın:
  • Kendi zincir üstü programınızla CPI (Çapraz Program Çağrısı)
  • Takasın etrafında özel talimat oluşturma
  • Öncelik ücretleri, hesaplama birimleri ve kayma toleransı üzerinde tam kontrol
  • Kendi RPC’niz veya Jito yayını
Bunun yerine Ultra’yı şu durumlarda değerlendirin:
  • Kayma toleransını, ücretleri veya yayını yönetmeden uçtan uca yürütme istiyorsanız
  • Yalnızca Ultra aracılığıyla kullanılabilen Gerçek Zamanlı Kayma Tahmincisine (RTSE) ihtiyacınız varsa
Metis Swap API erişimi, düğüm uç noktanızdaki /jup yolu önekiyle OrbitFlare Özel Düğümler üzerinde mevcuttur. Barındırılan Jupiter API için https://api.jup.ag/swap/v1/... adresini x-api-key’inizle kullanın.

Nasıl Çalışır

1

Teklif Alın

En iyi rotayı Metis yönlendirme motorundan almak için giriş mint, çıkış mint, miktar ve kayma toleransıyla GET /swap/v1/quote çağrısı yapın.
2

Takas İşlemi Oluşturun

Teklif yanıtını POST /swap/v1/swap adresine gönderin. API, isteğe bağlı öncelik ücreti tahmini, dinamik hesaplama birimi limitleri ve dinamik kayma toleransıyla imzalanmaya hazır serileştirilmiş bir işlem döndürür.
3

İmzalayın ve Gönderin

Base64 işlemini seri dışı bırakın, cüzdanınızla imzalayın ve connection.sendRawTransaction() veya Jito aracılığıyla yayınlayın.

Adım 1 — Teklif Alın

Uç Nokta: GET /swap/v1/quote

Gerekli Parametreler

ParametreAçıklama
inputMintGiriş tokeninin mint adresi (örn. SOL için So11111111111111111111111111111111111111112)
outputMintÇıkış tokeninin mint adresi (örn. USDC için EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)
amountOndalıklardan önce giriş tokenlerinin ham tam sayı miktarı (SOL için lamport, diğerleri için atom birimi)
slippageBpsBaz puanlarla maksimum kayma toleransı (örn. 50 = %0,5)

Örnek — 1 SOL’u USDC’ye Teklif Et

const quoteResponse = await (
  await fetch(
    "https://api.jup.ag/swap/v1/quote?" +
      "inputMint=So11111111111111111111111111111111111111112" +
      "&outputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" +
      "&amount=100000000" +
      "&slippageBps=50" +
      "&restrictIntermediateTokens=true",
    {
      headers: {
        "x-api-key": "YOUR_API_KEY",
      },
    }
  )
).json();

console.log(JSON.stringify(quoteResponse, null, 2));

Örnek Yanıt

{
  "inputMint": "So11111111111111111111111111111111111111112",
  "inAmount": "100000000",
  "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "outAmount": "16198753",
  "otherAmountThreshold": "16117760",
  "swapMode": "ExactIn",
  "slippageBps": 50,
  "platformFee": null,
  "priceImpactPct": "0",
  "routePlan": [
    {
      "swapInfo": {
        "ammKey": "5BKxfWMbmYBAEWvyPZS9esPducUba9GqyMjtLCfbaqyF",
        "label": "Meteora DLMM",
        "inputMint": "So11111111111111111111111111111111111111112",
        "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "inAmount": "100000000",
        "outAmount": "16198753"
      },
      "percent": 100
    }
  ],
  "contextSlot": 299283763,
  "timeTaken": 0.015257836
}
outAmount, teklif anındaki mümkün olan en iyi çıktıdır. slippageBps bu değeri etkilemez — kabul edeceğiniz minimum olan otherAmountThreshold’u kontrol eder.

Ek Teklif Seçenekleri

Yönlendirmenin yalnızca yüksek likiditeye sahip ara tokenlar üzerinden geçmesini sağlamak için true olarak ayarlayın. Bu, likidite yetersizliğinden kaynaklanan yönlendirme hatalarını azaltır ve fiyata küçük potansiyel maliyet karşılığında rota kararlılığını iyileştirir.
Yönlendirmeyi tek bir piyasayla kısıtlamak için true olarak ayarlayın (çoklu atlama yok). Doğrudan rota yoksa teklif döndürmez. Olumsuz fiyatlar verebilir — dikkatli kullanın.
İç takas talimatlarındaki toplam hesap sayısını sınırlar. Kendi talimatlarınız için yer bırakmanız gerektiğinde kullanışlıdır. Önerilen minimum 64’tür. Çok düşük ayarlamak, daha fazla hesap gerektiren DEX’leri düşürür (örn. Meteora DLMM 47’ye kadar gerektirir).
feeAccount’unuza kredilendirilecek takasa bir ücret ekleyin. Takas isteğinde feeAccount ile birleştirin.

Adım 2 — Takas İşlemi Oluşturun

Uç Nokta: POST /swap/v1/swap Adım 1’den alınan teklif yanıtını kullanıcının genel anahtarıyla birlikte iletin. API, imzalanmaya ve gönderilmeye hazır serileştirilmiş base64 işlemi döndürür.

Yerleşim Optimizasyonlarıyla İşlem Oluşturun

const swapResponse = await (
  await fetch("https://api.jup.ag/swap/v1/swap", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": "YOUR_API_KEY",
    },
    body: JSON.stringify({
      quoteResponse,
      userPublicKey: wallet.publicKey.toString(),

      // İşlem yerleşimi için optimize et
      dynamicComputeUnitLimit: true,
      dynamicSlippage: true,
      prioritizationFeeLamports: {
        priorityLevelWithMaxLamports: {
          maxLamports: 1000000,
          priorityLevel: "veryHigh",
        },
      },
    }),
  })
).json();

Örnek Yanıt

{
  "swapTransaction": "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAGDkS+...",
  "lastValidBlockHeight": 279632475,
  "prioritizationFeeLamports": 9999,
  "computeUnitLimit": 388876,
  "prioritizationType": {
    "computeBudget": {
      "microLamports": 25715,
      "estimatedMicroLamports": 785154
    }
  },
  "dynamicSlippageReport": {
    "slippageBps": 50,
    "otherAmount": 20612318,
    "simulatedIncurredSlippageBps": -18,
    "amplificationRatio": "1.5",
    "categoryName": "lst",
    "heuristicMaxSlippageBps": 100
  },
  "simulationError": null
}

Öncelik Ücreti Seviyeleri

priorityLevelYüzdelikKullanım Senaryosu
medium25.Düşük yoğunluk, zaman açısından kritik olmayan
high50.Standart alım satım koşulları
veryHigh75.Rekabetçi koşullar, MEV, zaman açısından kritik takaslar
Ücret artışları sırasında fazla ödemeyi önlemek için maxLamports’u güvenlik sınırı olarak ayarlayın:
prioritizationFeeLamports: {
  priorityLevelWithMaxLamports: {
    maxLamports: 10000000,
    global: false,        // küresel değil yerel ücret piyasası (yazılabilir hesaplar) kullan
    priorityLevel: "veryHigh",
  },
}

Bunun Yerine Takas Talimatlarını Kullanma

Takası kendi talimatlarınızla oluşturmanız gerekiyorsa /swap/v1/swap yerine /swap/v1/swap-instructions kullanın. Aynı parametreleri alır ancak serileştirilmiş işlem yerine ayrı talimat nesneleri döndürür:
const instructions = await (
  await fetch("https://api.jup.ag/swap/v1/swap-instructions", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": "YOUR_API_KEY",
    },
    body: JSON.stringify({
      quoteResponse,
      userPublicKey: wallet.publicKey.toString(),
    }),
  })
).json();

const {
  computeBudgetInstructions,
  setupInstructions,
  swapInstruction: swapInstructionPayload,
  cleanupInstruction,
  addressLookupTableAddresses,
} = instructions;

Adım 3 — Takas İşlemini Gönderin

Seri Dışı Bırakın, İmzalayın ve Serileştirin

Yanıttaki swapTransaction alanı base64 kodludur. VersionedTransaction olarak seri dışı bırakın, imzalayın, ardından göndermek için tekrar binary’e dönüştürün:
import { VersionedTransaction } from "@solana/web3.js";

const transactionBase64 = swapResponse.swapTransaction;
const transaction = VersionedTransaction.deserialize(
  Buffer.from(transactionBase64, "base64")
);

transaction.sign([wallet]);

const transactionBinary = transaction.serialize();

İşlemi Gönderin

const signature = await connection.sendRawTransaction(transactionBinary, {
  maxRetries: 2,
  skipPreflight: true,
});
SeçenekAçıklama
maxRetriesVazgeçmeden önce maksimum yeniden deneme sayısı. Atlanırsa RPC, blok hash süresi dolana kadar yeniden dener.
skipPreflightGöndermeden önce imza doğrulamasını ve simülasyonu atlayın. Hıza duyarlı takaslar için true önerilir.

İşlemi Onaylayın

const confirmation = await connection.confirmTransaction(
  { signature },
  "finalized"
);

if (confirmation.value.err) {
  throw new Error(
    `Transaction failed: ${JSON.stringify(confirmation.value.err)}\nhttps://solscan.io/tx/${signature}/`
  );
} else {
  console.log(`Transaction successful: https://solscan.io/tx/${signature}/`);
}

Jito Aracılığıyla Yayın

Daha hızlı dahil edilme ve MEV koruması için Jito kullanmak istiyorsanız prioritizationFeeLamports’u Jito bahşişiyle değiştirin ve bir Jito RPC uç noktasına gönderin:
body: JSON.stringify({
  quoteResponse,
  userPublicKey: wallet.publicKey.toString(),
  prioritizationFeeLamports: {
    jitoTipLamports: 1000000, // sabit lamport, sınır değil
  },
}),
Jito bahşişlerinin geçerli olması için Jito RPC uç noktasına gönderilmesi gerekir. Standart RPC’ye göndermek Jito’nun blok motoru üzerinden yönlendirmez.

Gelişmiş

Takas isteğinde dynamicSlippage: true etkinleştirin. Backend işlemi simüle eder ve uygun bir kayma toleransı değerini tahmin etmek için token kategorisine dayalı buluşsal yöntemler uygular.Not: Dinamik Kayma Toleransı geliştirmesi durdurulmuştur. Üretim kullanımı için Jupiter, Gerçek Zamanlı Kayma Tahmincisi (RTSE) içeren Ultra Swap API’sini önermektedir — önemli ölçüde daha doğru ve reaktif bir sistem.
Ocak 2025 itibarıyla CPI aracılığıyla Jupiter Swap, zincir üstü program entegrasyonu için önerilen yöntemdir. Programınıza jupiter-cpi crate’ini ekleyin:
[dependencies]
jupiter-cpi = { git = "https://github.com/jup-ag/jupiter-cpi", rev = "5eb8977" }
Ardından talimat işleyicinizden paylaşılan hesaplar rotasını çağırın. Tam referans uygulama için Jupiter CPI örneğine bakın.
Flash Fill, Sürümlü İşlemleri ve Adres Arama Tablolarını kullanan CPI hesap boyutu sınırlamaları için önceki bir geçici çözümdü. Solana ana ağında Gevşetilmiş CPI kısıtlamaları yayınlandığından bu yana artık önerilmemektedir. Geçmiş referans için sol-swap-flash-fill’e bakın.
maxAccounts kullanırken, DEX başına tahmini hesap sayıları şunlardır (ALT’lar mevcut olduğunda min, olmadığında maks geçerlidir):
DEXMaks. HesapMin. Hesap
Meteora DLMM4719
Meteora4518
Raydium4518
Raydium CLMM4519
Moonshot3715
Raydium CPMM3714
Pumpfun AMM4217
Pumpfun Bonding Curve4016
Orca Whirlpool3012
Obric3012
Solfi229
Sanctum8080
Sanctum Infinity8080
maxAccounts’u çok düşük ayarlamak, DEX’leri sessizce yönlendirmeden düşürür. Mümkün olduğunca yüksek tutun ve yalnızca işleminiz 1232 bayt boyut sınırını aşarsa azaltın.

Gereksinimler ve Kaynaklar

OrbitFlare aracılığıyla Metis Swap API erişimi yalnızca Özel Düğümler üzerinde mevcuttur. API, özel düğüm uç noktanızdaki /jup yolu aracılığıyla veya doğrudan Jupiter API anahtarıyla https://api.jup.ag/swap/v1/... adresinden erişilebilir.