Токенові програми Solana підтримують делегування — надання іншому обліковому запису дозволу на переказ токенів з вашого токенового облікового запису до вказаного ліміту. Це дозволяє реалізувати такі сценарії, як автоматизовані платежі, ескроу-сервіси та обробка платежів третіми сторонами без втрати контролю над вашими коштами.
Як працює делегування
Коли ви схвалюєте делегата, ви надаєте певному обліковому запису право переказувати токени від вашого імені:
- Власник зберігає контроль: ви як і раніше володієте токенами і можете переказувати їх або відкликати делегування в будь-який момент
- Обмежене витрачання: делегат може переказати лише до схваленої суми
- Один делегат на обліковий запис: кожен токеновий обліковий запис може мати лише одного активного делегата
- Нове схвалення замінює попереднє: схвалення нового делегата автоматично відкликає попереднього
Делегування є некастодіальним. Делегат може витрачати токени до встановленого ліміту, але не може отримати доступ до облікового запису або вивести кошти понад схвалену суму. Власник може відкликати делегування в будь-який момент.
Бізнес-сценарії використання
| Сценарій використання | Як допомагає делегування |
|---|---|
| Платіжні процесори | Продавець надає процесору дозвіл на проведення транзакцій |
| Автоматизована зарплата | Казначейство схвалює зарплатний сервіс для виплати заробітних плат |
| Ескроу-сервіси | Покупець делегує ескроу-агенту право на умовне вивільнення коштів |
| Торгові платформи | Користувач схвалює біржу для виконання угод від його імені |
| Випуск карток | Користувач схвалює емітента картки для списання покупок з його токенового облікового запису |
Схвалення делегата
Надайте іншому обліковому запису дозвіл витрачати токени з вашого облікового запису:
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});
Параметри:
source: обліковий запис токенів, який надає дозвілdelegate: обліковий запис, який отримає дозвіл на витрачанняowner: поточний власник облікового запису токенів (має підписати транзакцію)amount: максимальна кількість токенів, яку делегат може переказатиdecimals: кількість десяткових знаків токена для валідації (запобігає помилкам з десятковими знаками)
Відкликання делегата
Видаліть усі дозволи на витрачання від поточного делегата:
import { getRevokeInstruction } from "@solana-program/token";const revokeInstruction = getRevokeInstruction({source: tokenAccountAddress, // Your token accountowner: ownerKeypair // You (must sign)});
Відкликання видаляє всі дозволи делегата — часткове відкликання неможливе. Якщо потрібно зменшити ліміт, схваліть того самого делегата з меншою сумою.
Перевірка статусу делегування
Запитайте обліковий запис токенів, щоб побачити його поточного делегата та залишок дозволу:
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");}
Переказ як делегат
Діючи як делегат, використовуйте стандартний переказ, але підпишіть keypair делегата замість власника:
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});
Переказ буде успішним, якщо:
- Обліковий запис джерела має достатній баланс
- Делегат підписує транзакцію
Кожен переказ зменшує залишок дозволеної суми. Коли дозволена сума досягає нуля, делегат більше не може переказувати токени.
Міркування безпеки
Для власників облікових записів:
- Надавайте дозволи лише перевіреним делегатам
- Встановлюйте мінімально необхідний ліміт витрат
- Відкликайте делегування, коли воно більше не потрібне
- Відстежуйте свої облікові записи на предмет неочікуваних переказів
Для постачальників послуг (делегатів):
- Чітко повідомляйте користувачам про запитуваний ліміт витрат
- Впроваджуйте належне управління ключами для вашого облікового запису делегата
- Відстежуйте використання дозволеної суми, щоб запитувати повторне схвалення до вичерпання лімітів
Делегування vs. зберігання
| Аспект | Делегування | Повне зберігання |
|---|---|---|
| Власність токенів | Залишається у користувача | Користувач передає зберігачу |
| Контроль витрат | Обмежений схваленою сумою | Повний доступ до переданих коштів |
| Відкликання | Миттєве, власником | Потребує співпраці зберігача |
| Ризик | Обмежений схваленою сумою | Весь баланс |
| Необхідна довіра | Обмежена | Висока |
Делегування забезпечує золоту середину — дозволяє автоматизовані платежі, обмежуючи при цьому ризик схваленою сумою.
Пов'язані ресурси
- Схвалення делегата — технічні деталі щодо інструкції схвалення
Is this page helpful?