Langsung ke konten utama

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
PlatformConfig adalah lapisan overlay tingkat platform yang berada di atas GlobalConfig. Di mana GlobalConfig mendefinisikan aturan-aturan protokol yang berlaku luas (“biaya perdagangan adalah 1%, pasokan harus minimal 10M, hanya dompet ini yang dapat lulus”), PlatformConfig adalah yang digunakan setiap platform peluncuran — pump.fun, UI Raydium sendiri, launchpad pihak ketiga — untuk menambahkan biaya mereka, mengklaim bagian mereka dari LP pasca-kelulusan, membatasi bentuk kurva mana yang dapat dipilih peluncuran mereka, dan menampilkan branding mereka (nama, situs web, gambar) di rantai.

Apa itu

Akun PlatformConfig menguasai empat kepentingan lintas-platform:
  1. Branding — nama, situs web, tautan gambar, semuanya disimpan dalam baris sehingga penjelajah atau agregator apa pun dapat menampilkan platform yang meluncurkan token.
  2. Biaya platform — biaya perdagangan tambahan (fee_rate) di atas trade_fee_rate protokol. Terakumulasi ke platform_fee_wallet platform. Dibatasi pada 100 bps oleh GlobalConfig.max_share_fee_rate.
  3. Pembagian migrasi NFT — tiga bilangan bulat (platform_scale, creator_scale, burn_scale) yang berjumlah RATE_DENOMINATOR_VALUE = 1_000_000 dan mempartisi LP pasca-kelulusan menjadi potongan yang dicetak ke dompet NFT platform, potongan ke dompet NFT kreator, dan potongan yang dibakar (Burn & Earn). Hanya bermakna ketika kelulusan menargetkan CPMM (migrate_type = 1).
  4. Daftar putih parameter kurvaVec<PlatformCurveParam> yang mencantumkan kombinasi (supply, total_base_sell, total_quote_fund_raising, migrate_type, migrate_cpmm_fee_on, vesting_params...) mana yang diizinkan pada platform ini. Jika vektor kosong atau semua entri tidak valid, setiap kombinasi diizinkan; jika tidak, peluncuran harus cocok dengan satu entri tepat.
Derivasi PDA:
const [platformConfigPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("platform_config"),
    platformAdmin.toBuffer(),       // platform's owning pubkey
  ],
  LAUNCHLAB_PROGRAM_ID,
);
(Lihat create_platform_config dalam sumber untuk daftar seed kanonik.)

Tata Letak

// states/platform_config.rs
pub const PLATFORM_CONFIG_SEED: &str = "platform_config";
pub const NAME_SIZE: usize = 64;
pub const WEB_SIZE:  usize = 256;
pub const IMG_SIZE:  usize = 256;
pub const MAX_CREATOR_FEE_RATE: u64 = 5000;       // 50 bps (denominator 1_000_000)
pub const MAX_TRANSFER_FEE_RATE: u16 = 500;       // 5%   (denominator 10_000)
pub const MAX_CURVE_PARAMS: usize = 10;

#[account]
pub struct PlatformConfig {
    pub epoch:                       u64,
    pub platform_fee_wallet:         Pubkey,            // signs ClaimPlatformFee
    pub platform_nft_wallet:         Pubkey,            // receives the platform NFT slice at CPMM graduation
    pub platform_scale:              u64,               // share of LP minted to platform NFT
    pub creator_scale:               u64,               // share of LP minted to creator NFT
    pub burn_scale:                  u64,               // share of LP burned via Burn & Earn
    pub fee_rate:                    u64,               // platform's trade fee (1/1_000_000)
    pub name:                        [u8; 64],          // utf-8 padded with zeros
    pub web:                         [u8; 256],
    pub img:                         [u8; 256],
    pub cpswap_config:               Pubkey,            // CPMM AmmConfig that the post-grad pool will bind to
    pub creator_fee_rate:            u64,               // creator-side fee taken pre-graduation
    pub transfer_fee_extension_auth: Pubkey,            // for Token-2022 launches: who inherits transfer-fee authorities post-graduation
    pub platform_vesting_wallet:     Pubkey,
    pub platform_vesting_scale:      u64,               // platform's slice of total_locked_amount
    pub platform_cp_creator:         Pubkey,            // optional creator-of-record on the post-graduation CPMM pool
    pub padding:                     [u8; 108],
    pub curve_params:                Vec<PlatformCurveParam>, // whitelist of permitted curve shapes
}
platform_scale + creator_scale + burn_scale harus sama dengan 1_000_000 (divalidasi oleh MigrateNftInfo::check). Pembagian umum yang terlihat dalam produksi:
  • (0, 100_000, 900_000) — 90% LP dibakar, 10% ke kreator. Peluncuran yang adil gaya pump standar.
  • (50_000, 100_000, 850_000) — potongan platform kecil (5%), 10% kreator, 85% bakar.
  • (0, 0, 1_000_000) — pembakaran penuh, tanpa pencetakan NFT. Peluncuran “tanpa insider” ketat.

Bidang Branding

name, web, dan img adalah larik byte dalam baris yang diisi dengan nol hingga konstanta ukuran mereka. Untuk membacanya sebagai string, iris hingga \0 pertama:
function readString(bytes: Uint8Array): string {
  const end = bytes.indexOf(0);
  return Buffer.from(end === -1 ? bytes : bytes.subarray(0, end)).toString("utf-8");
}
Konstanta sengaja murah hati (name: 64, web: 256, img: 256) sehingga platform dapat menyertakan metadata yang cukup untuk penjelajah dan agregator tanpa menyentuh penyimpanan di luar rantai. Apa pun yang melebihi ukuran ini kembali pada CreatePlatformConfig dengan InvalidInput.

Mekanika Biaya

Swap pada kurva yang terikat pada PlatformConfig mengenakan tiga biaya berlapis:
trade_fee     = amount_in × global_config.trade_fee_rate    / 1_000_000
platform_fee  = amount_in × platform_config.fee_rate        / 1_000_000
creator_fee   = amount_in × platform_config.creator_fee_rate / 1_000_000

amount_after_fee = amount_in − trade_fee − platform_fee − creator_fee
  • trade_fee terakumulasi ke protocol_fee_owner protokol (diklaim via CollectFee).
  • platform_fee terakumulasi ke vault per-platform (diklaim via ClaimPlatformFee atau ClaimPlatformFeeFromVault; lihat instructions).
  • creator_fee terakumulasi ke vault per-kreator yang dikunci oleh pubkey kreator + quote mint (diklaim via ClaimCreatorFee).
creator_fee_rate dibatasi oleh MAX_CREATOR_FEE_RATE = 5000 (50 bps). fee_rate (biaya platform) dibatasi pada 10000 (100 bps) oleh GlobalConfig.max_share_fee_rate.

Pembagian migrasi NFT (hanya CPMM)

Ketika peluncuran lulus ke CPMM (migrate_type = 1, ditandatangani oleh migrate_to_cpswap_wallet), instruksi migrasi membagi token LP yang dicetak oleh CPMM::InitializeWithPermission tiga cara:
lp_to_platform = lp_total × platform_scale / 1_000_000   → platform_nft_wallet
lp_to_creator  = lp_total × creator_scale  / 1_000_000   → creator NFT (Fee Key)
lp_to_burn     = lp_total × burn_scale     / 1_000_000   → Burn & Earn lock program
Potongan platform dan kreator dibungkus sebagai NFT oleh program LP-Lock (LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE) — pemegang NFT berhak untuk mengklaim biaya CPMM yang terakumulasi tanpa batas tanpa dapat menarik likuiditas yang mendasarinya. Lihat products/launchlab/creator-fees untuk alur Fee Key pasca-kelulusan. Potongan pembakaran dikirim ke program Lock dengan is_burn = true sehingga token LP selamanya tidak dapat diakses — mereka mengamankan lantai harga pool tanpa pernah membayar biaya kembali kepada siapa pun. Ketika migrate_type = 0 (lulus ke AMM v4), bidang pembagian NFT diabaikan dan seluruh LP dikunci / dibakar sesuai dengan alur AMM v4-side terpisah.

Daftar putih parameter kurva

curve_params: Vec<PlatformCurveParam> adalah mekanisme platform untuk membatasi bentuk kurva apa yang dapat dipilih peluncurannya. Jika vektor tidak kosong dan setidaknya satu entri valid, program memberlakukan pada Initialize bahwa parameter peluncuran cocok dengan setidaknya satu entri tepat.
#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct PlatformCurveParam {
    pub epoch:                u64,
    pub index:                u8,           // ordinal within this platform's whitelist
    pub global_config:        Pubkey,       // which GlobalConfig this entry applies to
    pub bonding_curve_param:  BondingCurveParam,
    pub padding:              [u64; 50],
}

#[derive(AnchorSerialize, AnchorDeserialize, Clone)]
pub struct BondingCurveParam {
    pub migrate_type:               u8,    // 0 = AMM v4, 1 = CPMM. u8::MAX = wildcard
    pub migrate_cpmm_fee_on:        u8,    // 0 = quote-only, 1 = both. u8::MAX = wildcard
    pub supply:                     u64,   // 0 = wildcard
    pub total_base_sell:            u64,   // 0 = wildcard
    pub total_quote_fund_raising:   u64,   // 0 = wildcard
    pub total_locked_amount:        u64,   // u64::MAX = wildcard
    pub cliff_period:               u64,   // u64::MAX = wildcard
    pub unlock_period:              u64,   // u64::MAX = wildcard
}
Setiap bidang memiliki nilai sentinal yang berarti wildcard (nilai apa pun cocok): u64::MAX untuk bidang u64, u8::MAX untuk bidang u8, 0 untuk bidang pasokan / jual / penggalangan dana. BondingCurveParam dengan semua sentinal adalah “izinkan apa pun” — setara dengan perilaku daftar putih kosong. Algoritma pencocokan pada Initialize:
  1. Filter curve_params ke entri yang global_config cocok dengan GlobalConfig pilihan peluncuran.
  2. Jika daftar yang disaring kosong, izinkan parameter apa pun (platform tidak memasukkan apa pun ke dalam daftar putih untuk GlobalConfig ini).
  3. Jika setiap entri dalam daftar yang disaring memiliki all_is_invalid() (setiap bidang adalah wildcard), izinkan parameter apa pun.
  4. Sebaliknya, ulangi entri; untuk setiap entri, periksa parameter peluncuran terhadap setiap bidang non-wildcard. Jika semua bidang non-wildcard cocok, terima dan kembali.
  5. Jika tidak ada entri yang cocok, kembali dengan InvalidInput.
Ini memungkinkan platform untuk mengatakan “kami hanya mengizinkan bentuk 1B-pasokan / 800M-dijual / 30k-USDC-kumpulan / tidak-vesting standar” dengan menulis satu entri dengan nilai konkret untuk empat bidang itu dan wildcard di tempat lain. Atau platform yang lebih ketat mungkin menghitung tiga atau empat bentuk diskrit, satu per tingkat peluncuran yang didukung. MAX_CURVE_PARAMS = 10 membatasi ukuran daftar putih.

PlatformGlobalAccess — mengotorisasi platform

Ketika GlobalConfig memiliki requires_platform_auth = 1, setiap Initialize terhadapnya harus menyertakan PlatformGlobalAccess PDA yang membuktikan platform telah diotorisasi sebelumnya:
// states/platform_global_access.rs
pub const PLATFORM_GLOBAL_ACCESS_SEED: &str = "platform_global_access";

#[account]
pub struct PlatformGlobalAccess {
    pub bump:            u8,
    pub global_config:   Pubkey,
    pub platform_config: Pubkey,
    pub padding:         [u64; 8],
}
Seed PDA: [b"platform_global_access", global_config, platform_config]. Admin protokol membuat satu ini per pasang (GlobalConfig, PlatformConfig) melalui CreatePlatformGlobalAccess dan membatalkannya melalui ClosePlatformGlobalAccess. Tanpa akun ini, peluncuran tidak dapat mengikat ke GlobalConfig itu dari platform yang gated.

Jalur baca

const platformConfig = await raydium.launchpad.getPlatformConfig(platformConfigPda);

console.log("Platform:", readString(platformConfig.name));
console.log("Fee rate:", platformConfig.feeRate, "(/1M)");
console.log("NFT split:",
  platformConfig.platformScale,
  platformConfig.creatorScale,
  platformConfig.burnScale,
);
console.log("Curve whitelist size:", platformConfig.curveParams.length);
Untuk UI yang menunjukkan “di mana token ini diluncurkan”, PoolState.platform_config menunjuk langsung ke PlatformConfig asal — ambil sekali dan cache branding-nya.

Jalur pembaruan

InstruksiSiapa menandatanganiApa yang berubah
CreatePlatformConfigadmin platform (sekali waktu)Menginisialisasi akun dengan PlatformParams.
UpdatePlatformConfigadmin platformPengiriman generik yang dikunci dengan param: u8; mengubah satu bidang per panggilan. Bidang branding, tingkat biaya, dompet vesting, dan berbagai dompet semuanya dapat diatur melalui ini.
UpdatePlatformCurveParamadmin platformTambah atau ganti satu entri PlatformCurveParam dengan (global_config, index).
RemovePlatformCurveParamadmin platformHapus satu entri (atur ke all-sentinel = wildcard).
ClaimPlatformFeeplatform_fee_walletSapu biaya platform per-pool dari PoolState.quote_vault.
ClaimPlatformFeeFromVaultplatform_fee_walletSapu vault biaya per-platform (PDA di [platform_config, quote_mint]).
Rotasi dompet (platform_fee_wallet, platform_nft_wallet, platform_vesting_wallet, platform_cp_creator, transfer_fee_extension_auth, cpswap_config) semuanya melalui UpdatePlatformConfig. Baca tabel pengiriman update_platform_config sumber untuk kode param yang tepat.

Jebakan umum

  • Sentinal daftar putih salah atur. BondingCurveParam dengan total_locked_amount = 0 bukan wildcard — cocok dengan peluncuran yang secara eksplisit menolak vesting. Wildcard untuk bidang itu adalah u64::MAX. Perangkap yang sama ada untuk cliff_period dan unlock_period. Gunakan clear() (yang program keluarkan) untuk mengatur sentinal dengan benar.
  • Pembulatan pembagian NFT. Tiga skala harus berjumlah persis 1_000_000. Kesalahan off-by-one di CreatePlatformConfig kembali; off-by-one saat runtime akan mencetak atau membakar satu unit LP ekstra, yang itulah pemeriksaan kesetaraan ketat di sana untuk mencegah.
  • Alokasi ganda vesting platform. Jika platform_vesting_scale > 0, platform harus memanggil CreatePlatformVestingAccount sekali setelah penggalangan dana peluncuran berakhir; jika lupa, bagian itu tetap tidak dialokasikan dan tidak aktif selamanya (anggaran total_locked_amount peluncuran dikonsumsi tetapi platform tidak pernah mengklaim).
  • Ambiguitas platform_cp_creator. Ketika diatur ke Pubkey::default(), kreator peluncuran dicatat sebagai pool_creator pool CPMM pasca-kelulusan; ketika diatur ke kunci nyata, kunci itu dicatat sebagai gantinya. Ini memengaruhi siapa yang dapat memanggil CPMM::CollectCreatorFee nanti. Putuskan saat pembuatan konfigurasi platform model mana yang Anda inginkan.

Penunjuk

Sumber:
  • raydium-launch/programs/launchpad/src/states/platform_config.rsPlatformConfig, PlatformParams, MigrateNftInfo, PlatformCurveParam, BondingCurveParam, is_valid_curve_param.
  • raydium-launch/programs/launchpad/src/states/platform_global_access.rsPlatformGlobalAccess.
  • raydium-launch/programs/launchpad/src/lib.rscreate_platform_config, update_platform_config, update_platform_curve_param, remove_platform_curve_param, create_platform_global_access, close_platform_global_access, claim_platform_fee, claim_platform_fee_from_vault.