委任の承認

委任の承認とは?

委任の承認により、別のアドレスがtoken accountの所有者に代わって、token accountから制限された量のトークンを転送または焼却できるようになります。

token accountは、一度に1つの現在の委任先と1つの委任量を保存します。新しい委任先を承認すると、アカウント上の以前の委任先と許可量が置き換えられます。

委任先を承認する方法

委任先の承認には、Token ProgramのrsApproveまたはrsApproveChecked instructionを使用します。

以下の例では*rsApproveChecked*を使用しています。これは、呼び出し元がミントと小数点以下桁数を提供する必要があり、承認を処理する前にinstructionが期待されるミントとトークンの精度を検証できるようにします。

token accountの所有者が承認に署名します。

ソースリファレンス

項目説明Token ProgramToken Extensions Program
Accounttoken accountの状態は、所有者、委任先、および委任量を保存します。ソースソース
Approve呼び出し元がミントや小数点以下桁数を提供する必要なく、token accountの委任先と許可量を記録する委任承認instruction。ソースソース
ApproveChecked呼び出し元がミントと小数点以下桁数を提供する必要があり、委任先と許可量を記録する前にそれらの値をチェックする委任承認instruction。ソースソース
process_approve委任承認の共有プロセッサロジック。ソースソース

Typescript

以下のKitの例は、@solana/kitを使用した推奨アプローチを示しています。 @solana/web3.jsを使用したレガシーの例も参考として含まれています。

Kit

import { generateKeyPairSigner } from "@solana/kit";
import { createLocalClient } from "@solana/kit-client-rpc";
import {
findAssociatedTokenPda,
tokenProgram,
TOKEN_PROGRAM_ADDRESS
} from "@solana-program/token";
const client = await createLocalClient()
.use(tokenProgram());
const mint = await generateKeyPairSigner();
const delegate = await generateKeyPairSigner();
const [tokenAccount] = await findAssociatedTokenPda({
mint: mint.address,
owner: client.payer.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS
});
const result = await client.token.instructions
.approveChecked({
source: tokenAccount, // Token account whose delegate approval changes.
mint: mint.address, // Mint for the token the delegate may spend.
delegate: delegate.address, // Delegate allowed to spend from the token account.
owner: client.payer, // Owner approving this delegate change.
amount: 25n, // Token amount in base units.
decimals: 2 // Decimals defined on the mint account.
})
.sendTransaction();
const tokenAccountData = await client.token.accounts.token.fetch(tokenAccount);
console.log("Mint Address:", mint.address);
console.log("\nToken Account Address:", tokenAccount);
console.log("Token Account:", tokenAccountData.data);
console.log("\nDelegate Address:", delegate.address);
console.log("\nTransaction Signature:", result.context.signature);
Console
Click to execute the code.

Web3.js

import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";
import {
createAssociatedTokenAccount,
approveChecked,
createMint,
getAccount,
mintToChecked,
TOKEN_PROGRAM_ID
} from "@solana/spl-token";
const result = await approveChecked(
connection, // Connection to the local validator.
feePayer, // Account paying transaction fees.
mintPubkey, // Mint for the token the delegate may spend.
associatedTokenAccount, // Token account whose delegate approval changes.
delegate.publicKey, // Delegate allowed to spend from the token account.
feePayer, // Owner approving this delegate change.
25, // Token amount in base units.
2, // Decimals defined on the mint account.
[], // Additional multisig signers.
{
commitment: "confirmed" // Confirmation options for the transaction.
},
TOKEN_PROGRAM_ID // Token program to invoke.
);
const tokenAccountData = await getAccount(
connection,
associatedTokenAccount,
"confirmed",
TOKEN_PROGRAM_ID
);
console.log("Mint Address:", mintPubkey.toBase58());
console.log(
"\nAssociated Token Account Address:",
associatedTokenAccount.toBase58()
);
console.log("Associated Token Account:", tokenAccountData);
console.log("\nDelegate Address:", delegate.publicKey.toBase58());
console.log("\nTransaction Signature:", result);
Console
Click to execute the code.

Rust

Rust
use anyhow::Result;
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_commitment_config::CommitmentConfig;
use solana_sdk::{
program_pack::Pack,
signature::{Keypair, Signer},
transaction::Transaction,
};
use solana_system_interface::instruction::create_account;
use spl_associated_token_account_interface::{
address::get_associated_token_address, instruction::create_associated_token_account,
};
use spl_token_interface::{
id as token_program_id,
instruction::{approve_checked, initialize_mint, mint_to_checked},
state::{Account, Mint},
};
#[tokio::main]
async fn main() -> Result<()> {
let client = RpcClient::new_with_commitment(
String::from("http://localhost:8899"),
CommitmentConfig::confirmed(),
);
let delegate = Keypair::new();
let approve_amount = 25;
let transaction = Transaction::new_signed_with_payer(
&[
approve_checked(
&token_program_id(), // Token program to invoke.
&associated_token_address, // Token account whose delegate approval changes.
&mint.pubkey(), // Mint for the token the delegate may spend.
&delegate.pubkey(), // Delegate allowed to spend from the token account.
&fee_payer.pubkey(), // Owner approving this delegate change.
&[], // Additional multisig signers.
approve_amount, // Token amount in base units.
decimals, // Decimals defined on the mint account.
)?,
],
Some(&fee_payer.pubkey()),
&[&fee_payer],
latest_blockhash,
);
let transaction_signature = client.send_and_confirm_transaction(&transaction).await?;
let token_account = client.get_account(&associated_token_address).await?;
let token_data = Account::unpack(&token_account.data)?;
println!("Mint Address: {}", mint.pubkey());
println!(
"\nAssociated Token Account Address: {}",
associated_token_address
);
println!("Associated Token Account: {:#?}", token_data);
println!("\nDelegate Address: {}", delegate.pubkey());
println!("\nTransaction Signature: {}", transaction_signature);
Ok(())
}
Console
Click to execute the code.

Python

Python
#!/usr/bin/env python3
import asyncio
import json
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.message import Message
from solders.pubkey import Pubkey
from solders.system_program import create_account, CreateAccountParams
from solders.transaction import Transaction
from spl.token.async_client import AsyncToken
from spl.token.instructions import (
approve_checked,
ApproveCheckedParams,
create_associated_token_account,
get_associated_token_address,
initialize_mint,
InitializeMintParams,
mint_to_checked,
MintToCheckedParams,
)
from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_ID
DECIMALS = 2
AMOUNT_TO_MINT = 100
AMOUNT_TO_APPROVE = 25
async def main():
rpc = AsyncClient("http://localhost:8899")
delegate = Keypair()
async with rpc:
approve_delegate_instruction = approve_checked(
ApproveCheckedParams(
program_id=TOKEN_PROGRAM_ID, # Token program to invoke.
source=token_account_address, # Token account whose delegate approval changes.
mint=mint.pubkey(), # Mint for the token the delegate may spend.
delegate=delegate.pubkey(), # Account allowed to spend from the token account.
owner=fee_payer.pubkey(), # Account that owns the token account.
amount=AMOUNT_TO_APPROVE, # Token amount in base units.
decimals=DECIMALS, # Decimals defined on the mint account.
)
)
latest_blockhash = await rpc.get_latest_blockhash()
transaction = Transaction(
[fee_payer],
Message([approve_delegate_instruction], fee_payer.pubkey()),
latest_blockhash.value.blockhash,
)
result = await rpc.send_transaction(transaction)
token_account_info = await token.get_account_info(token_account_address)
token_account = {
key: str(value) if isinstance(value, Pubkey) else value
for key, value in token_account_info._asdict().items()
}
print("Mint Address:", mint.pubkey())
print("\nToken Account Address:", token_account_address)
print("Token Account:")
print(json.dumps(token_account, indent=2))
print("\nDelegate Address:", delegate.pubkey())
print("\nTransaction Signature:", result.value)
if __name__ == "__main__":
asyncio.run(main())
Console
Click to execute the code.

Is this page helpful?

目次

ページを編集

管理運営

© 2026 Solana Foundation.
無断転載を禁じます。
つながろう