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