支払い高度な支払い
Solanaのトークンプログラムは委任をサポートしています。これは、指定された上限まで、あなたのトークンアカウントからトークンを転送する権限を別のアカウントに付与するものです。これにより、資金の管理権を手放すことなく、自動支払い、エスクローサービス、サードパーティ決済処理などのユースケースが可能になります。
委任の仕組み
委任先を承認すると、特定のアカウントにあなたの代わりにトークンを転送する権限を与えることになります。
- 所有者が管理権を保持: トークンの所有権は引き続きあなたにあり、いつでも転送または取り消しが可能です
- 支出上限の設定: 委任先は承認された金額までしか転送できません
- アカウントごとに1つの委任先: 各トークンアカウントは、アクティブな委任先を1つだけ持つことができます
- 新しい承認で古い承認を置き換え: 新しい委任先を承認すると、以前の委任先は自動的に取り消されます
委任は非カストディアルです。委任先は上限までトークンを使用できますが、承認された金額を超えてアカウントにアクセスしたり、資金を引き出したりすることはできません。所有者はいつでも取り消すことができます。
ビジネスユースケース
| ユースケース | 委任の活用方法 |
|---|---|
| 決済処理業者 | 加盟店が決済処理業者に取引決済の権限を付与 |
| 自動給与支払い | 財務部門が給与サービスに給与支払いの権限を承認 |
| エスクローサービス | 購入者がエスクローエージェントに条件付きリリースの権限を委任 |
| 取引プラットフォーム | ユーザーが取引所に代理取引の実行を承認 |
| カード発行 | ユーザーがカード発行会社に、トークンアカウントへの購入請求を承認 |
委任先の承認
あなたのアカウントからトークンを使用する権限を別のアカウントに付与します:
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: 検証用のトークンの小数点以下桁数(小数点エラーを防ぎます)
デリゲートの取り消し
現在のデリゲートからすべての使用権限を削除します:
import { getRevokeInstruction } from "@solana-program/token";const revokeInstruction = getRevokeInstruction({source: tokenAccountAddress, // Your token accountowner: 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 frommint: usdcMintAddress,destination: recipientTokenAccount,authority: delegateKeypair, // You (the delegate) sign, not the owneramount: 100_000_000n, // 100 USDCdecimals: 6});
転送は次の場合に成功します:
- 送信元アカウントに十分な残高がある
- デリゲートがトランザクションに署名する
各転送により、残りの許可額が減少します。許可額がゼロになると、委任者はトークンを転送できなくなります。
セキュリティに関する考慮事項
アカウント所有者の場合:
- 信頼できる委任者のみを承認する
- 必要最小限の支出制限を設定する
- 不要になった委任は取り消す
- 予期しない転送がないかアカウントを監視する
サービスプロバイダー(委任者)の場合:
- 要求する支出制限をユーザーに明確に伝える
- 委任者アカウントの適切な鍵管理を実装する
- 許可額の消費を追跡し、制限に達する前に再承認を要求する
委任と保管の比較
| 項目 | 委任 | 完全保管 |
|---|---|---|
| トークンの所有権 | ユーザーが保持 | ユーザーが保管者に譲渡 |
| 支出管理 | 承認額で上限設定 | 譲渡された資金への完全アクセス |
| 取り消し | 所有者による即時実行 | 保管者の協力が必要 |
| リスクエクスポージャー | 承認額に限定 | 残高全体 |
| 必要な信頼 | 限定的 | 高い |
委任は中間的な選択肢を提供し、承認額にリスクエクスポージャーを制限しながら自動支払いを可能にします。
関連リソース
- 委任者の承認 — approve命令の技術的詳細
Is this page helpful?