المدفوعاتالمدفوعات المتقدمة

أذونات الإنفاق

تدعم برامج الرموز في سولانا التفويض—منح حساب آخر إذنًا لتحويل الرموز من حساب الرموز الخاص بك حتى حد معين. يتيح ذلك حالات استخدام مثل المدفوعات الآلية وخدمات الضمان ومعالجة المدفوعات من طرف ثالث دون التخلي عن حيازة أموالك.

كيف يعمل التفويض

عندما توافق على مفوض، فإنك تمنح حسابًا معينًا صلاحية تحويل الرموز نيابة عنك:

  • يحتفظ المالك بالحيازة: لا تزال تمتلك الرموز ويمكنك التحويل أو الإلغاء في أي وقت
  • إنفاق محدود: يمكن للمفوض فقط تحويل ما يصل إلى المبلغ المعتمد
  • مفوض واحد لكل حساب: يمكن أن يكون لكل حساب رموز مفوض نشط واحد فقط
  • الموافقة الجديدة تحل محل القديمة: الموافقة على مفوض جديد تلغي تلقائيًا المفوض السابق

التفويض غير احتجازي. يمكن للمفوض إنفاق الرموز حتى الحد المسموح، لكن لا يمكنه الوصول إلى الحساب أو استنزافه بما يتجاوز المبلغ المعتمد. يمكن للمالك الإلغاء في أي وقت.

حالات الاستخدام التجارية

حالة الاستخدامكيف يساعد التفويض
معالجات الدفعيمنح التاجر المعالج إذنًا لتسوية المعاملات
كشوف الرواتب الآليةتعتمد الخزانة خدمة كشوف الرواتب لصرف الرواتب
خدمات الضمانيفوض المشتري وكيل الضمان للإفراج المشروط
منصات التداوليوافق المستخدم على تنفيذ البورصة للصفقات نيابة عنه
إصدار البطاقاتيوافق المستخدم على مصدر البطاقة لخصم المشتريات من حساب الرموز الخاص به

الموافقة على مفوض

منح حساب آخر إذنًا لإنفاق الرموز من حسابك:

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: الكسور العشرية للرمز للتحقق (يمنع أخطاء الكسور العشرية)

عرض توضيحي

Approve Delegate
// Generate keypairs for sender and delegate
const sender = (await generateKeypair()).signer;
const delegate = (await generateKeypair()).signer;
console.log("Sender Address:", sender.address);
console.log("Delegate Address:", delegate.address);
// Demo Setup: Create client, mint account, token account, and fund with initial tokens
const { client, mint, senderAta } = await demoSetup(sender);
console.log("\nMint Address:", mint.address);
console.log("Sender ATA:", senderAta);
// =============================================================================
// Approve Delegate
// =============================================================================
// Create instruction to approve delegate
const approveInstruction = getApproveCheckedInstruction({
source: senderAta,
mint: mint.address,
delegate: delegate.address,
owner: sender,
amount: 1_000_000n, // 1.0 tokens with 6 decimals
decimals: 6
});
// Send approve transaction
const signature = await client.transaction.prepareAndSend({
authority: sender,
instructions: [approveInstruction]
});
console.log("\n=== Approve Delegate ===");
console.log("Transaction Signature:", signature);
// Fetch token account data to show delegate is set
const tokenData = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenData.data);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

إلغاء المفوض

إزالة جميع أذونات الإنفاق من المفوض الحالي:

import { getRevokeInstruction } from "@solana-program/token";
const revokeInstruction = getRevokeInstruction({
source: tokenAccountAddress, // Your token account
owner: ownerKeypair // You (must sign)
});

الإلغاء يزيل جميع أذونات المفوض—لا يوجد إلغاء جزئي. إذا كنت بحاجة إلى تقليل الحد، وافق على نفس المفوض بمبلغ أقل.

عرض توضيحي

Revoke Delegate
// Generate keypairs for sender and delegate
const sender = (await generateKeypair()).signer;
const delegate = (await generateKeypair()).signer;
console.log("Sender Address:", sender.address);
console.log("Delegate Address:", delegate.address);
// Demo Setup: Create client, mint account, token account, and fund with initial tokens
const { client, mint, senderAta } = await demoSetup(sender);
console.log("\nMint Address:", mint.address);
console.log("Sender ATA:", senderAta);
// =============================================================================
// Transaction 1: Approve Delegate
// =============================================================================
// Create instruction to approve delegate
const approveInstruction = getApproveCheckedInstruction({
source: senderAta,
mint: mint.address,
delegate: delegate.address,
owner: sender,
amount: 1_000_000n, // 1.0 tokens with 6 decimals
decimals: 6
});
// Send approve transaction
const approveSignature = await client.transaction.prepareAndSend({
authority: sender,
instructions: [approveInstruction]
});
console.log("\n=== Transaction 1: Approve Delegate ===");
console.log("Transaction Signature:", approveSignature);
// Fetch token account data to show delegate is set
const tokenDataAfterApprove = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenDataAfterApprove.data);
// =============================================================================
// Transaction 2: Revoke Delegate
// =============================================================================
// Create instruction to revoke delegate
const revokeInstruction = getRevokeInstruction({
source: senderAta,
owner: sender
});
// Send revoke transaction
const revokeSignature = await client.transaction.prepareAndSend({
authority: sender,
instructions: [revokeInstruction]
});
console.log("\n=== Transaction 2: Revoke Delegate ===");
console.log("Transaction Signature:", revokeSignature);
// Fetch token account data to show delegate is revoked
const tokenDataAfterRevoke = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenDataAfterRevoke.data);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

التحويل كمفوض

عند العمل كمفوض، استخدم تحويلاً قياسياً ولكن وقّع باستخدام 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
});

سينجح التحويل إذا:

  • كان لدى الحساب المصدر رصيد كافٍ
  • وقّع المفوض على المعاملة

كل تحويل يقلل من الحد المتبقي. عندما يصل الحد إلى الصفر، لن يتمكن المفوض من تحويل الرموز بعد الآن.

عرض توضيحي

Transfer as Delegate
// Generate keypairs for sender, delegate, and recipient
const sender = (await generateKeypair()).signer;
const delegate = (await generateKeypair()).signer;
const recipient = (await generateKeypair()).signer;
console.log("Sender Address:", sender.address);
console.log("Delegate Address:", delegate.address);
console.log("Recipient Address:", recipient.address);
// Demo Setup: Create client, mint account, token accounts, and fund with initial tokens
const { client, mint, senderAta, recipientAta } = await demoSetup(
sender,
delegate,
recipient
);
console.log("\nMint Address:", mint.address);
console.log("Sender ATA:", senderAta);
console.log("Recipient ATA:", recipientAta);
// =============================================================================
// Transaction 1: Approve Delegate
// =============================================================================
// Create instruction to approve delegate
const approveInstruction = getApproveCheckedInstruction({
source: senderAta,
mint: mint.address,
delegate: delegate.address,
owner: sender,
amount: 1_000_000n, // 1.0 tokens with 6 decimals
decimals: 6
});
// Send approve transaction
const approveSignature = await client.transaction.prepareAndSend({
authority: sender,
instructions: [approveInstruction]
});
console.log("\n=== Transaction 1: Approve Delegate ===");
console.log("Delegate Address:", delegate.address);
console.log("Transaction Signature:", approveSignature);
// =============================================================================
// Fetch Token Account Data to Demonstrate Delegate is Set
// =============================================================================
const tokenAccountData = await fetchToken(client.runtime.rpc, senderAta);
console.log("\nSender Token Account Data:", tokenAccountData.data);
// =============================================================================
// Transaction 2: Transfer Using Delegate
// =============================================================================
// Create instruction to transfer tokens using delegate
// Note: delegate is the authority here, not the owner
const transferInstruction = getTransferCheckedInstruction({
source: senderAta,
mint: mint.address,
destination: recipientAta,
authority: delegate, // Delegate signs this transaction
amount: 500_000n, // 0.5 tokens with 6 decimals
decimals: 6
});
// Send transfer transaction
// Delegate pays for the transaction and authorizes the transfer (sender not needed)
const transferSignature = await client.transaction.prepareAndSend({
authority: delegate, // Delegate pays fee and signs
instructions: [transferInstruction]
});
// =============================================================================
// Fetch Final Token Account Balances
// =============================================================================
const finalSenderToken = await fetchToken(client.runtime.rpc, senderAta);
const finalRecipientToken = await fetchToken(client.runtime.rpc, recipientAta);
console.log("\n=== Transaction 2: Transfer Using Delegate ===");
console.log("Transaction Signature:", transferSignature);
console.log("\nSender Token Account Data:", finalSenderToken.data);
console.log("\nRecipient Token Account Data:", finalRecipientToken.data);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

التحقق من حالة التفويض

الاستعلام عن حساب رمز لمعرفة المفوض الحالي والرصيد المتبقي:

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

عرض توضيحي

Check Delegation Status
// Demo Setup: Create client, mint, two token accounts (one with delegate, one without)
const { client, ataWithDelegate, ataWithoutDelegate } = await demoSetup();
// =============================================================================
// Fetch Token Accounts
// =============================================================================
// Fetch token account with delegate
const tokenWithDelegate = await fetchToken(client.runtime.rpc, ataWithDelegate);
console.log("Token Account with Delegate:", tokenWithDelegate);
// Fetch token account without delegate
const tokenWithoutDelegate = await fetchToken(
client.runtime.rpc,
ataWithoutDelegate
);
console.log("\nToken Account without Delegate:", tokenWithoutDelegate);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

اعتبارات الأمان

لأصحاب الحسابات:

  • وافق فقط على المفوضين الموثوقين
  • حدد الحد الأدنى الضروري للإنفاق
  • ألغِ التفويضات عندما لا تعود هناك حاجة إليها
  • راقب حساباتك بحثًا عن تحويلات غير متوقعة

لمقدمي الخدمات (المفوضين):

  • وضح بشكل واضح حد الإنفاق المطلوب للمستخدمين
  • نفذ إدارة مفاتيح مناسبة لحساب المفوض الخاص بك
  • تتبع استهلاك الرصيد المسموح به لطلب إعادة الموافقة قبل نفاد الحدود

التفويض مقابل الحضانة

الجانبالتفويضالحضانة الكاملة
ملكية الرموزيحتفظ بها المستخدمينقلها المستخدم إلى الوصي
التحكم في الإنفاقمحدود بالمبلغ المعتمدوصول كامل إلى الأموال المحولة
الإلغاءفوري، من قبل المالكيتطلب تعاون الوصي
التعرض للمخاطرمحدود بالمبلغ المعتمدالرصيد بالكامل
الثقة المطلوبةمحدودةعالية

يوفر التفويض حلاً وسطًا—يتيح المدفوعات الآلية مع الحد من التعرض للمخاطر إلى المبلغ المعتمد.

الموارد ذات الصلة

الموردالوصف
الموافقة على المفوضكيفية منح حساب آخر إذنًا للإنفاق من حساب الرموز الخاص بك.
إلغاء المفوضكيفية إزالة مفوض موجود وإلغاء أذونات الإنفاق الخاصة به.
تحويل الرموزكيفية تحويل الرموز بين حسابات الرموز.

Is this page helpful?

تدار بواسطة

© 2026 مؤسسة سولانا.
جميع الحقوق محفوظة.
تواصل معنا