Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Vesting adalah opsional pada peluncuran LaunchLab. Tetapkan vesting_param.total_locked_amount = 0 saat Initialize dan bagian di bawah tidak berlaku. Setelah diaktifkan, jadwal bersifat tetap selama masa hidup launch; cliff dan periode unlock tidak dapat diubah secara retroaktif.

Mengapa vesting

Kurva bonding menjual base_supply_graduation token selama penggalangan dana dan menabur sisa ke pool pasca-graduation. Vesting mengambil irisan tambahan dari pasokan, menguncinya untuk cliff yang dapat dikonfigurasi, kemudian mereleasenya secara linier kepada satu atau lebih penerima — biasanya tim kreator, penasihat, atau mitra platform. Kasus penggunaan praktis:
  • Alokasi tim. Kreator mereservasi, katakanlah, 5% dari pasokan untuk tim pendiri, dikunci selama 6 bulan dan dibuka secara linier selama 12 bulan berikutnya.
  • Alokasi platform. Platform peluncuran menerima irisan dari setiap token yang ditempatkannya, pada jadwal yang sama, melalui CreatePlatformVestingAccount.
  • Hibah penasihat / kontributor. Penerima ganda dengan akun VestingRecord mereka sendiri, masing-masing melacak jumlah yang diklaim mereka secara independen.
Token terkunci tidak pernah memasuki kurva dan bukan bagian dari LP graduation. Mereka tetap dorman di base_vault pool hingga setiap penerima memanggil ClaimVestedToken.

Bentuk jadwal

Vesting untuk peluncuran dijelaskan dengan tiga angka, dicatat sekali pada waktu Initialize: Ketiga nilai ini berada di PoolState.vesting_schedule (struct VestingSchedule) ditambah start_time on-chain, yang program catat sebagai block_time + cliff_period pada saat penggalangan dana berhasil berakhir (ketika kondisi graduation pertama kali terpenuhi).
allocated_share_amount adalah jumlah total yang sudah ditetapkan ke akun VestingRecord melalui CreateVestingAccount / CreatePlatformVestingAccount. Ini tidak boleh pernah melebihi total_locked_amount. Jika kreator over-allocate, panggilan CreateVestingAccount berikutnya dibatalkan dengan InvalidTotalLockedAmount.

Formula unlock linier

Setelah penggalangan dana berakhir, program menghitung jumlah unlock kumulatif untuk setiap VestingRecord sebagai:
Jika unlock_period == 0, seluruh token_share_amount menjadi klaim dalam satu langkah di start_time. Sebaliknya kurva adalah garis lurus dari 0 di start_time ke token_share_amount di start_time + unlock_period, dibatasi pada token_share_amount sesudahnya. Jumlah yang ditransfer pada setiap panggilan ClaimVestedToken adalah delta antara jumlah unlock kumulatif yang baru dihitung ulang dan bidang claimed_amount yang berjalan di rekam.
Klaim sebelum start_time dibatalkan dengan VestingNotStarted. Klaim setelah start_time + unlock_period menyelesaikan sisa penuh.

Tata letak akun

VestingSchedule

Berada inline di PoolState. Lihat accounts.

VestingRecord

Rekam per-penerima. PDA diturunkan sebagai:
Penerima hanya dapat memiliki satu VestingRecord per peluncuran. Mengalokasikan kembali ke penerima yang sama pada peluncuran yang sama dibatalkan karena PDA sudah ada.

Instruksi

CreateVestingAccount

Hanya kreator. Mengalokasikan irisan dari total_locked_amount pool ke penerima baru dengan menginisialisasi PDA VestingRecord segar. Argumen
Akun Prekondisi
  • share_amount > 0.
  • pool_state.vesting_schedule.allocated_share_amount + share_amount <= total_locked_amount.
  • Pubkey beneficiary tidak memiliki VestingRecord yang ada untuk pool ini.
Potkondisi
  • vesting_record diinisialisasi dengan token_share_amount = share_amount, claimed_amount = 0.
  • pool_state.vesting_schedule.allocated_share_amount += share_amount.
Kesalahan umumInvalidTotalLockedAmount, InvalidInput.

CreatePlatformVestingAccount

Varian platform-admin dari CreateVestingAccount. Dompet vesting platform (disimpan di PlatformConfig.platform_vesting_wallet) adalah penerima, dan bagian dibatasi oleh PlatformConfig.platform_vesting_scale. Penandatangan harus sama dengan platform_config.platform_vesting_wallet. Akun lainnya mencerminkan CreateVestingAccount. Gunakan ini ketika platform berkomitmen untuk menerima bagian vesting tetap pada setiap peluncuran yang ditempatkannya.

ClaimVestedToken

Hanya penerima. Mentransfer token yang baru dibuka dari base_vault pool ke ATA penerima. Argumen Tidak ada (program menghitung jumlah klaim dari jadwal). Akun Prekondisi
  • block_time >= pool_state.vesting_schedule.start_time (sebaliknya VestingNotStarted).
  • pool_state.status == PoolStatus::Migrated — graduation harus sudah terjadi. Memanggil sebelum graduation membatalkan.
  • Delta unlock-amount lebih besar dari nol. Panggilan no-op (delta yang dihitung adalah 0) dibatalkan.
Potkondisi
  • vesting_record.claimed_amount maju ke jumlah unlock kumulatif yang baru.
  • delta_amount token base ditransfer ke beneficiary_ata.
Kesalahan umumVestingNotStarted, NoAssetsToCollect, MathOverflow.

Contoh kerja

Peluncuran menetapkan:
  • supply = 1_000_000_000
  • total_locked_amount = 100_000_000 (10% dari pasokan)
  • cliff_period = 180 * 86400 (180 hari)
  • unlock_period = 365 * 86400 (1 tahun linier setelah cliff)
Kreator mengalokasikan dua akun VestingRecord segera setelah Initialize:
  • Penerima A (tim): share_amount = 70_000_000
  • Penerima B (penasihat): share_amount = 30_000_000
allocated_share_amount = 100_000_000, sama dengan total_locked_amount — tidak ada alokasi lebih lanjut yang mungkin. Penggalangan dana selesai pada 2027-01-01T00:00Z. Program menetapkan start_time = 2027-01-01 + 180 hari = 2027-06-30. Pada 2027-09-30 (90 hari setelah start_time), Penerima A memanggil ClaimVestedToken:
Dompet A menerima 17.26M token base. vesting_record.claimed_amount maju ke 17_260_274. Enam bulan kemudian (2028-03-31, 270 hari setelah start_time), A mengklaim lagi:
A menerima 34.52M token lagi. Setelah 2028-06-30 (akhir unlock_period), klaim berikutnya mentransfer ~18.22M yang tersisa dan meninggalkan claimed_amount == token_share_amount.

Kasus tepi

  • Penerima kehilangan kunci mereka. Pubkey di VestingRecord.beneficiary adalah satu-satunya penandatangan yang dapat memanggil ClaimVestedToken. Tidak ada jalan pemulihan. Tetapkan penerima ke multisig jika pemulihan penting.
  • Biaya transfer Token-2022. Jika mint base adalah mint Token-2022 dengan ekstensi transfer-fee, penerima menerima delta_amount − transfer_fee, bukan delta penuh. Vault pool masih mencatat jumlah bruto sebagai ditransfer — perbedaan mengakrual ke akun withheld-fee mint.
  • Pool tidak graduated. Memanggil ClaimVestedToken sebelum graduation membatalkan. Jam vesting mulai hanya ketika penggalangan dana benar-benar selesai; peluncuran yang dibatalkan (yang tidak pernah mengatur start_time) meninggalkan token terkunci tidak dapat dijangkau di vault.
  • Upaya over-allocation. Program memberlakukan allocated_share_amount <= total_locked_amount pada setiap CreateVestingAccount. Sisa (jika ada) dari total_locked_amount yang tidak dialokasikan adalah hilang — token tersebut tetap di vault selamanya setelah peluncuran graduation. Alokasikan jumlah penuh kecuali itu adalah tujuannya.

Penunjuk

Sumber:
  • raydium-launch/programs/launchpad/src/states/vesting.rsVestingRecord.
  • raydium-launch/programs/launchpad/src/states/pool.rsVestingSchedule, VestingParams, is_vesting_started, vesting_end_time.
  • raydium-launch/programs/launchpad/src/instructions/create_vesting_account.rs.
  • raydium-launch/programs/launchpad/src/instructions/claim_vested_token.rs.