تدعم برامج الرموز في سولانا التفويض—منح حساب آخر إذنًا لتحويل الرموز من حساب الرموز الخاص بك حتى حد معين. يتيح ذلك حالات استخدام مثل المدفوعات الآلية وخدمات الضمان ومعالجة المدفوعات من طرف ثالث دون التخلي عن حيازة أموالك.
كيف يعمل التفويض
عندما توافق على مفوض، فإنك تمنح حسابًا معينًا صلاحية تحويل الرموز نيابة عنك:
- يحتفظ المالك بالحيازة: لا تزال تمتلك الرموز ويمكنك التحويل أو الإلغاء في أي وقت
- إنفاق محدود: يمكن للمفوض فقط تحويل ما يصل إلى المبلغ المعتمد
- مفوض واحد لكل حساب: يمكن أن يكون لكل حساب رموز مفوض نشط واحد فقط
- الموافقة الجديدة تحل محل القديمة: الموافقة على مفوض جديد تلغي تلقائيًا المفوض السابق
التفويض غير احتجازي. يمكن للمفوض إنفاق الرموز حتى الحد المسموح، لكن لا يمكنه الوصول إلى الحساب أو استنزافه بما يتجاوز المبلغ المعتمد. يمكن للمالك الإلغاء في أي وقت.
حالات الاستخدام التجارية
| حالة الاستخدام | كيف يساعد التفويض |
|---|---|
| معالجات الدفع | يمنح التاجر المعالج إذنًا لتسوية المعاملات |
| كشوف الرواتب الآلية | تعتمد الخزانة خدمة كشوف الرواتب لصرف الرواتب |
| خدمات الضمان | يفوض المشتري وكيل الضمان للإفراج المشروط |
| منصات التداول | يوافق المستخدم على تنفيذ البورصة للصفقات نيابة عنه |
| إصدار البطاقات | يوافق المستخدم على مصدر البطاقة لخصم المشتريات من حساب الرموز الخاص به |
الموافقة على مفوض
منح حساب آخر إذنًا لإنفاق الرموز من حسابك:
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: الكسور العشرية للرمز للتحقق (يمنع أخطاء الكسور العشرية)
عرض توضيحي
// Generate keypairs for sender and delegateconst 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 tokensconst { client, mint, senderAta } = await demoSetup(sender);console.log("\nMint Address:", mint.address);console.log("Sender ATA:", senderAta);// =============================================================================// Approve Delegate// =============================================================================// Create instruction to approve delegateconst approveInstruction = getApproveCheckedInstruction({source: senderAta,mint: mint.address,delegate: delegate.address,owner: sender,amount: 1_000_000n, // 1.0 tokens with 6 decimalsdecimals: 6});// Send approve transactionconst 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 setconst tokenData = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenData.data);// =============================================================================// Demo Setup Helper Function// =============================================================================
إلغاء المفوض
إزالة جميع أذونات الإنفاق من المفوض الحالي:
import { getRevokeInstruction } from "@solana-program/token";const revokeInstruction = getRevokeInstruction({source: tokenAccountAddress, // Your token accountowner: ownerKeypair // You (must sign)});
الإلغاء يزيل جميع أذونات المفوض—لا يوجد إلغاء جزئي. إذا كنت بحاجة إلى تقليل الحد، وافق على نفس المفوض بمبلغ أقل.
عرض توضيحي
// Generate keypairs for sender and delegateconst 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 tokensconst { 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 delegateconst approveInstruction = getApproveCheckedInstruction({source: senderAta,mint: mint.address,delegate: delegate.address,owner: sender,amount: 1_000_000n, // 1.0 tokens with 6 decimalsdecimals: 6});// Send approve transactionconst 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 setconst tokenDataAfterApprove = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenDataAfterApprove.data);// =============================================================================// Transaction 2: Revoke Delegate// =============================================================================// Create instruction to revoke delegateconst revokeInstruction = getRevokeInstruction({source: senderAta,owner: sender});// Send revoke transactionconst 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 revokedconst tokenDataAfterRevoke = await fetchToken(client.runtime.rpc, senderAta);console.log("\nSender Token Account Data:", tokenDataAfterRevoke.data);// =============================================================================// Demo Setup Helper Function// =============================================================================
التحويل كمفوض
عند العمل كمفوض، استخدم تحويلاً قياسياً ولكن وقّع باستخدام 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});
سينجح التحويل إذا:
- كان لدى الحساب المصدر رصيد كافٍ
- وقّع المفوض على المعاملة
كل تحويل يقلل من الحد المتبقي. عندما يصل الحد إلى الصفر، لن يتمكن المفوض من تحويل الرموز بعد الآن.
عرض توضيحي
// Generate keypairs for sender, delegate, and recipientconst 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 tokensconst { 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 delegateconst approveInstruction = getApproveCheckedInstruction({source: senderAta,mint: mint.address,delegate: delegate.address,owner: sender,amount: 1_000_000n, // 1.0 tokens with 6 decimalsdecimals: 6});// Send approve transactionconst 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 ownerconst transferInstruction = getTransferCheckedInstruction({source: senderAta,mint: mint.address,destination: recipientAta,authority: delegate, // Delegate signs this transactionamount: 500_000n, // 0.5 tokens with 6 decimalsdecimals: 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 signsinstructions: [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// =============================================================================
التحقق من حالة التفويض
الاستعلام عن حساب رمز لمعرفة المفوض الحالي والرصيد المتبقي:
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");}
عرض توضيحي
// 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 delegateconst tokenWithDelegate = await fetchToken(client.runtime.rpc, ataWithDelegate);console.log("Token Account with Delegate:", tokenWithDelegate);// Fetch token account without delegateconst tokenWithoutDelegate = await fetchToken(client.runtime.rpc,ataWithoutDelegate);console.log("\nToken Account without Delegate:", tokenWithoutDelegate);// =============================================================================// Demo Setup Helper Function// =============================================================================
اعتبارات الأمان
لأصحاب الحسابات:
- وافق فقط على المفوضين الموثوقين
- حدد الحد الأدنى الضروري للإنفاق
- ألغِ التفويضات عندما لا تعود هناك حاجة إليها
- راقب حساباتك بحثًا عن تحويلات غير متوقعة
لمقدمي الخدمات (المفوضين):
- وضح بشكل واضح حد الإنفاق المطلوب للمستخدمين
- نفذ إدارة مفاتيح مناسبة لحساب المفوض الخاص بك
- تتبع استهلاك الرصيد المسموح به لطلب إعادة الموافقة قبل نفاد الحدود
التفويض مقابل الحضانة
| الجانب | التفويض | الحضانة الكاملة |
|---|---|---|
| ملكية الرموز | يحتفظ بها المستخدم | ينقلها المستخدم إلى الوصي |
| التحكم في الإنفاق | محدود بالمبلغ المعتمد | وصول كامل إلى الأموال المحولة |
| الإلغاء | فوري، من قبل المالك | يتطلب تعاون الوصي |
| التعرض للمخاطر | محدود بالمبلغ المعتمد | الرصيد بالكامل |
| الثقة المطلوبة | محدودة | عالية |
يوفر التفويض حلاً وسطًا—يتيح المدفوعات الآلية مع الحد من التعرض للمخاطر إلى المبلغ المعتمد.
الموارد ذات الصلة
| المورد | الوصف |
|---|---|
| الموافقة على المفوض | كيفية منح حساب آخر إذنًا للإنفاق من حساب الرموز الخاص بك. |
| إلغاء المفوض | كيفية إزالة مفوض موجود وإلغاء أذونات الإنفاق الخاصة به. |
| تحويل الرموز | كيفية تحويل الرموز بين حسابات الرموز. |
Is this page helpful?