ZahlungenAbonnements

Feste Delegation

Eine feste Delegation ermöglicht es einem Benutzer, einer anderen Wallet oder einem Dienst zu genehmigen, bis zu einem festgelegten Token-Betrag abzubuchen. Jede erfolgreiche Übertragung verringert das verbleibende Kontingent. Verwenden Sie expiryTs = 0 für unbegrenzte Gültigkeit.

Diese Anleitung hält den Ablauf transparent. Jeder Codeausschnitt verwendet die SDK-Funktionen direkt, sodass Sie sehen können, welches Konto abgeleitet wird, welche Anweisung gesendet wird und welcher Signer jeden Schritt bezahlt oder autorisiert.

Installation

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

Delegation erstellen

Die Einrichtung besteht aus vier Teilen:

  1. Erstellen Sie einen Client mit dem Benutzer-Signer und dem Subscriptions-Plugin.
  2. Leiten Sie das Token-Konto des Benutzers und die Subscription Authority PDA ab.
  3. Initialisieren Sie die Subscription Authority, falls sie noch nicht existiert.
  4. Erstellen Sie die feste Delegation und leiten Sie deren PDA für spätere Übertragungen ab.
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,
});

Übertragung von der Delegation

Der Delegierte signiert die Übertragung. Das SDK benötigt dieselbe Delegations-PDA, das Token-Konto des Benutzers und das Token-Konto des Empfängers.

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();

Delegation widerrufen

Der Delegierende kann die Delegation jederzeit widerrufen. Beim Widerrufen wird das Delegations-PDA geschlossen und die Miete an den Signer zurückerstattet.

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

Hinweise

  • Das Token-Konto des Benutzers muss vor der Initialisierung existieren.
  • Beträge sind in Basiseinheiten angegeben. Bei einem Token mit 6 Dezimalstellen bedeutet 1_000_000 gleich 1 Token.
  • Führen Sie initSubscriptionAuthority nur aus, wenn das Subscription Authority-Konto noch nicht existiert.
  • Der Benutzer signiert Einrichtungs- und Widerrufs-Transaktionen. Der Delegierte signiert Überweisungen.

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.