支払いサブスクリプション

固定委任

固定委任により、ユーザーは別のウォレットまたはサービスが最大で指定されたトークン量を引き出すことを承認できます。転送が成功するたびに、残りの許可量が減少します。有効期限なしの場合はexpiryTs = 0を使用してください。

このガイドでは、フローを分かりやすく保ちます。各スニペットはSDK関数を直接使用しているため、どのアカウントが導出され、どのinstructionが送信され、どの署名者が各ステップの支払いまたは承認を行うかを確認できます。

インストール

pnpm add @solana/subscriptions @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer @solana-program/token

委任の作成

セットアップは4つのパートで構成されています:

  1. ユーザー署名者とサブスクリプションプラグインを使用してクライアントを作成します。
  2. ユーザーのtoken accountとSubscription Authority PDAを導出します。
  3. Subscription Authorityがまだ存在しない場合は初期化します。
  4. 固定委任を作成し、後の転送のためにそのPDAを導出します。
import { address, createClient } from '@solana/kit';
import { solanaLocalRpc } from '@solana/kit-plugin-rpc';
import { signer } from '@solana/kit-plugin-signer';
import { findAssociatedTokenPda, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';
import {
fetchMaybeSubscriptionAuthority,
findFixedDelegationPda,
findSubscriptionAuthorityPda,
subscriptionsProgram,
} from '@solana/subscriptions';
const client = createClient()
.use(signer(userSigner))
.use(solanaLocalRpc({ rpcUrl: 'http://127.0.0.1:8899' }))
.use(subscriptionsProgram());
const tokenMint = address('TOKEN_MINT_ADDRESS_HERE');
const delegatee = address('DELEGATEE_WALLET_ADDRESS_HERE');
const nonce = 0n;
const amount = 1_000_000n;
const expiryTs = BigInt(Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 30);
const [userAta] = await findAssociatedTokenPda({
mint: tokenMint,
owner: userSigner.address,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
});
const [subscriptionAuthorityPda] = await findSubscriptionAuthorityPda({
user: userSigner.address,
tokenMint,
});
const subscriptionAuthority = await fetchMaybeSubscriptionAuthority(
client.rpc,
subscriptionAuthorityPda,
);
if (!subscriptionAuthority.exists) {
await client.subscriptions.instructions
.initSubscriptionAuthority({
tokenMint,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
userAta,
})
.sendTransaction();
}
await client.subscriptions.instructions
.createFixedDelegation({
tokenMint,
delegatee,
nonce,
amount,
expiryTs,
})
.sendTransaction();
const [delegationPda] = await findFixedDelegationPda({
subscriptionAuthority: subscriptionAuthorityPda,
delegator: userSigner.address,
delegatee,
nonce,
});

委任からの転送

委任先が転送に署名します。SDKには、同じ委任PDA、ユーザーのtoken account、および受信者のtoken accountが必要です。

const receiverAta = address('RECEIVER_TOKEN_ACCOUNT_ADDRESS_HERE');
await client.subscriptions.instructions
.transferFixed({
delegatee: delegateeSigner,
delegator: userSigner.address,
delegatorAta: userAta,
tokenMint,
delegationPda,
amount: 100_000n,
receiverAta,
tokenProgram: TOKEN_PROGRAM_ADDRESS,
})
.sendTransaction();

委任の取り消し

委任者はいつでも委任を取り消すことができます。取り消すと、委任PDAが閉じられ、そのrentが署名者に返還されます。

await client.subscriptions.instructions
.revokeDelegation({
authority: userSigner,
delegationAccount: delegationPda,
})
.sendTransaction();

注意事項

  • 初期化前にユーザーのtoken accountが存在している必要があります。
  • 金額は基本単位で表されます。6桁の小数点を持つトークンの場合、1_000_0001トークンを意味します。
  • initSubscriptionAuthorityは、Subscription Authorityアカウントがまだ存在しない場合にのみ実行してください。
  • ユーザーは設定と取り消しのトランザクションに署名します。委任先は転送に署名します。

Is this page helpful?

目次

ページを編集
© 2026 Solana Foundation. 無断転載を禁じます。