Program Token Solana mendukung delegasi—memberikan izin kepada akun lain untuk mentransfer token dari token account Anda hingga batas yang ditentukan. Ini memungkinkan kasus penggunaan seperti pembayaran otomatis, layanan escrow, dan pemrosesan pembayaran pihak ketiga tanpa melepaskan kepemilikan dana Anda.
Cara kerja delegasi
Ketika Anda menyetujui delegasi, Anda mengotorisasi akun tertentu untuk mentransfer token atas nama Anda:
- Pemilik tetap memegang kendali: Anda masih memiliki token dan dapat mentransfer atau mencabut kapan saja
- Pengeluaran terbatas: Delegasi hanya dapat mentransfer hingga jumlah yang disetujui
- Satu delegasi per akun: Setiap token account hanya dapat memiliki satu delegasi aktif
- Persetujuan baru menggantikan yang lama: Menyetujui delegasi baru secara otomatis mencabut yang sebelumnya
Delegasi bersifat non-custodial. Delegasi dapat menggunakan token hingga batas yang ditentukan, tetapi tidak dapat mengakses atau menguras akun melebihi jumlah yang disetujui. Pemilik dapat mencabut kapan saja.
Kasus penggunaan bisnis
| Kasus penggunaan | Bagaimana delegasi membantu |
|---|---|
| Pemroses pembayaran | Merchant memberikan izin kepada pemroses untuk menyelesaikan transaksi |
| Payroll otomatis | Treasury menyetujui layanan payroll untuk mencairkan gaji |
| Layanan escrow | Pembeli mendelegasikan kepada agen escrow untuk pelepasan bersyarat |
| Platform trading | Pengguna menyetujui exchange untuk mengeksekusi trading atas nama mereka |
| Penerbitan kartu | Pengguna menyetujui penerbit kartu untuk menagih pembelian ke token account mereka |
Menyetujui delegasi
Berikan izin kepada akun lain untuk membelanjakan token dari akun Anda:
import { getApproveCheckedInstruction } from "@solana-program/token";// Approve delegate to spend up to 1,000 USDC (6 decimals)const approveInstruction = getApproveCheckedInstruction({source: tokenAccountAddress, // Your token accountmint: usdcMintAddress, // USDC mintdelegate: delegateAddress, // Account receiving permissionowner: ownerKeypair, // You (must sign)amount: 1_000_000_000n, // 1,000 USDC in base unitsdecimals: 6});
Parameter:
source: Token account yang memberikan izindelegate: Akun yang akan memiliki izin pembelanjaanowner: Pemilik token account saat ini (harus menandatangani transaksi)amount: Jumlah maksimum token yang dapat ditransfer oleh delegasidecimals: Desimal token untuk validasi (mencegah kesalahan desimal)
Mencabut delegasi
Hapus semua izin pembelanjaan dari delegasi saat ini:
import { getRevokeInstruction } from "@solana-program/token";const revokeInstruction = getRevokeInstruction({source: tokenAccountAddress, // Your token accountowner: ownerKeypair // You (must sign)});
Revoke menghapus semua izin delegasi—tidak ada pencabutan sebagian. Jika Anda perlu mengurangi batas, setujui delegasi yang sama dengan jumlah yang lebih rendah.
Memeriksa status delegasi
Query token account untuk melihat delegasi saat ini dan sisa allowance:
import { fetchToken } from "@solana-program/token";const tokenAccount = await fetchToken(rpc, tokenAccountAddress);if (tokenAccount.data.delegate) {console.log("Delegate:", tokenAccount.data.delegate);console.log("Remaining allowance:", tokenAccount.data.delegatedAmount);} else {console.log("No delegate set");}
Transfer sebagai delegasi
Saat bertindak sebagai delegasi, gunakan transfer standar tetapi tandatangani dengan keypair delegasi, bukan pemilik:
import { getTransferCheckedInstruction } from "@solana-program/token";const transferInstruction = getTransferCheckedInstruction({source: ownerTokenAccount, // The account you have permission to spend frommint: usdcMintAddress,destination: recipientTokenAccount,authority: delegateKeypair, // You (the delegate) sign, not the owneramount: 100_000_000n, // 100 USDCdecimals: 6});
Transfer akan berhasil jika:
- Akun sumber memiliki saldo yang cukup
- Delegasi menandatangani transaksi
Setiap transfer mengurangi sisa alokasi. Ketika alokasi mencapai nol, delegasi tidak dapat lagi mentransfer token.
Pertimbangan keamanan
Untuk pemilik akun:
- Hanya setujui delegasi yang terpercaya
- Tetapkan batas pengeluaran minimum yang diperlukan
- Cabut delegasi ketika tidak lagi diperlukan
- Pantau akun Anda untuk transfer yang tidak terduga
Untuk penyedia layanan (delegasi):
- Komunikasikan dengan jelas batas pengeluaran yang diminta kepada pengguna
- Terapkan manajemen kunci yang tepat untuk akun delegasi Anda
- Lacak konsumsi alokasi untuk meminta persetujuan ulang sebelum batas habis
Delegasi vs. kustodian
| Aspek | Delegasi | Kustodian penuh |
|---|---|---|
| Kepemilikan token | Pengguna tetap memiliki | Pengguna mentransfer ke kustodian |
| Kontrol pengeluaran | Dibatasi pada jumlah yang disetujui | Akses penuh ke dana yang ditransfer |
| Pencabutan | Instan, oleh pemilik | Memerlukan kerja sama kustodian |
| Eksposur risiko | Terbatas pada jumlah yang disetujui | Seluruh saldo |
| Kepercayaan yang diperlukan | Terbatas | Tinggi |
Delegasi menyediakan jalan tengah—memungkinkan pembayaran otomatis sambil membatasi eksposur risiko pada jumlah yang disetujui.
Sumber daya terkait
- Approve Delegate — Detail teknis tentang instruksi approve
Is this page helpful?