Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
sdk-api/rust-cpi behandelt die Low-Level-Mechanik beim Aufrufen einzelner Raydium-Programme. Diese Seite ist der höherwertige Begleiter: warum Sie Raydium in Ihr eigenes Programm integrieren würden, welches Muster zu Ihrem Use-Case passt, und welche vollständige Infrastruktur Sie benötigen.Wann CPI das richtige Werkzeug ist
Ein benutzerdefiniertes Programm macht Sinn, wenn der Trade atomar mit anderen On-Chain-Zustandsänderungen stattfinden muss, die nur Ihr Programm vornehmen kann. Häufige Fälle:- Escrow- / Limit-Order-Programme — der Benutzer deponiert eine Mint in Ihrem Escrow, Ihr Programm überwacht eine Preisbedingung, und wenn sie ausgelöst wird, tauscht Ihr Programm atomar über Raydium und guthschreibt das Benutzerkonto.
- Aggregator-Proxys — eine einzelne Anweisung, die einen Swap über Raydium und eine oder mehrere andere DEXes leitet, alle Hops unter einer einzigen Slippage-Prüfung, die Ihr Programm besitzt.
- Auto-Compounding-Vaults — LP oder Farm-Stake in Ihrem Vault deponieren, Vault sammelt Rewards nach Zeitplan, versorgt Liquidität neu, gibt Share-Token aus.
- Strategy-Vaults — gehebelte LP-Positionen, die sich durch Swaps über CLMM rebalancieren; Liquidatoren, die Positionen schließen und Sicherheiten in einer Transaktion tauschen.
- Token-Startplattformen mit benutzerdefiniertem Vesting — Ihr Programm hält Vesting-Token und gibt sie nach Zeitplan in einen Raydium-Pool frei.
Kompositionsmuster
Muster 1: Schlanker Proxy
Ihr Programm stellt eine einzelne Anweisung bereit, die eine Richtlinie überprüft (z. B. Whitelisting von Mint-Paaren, Gebührenrabatt für verifizierte Benutzer) und leitet dann an Raydium weiter.Muster 2: Escrow
Ihr Programm besitzt eine PDA, die die Input-Mint des Benutzers hält. Bei Auslösung signiert die PDA einen CPI zu Raydium, um ihren eigenen Saldo zu tauschen.CpiContext::new_with_signer. Siehe Signer Seeds.
Muster 3: Zusammengesetzter Multi-Hop
Ihr Programm gibt mehrere CPIs in einer Anweisung aus und erzwingt eine einzige Slippage-Grenze über alle hinweg. Die Raydium-Swap-Anweisungen haben jeweils ihre eigeneminimum_amount_out, aber Sie setzen diese auf 0 (oder eine sehr lockere Untergrenze) und erzwingen eine strikte endgültige Untergrenze nach dem letzten Hop selbst.
Muster 4: Vault / Strategy
Ihr Programm hält LP-Token oder Farm-Stake in einer PDA. Ein Keeper (oder der Benutzer) ruftcompound() auf, das:
- Rewards aus der Farm sammelt.
- Rewards für Pool-Token tauscht (CPI in CPMM oder CLMM).
- Die Erlöse wieder in den LP einzahlt (ein weiterer CPI).
- Den neuen LP einsetzt (ein weiterer CPI).
Kontolisten-Konstruktion
DieAccounts-Struktur des aufrufenden Programms spiegelt die Kontenreihenfolge des Raydium-Programms wider, aber die meisten Raydium-seitigen Konten sind UncheckedAccount, weil Raydium sie selbst überprüft. Sie fügen nur Einschränkungen auf Konten hinzu, die Sie besitzen:
UncheckedAccount für die Raydium-Seite — ist keine Faulheit. Der Empfänger überprüft die Seinen; Doppelüberprüfung beim Aufrufer verschwendet nur CU und riskiert Synchronisierungsverlust, wenn Raydium ein neues Struct-Layout-Feld ausliefert.
Der CPI-Aufruf selbst
PDA-Signer-Seeds
Der CPI gelingt nur, wenn die alsauthority übergebene PDA mit der Herleitung übereinstimmt, die der Aufrufer beansprucht. Die beiden müssen sich einigen auf:
- Die Seed-Byte-Sequenz (hier
[b"escrow", user.key().as_ref()]). - Der Bump.
- Die aufrufende Programm-ID (Ihr Programm, nicht Raydium).
authority-Signatur die Transaktion abdeckt und dass die Input-ATA dieser Authority gehört. Die Überprüfung erfolgt in anchor_spl::token::transfer: Das Feld authority der ATA muss dem Signer entsprechen.
Häufiger Fehler: user als Authority übergeben (und Übertrag von escrow_input_ata, die der Escrow-PDA gehört). Das SPL-Token-Programm lehnt mit owner mismatch ab. Machen Sie das Feld authority immer zum ATA-Besitzer.
Verbleibende Konten
Mehrere Raydium-Anweisungen verwenden eine Variable-Längenliste von Konten, die nach den festen angehängt werden — verbleibende Konten.- CLMM
SwapV2: 1–8TickArrayState-Konten für die Tick-Arrays, die der Swap durchqueren kann, in Swap-Richtung. - Farm v6
Deposit/Harvest/Withdraw:(reward_vault, user_reward_ata)-Paare, ein Paar pro aktivem Reward-Slot. - Token-2022 Transfer-Hook-Mints: das Transfer-Hook-Programm plus alle Konten, die der Hook benötigt.
Compute-Budget für zusammengesetzte Aufrufe
Ein CPI kostet ~1.500 CU für den Aufruframmen selbst; die eigene CU-Nutzung des Aufgerufs stapelt sich darauf. Ungefähres Budget pro Raydium-CPI:| Aufruf | CU (SPL Token) | CU (Token-2022) |
|---|---|---|
| CPMM swap_base_input | ~150,000 | ~200,000 |
| CLMM swap_v2 (single tick array) | ~180,000 | ~230,000 |
| CLMM swap_v2 (crosses 2 ticks) | ~220,000 | ~270,000 |
| Farm v6 deposit | ~120,000 | ~150,000 |
| Farm v6 harvest (per reward slot) | +30,000 | +40,000 |
| AMM v4 swap_base_in | ~140,000 | n/a |
harvest → swap A → swap B → deposit LP → stake LP ausführt, erreicht leicht 700k CU.
Setzen Sie immer ein explizites ComputeBudgetProgram::set_compute_unit_limit:
Fehlerausbreitung
Raydium-Programme geben Anchor-Fehler mit stabilen Fehlercodes zurück. Ihr aufrufendes Programm sieht sie alsErr(ProgramError::Custom(code)). Leiten Sie sie standardmäßig weiter:
sdk-api/anchor-idl); neue Codes werden am Ende angehängt, bestehende Codes ändern nie ihre Bedeutung.
Vollständiges praktisches Beispiel: Limit-Order-Escrow
Ablauf:open_order— Benutzer hinterlegtamount_invoninput_mintin Escrow-PDA; zeichnet Zielmin_amount_outund Ablauf auf.execute_order— Jeder (Keeper) ruft mit den aktuellen Pool-Konten auf. Programm überprüft das aktuelle Angebot ≥min_amount_out, dann CPI-Raydium-Swap und behält den Output im Escrow.claim— Benutzer zieht die Output-Mint aus dem Escrow.
Tests
Raydium-Programme in einen lokalen Validator für Integrationstests ziehen (ausAnchor.toml):
anchor test ruft sie beim Start von Mainnet ab. Siehe sdk-api/rust-cpi.
Fallstricke spezifisch für Komposition
Reentrancy
Solana hat keine echte Reentrancy — ein CPI kann nicht in der gleichen Invokation in das ursprüngliche Programm zurückrufen. Aber Sie können sich trotzdem selbst in eine logische Reentrancy bauen: ein CPI, das Ihren Zustand liest, dann liest Ihr Code ihn wieder an und nimmt an, der CPI habe ihn nicht geändert. Für Raydium berühren die CPIs Ihren Zustand nicht, daher ist dies weniger ein Problem als z. B. in Flash-Loan-Kontexten. Aber wenn Sie Raydium mit einem Kreditprotokoll zusammensetzen, seien Sie sich bewusst.Kontomutability-Drift
Wenn Ihr Programm ein Konto alsmut übergibt, aber Raydium erwartet es schreibgeschützt (oder umgekehrt), lehnt die Runtime den Aufruf mit InvalidAccountData ab. Prüfen Sie Raydiums Anweisungs-erwartete Mutability immer in der IDL; anchor_cp_swap::cpi::accounts::Swap erzwingt es über seine Feldtypen.
Token-2022-Programmfeld
Input- und Output-Mints können sich unter verschiedenen Token-Programmen befinden — eines SPL Token, eines Token-2022. Der CPI hat getrennte Felderinput_token_program und output_token_program aus diesem Grund. Prüfen Sie immer das Feld owner jeder Mint und leiten Sie das korrekte Programm in jeden Slot.
Versionierte Transaktionen
Eine zusammengesetzte Tx mit 2+ Raydium-CPIs plus ATA-Erstellung passt selten in eine Legacy (v0-ohne-LUT)-Transaktion. Verwenden Sie V0 mit Adressensuchtabellen; rufen Sie Raydiums öffentliche LUTs überraydium.getRaydiumLutAddresses() ab.
Verweise
sdk-api/rust-cpi— Low-Level-CPI-Mechanik.integration-guides/priority-fee-tuning— Compute-Budget-Dimensionierung.products/cpmm/code-demos,products/clmm/code-demos,products/farm-staking/code-demos— Pro-Produkt-CPI-Snippets.

