ПлатежіРозширені платежі

Дозволи на витрачання

Токенові програми 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 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: обліковий запис токенів, який надає дозвіл
  • delegate: обліковий запис, який отримає дозвіл на витрачання
  • owner: поточний власник облікового запису токенів (має підписати транзакцію)
  • amount: максимальна кількість токенів, яку делегат може переказати
  • decimals: кількість десяткових знаків токена для валідації (запобігає помилкам з десятковими знаками)

Відкликання делегата

Видаліть усі дозволи на витрачання від поточного делегата:

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

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
});

Переказ буде успішним, якщо:

  • Обліковий запис джерела має достатній баланс
  • Делегат підписує транзакцію

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

Міркування безпеки

Для власників облікових записів:

  • Надавайте дозволи лише перевіреним делегатам
  • Встановлюйте мінімально необхідний ліміт витрат
  • Відкликайте делегування, коли воно більше не потрібне
  • Відстежуйте свої облікові записи на предмет неочікуваних переказів

Для постачальників послуг (делегатів):

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

Делегування vs. зберігання

АспектДелегуванняПовне зберігання
Власність токенівЗалишається у користувачаКористувач передає зберігачу
Контроль витратОбмежений схваленою сумоюПовний доступ до переданих коштів
ВідкликанняМиттєве, власникомПотребує співпраці зберігача
РизикОбмежений схваленою сумоюВесь баланс
Необхідна довіраОбмеженаВисока

Делегування забезпечує золоту середину — дозволяє автоматизовані платежі, обмежуючи при цьому ризик схваленою сумою.

Пов'язані ресурси

Is this page helpful?

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку