ПлатежиРасширенные платежи

Права на расходование

Токен-программы 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 account
mint: usdcMintAddress, // USDC mint
delegate: delegateAddress, // Account receiving permission
owner: ownerKeypair, // You (must sign)
amount: 1_000_000_000n, // 1,000 USDC in base units
decimals: 6
});

Параметры:

  • source: Тот token account, который предоставляет разрешение
  • delegate: Аккаунт, который получит право тратить токены
  • owner: Текущий владелец token account (должен подписать транзакцию)
  • amount: Максимальное количество токенов, которое делегат может перевести
  • decimals: Десятичные знаки токена для проверки (предотвращает ошибки округления)

Отзыв делегата

Удалите все разрешения на траты у текущего делегата:

import { getRevokeInstruction } from "@solana-program/token";
const revokeInstruction = getRevokeInstruction({
source: tokenAccountAddress, // Your token account
owner: 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 делегата вместо владельца:

Transfer as Delegate
import { getTransferCheckedInstruction } from "@solana-program/token";
const transferInstruction = getTransferCheckedInstruction({
source: ownerTokenAccount, // The account you have permission to spend from
mint: usdcMintAddress,
destination: recipientTokenAccount,
authority: delegateKeypair, // You (the delegate) sign, not the owner
amount: 100_000_000n, // 100 USDC
decimals: 6
});

Перевод будет успешным, если:

  • На исходном аккаунте достаточно средств
  • Делегат подписывает транзакцию

Каждый перевод уменьшает оставшийся лимит. Когда лимит достигает нуля, делегат больше не может переводить токены.

Вопросы безопасности

Для владельцев аккаунтов:

  • Одобряйте только проверенных делегатов
  • Устанавливайте минимально необходимый лимит расходов
  • Отзывайте делегирование, когда оно больше не требуется
  • Следите за своими аккаунтами на предмет неожиданных переводов

Для сервис-провайдеров (делегатов):

  • Четко сообщайте пользователям запрашиваемый лимит расходов
  • Обеспечьте правильное управление ключами для вашего аккаунта делегата
  • Отслеживайте расход лимита, чтобы запросить повторное одобрение до его исчерпания

Делегирование против хранения на балансе (custody)

АспектДелегированиеПолное хранение (custody)
Владение токенамиПользователь сохраняетПользователь переводит хранителю
Контроль расходовОграничен одобренной суммойПолный доступ к переведённым средствам
ОтзывМгновенно, владельцемТребует участия хранителя
РискОграничен одобренной суммойВесь баланс
Необходимое довериеМинимальноеВысокое

Делегирование — это компромисс: оно позволяет автоматизировать платежи, ограничивая при этом риск только одобренной суммой.

Связанные ресурсы

Is this page helpful?

Управляется

© 2026 Фонд Solana.
Все права защищены.
Подключиться