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 account des Nutzers muss vor der Initialisierung vorhanden sein.
  • Beträge sind in Basiseinheiten. Bei einem Token mit 6 Dezimalstellen bedeutet 1_000_000 1 Token.
  • Führen Sie initSubscriptionAuthority nur aus, wenn das Konten der Subscription Authority noch nicht existiert.
  • expiryTs ist ein harter Grenzwert: Sobald er überschritten wird, schlagen Transfers fehl und der Sponsor kann rent zurückfordern. Es gibt keine Nachfrist für Ausgaben.
  • Der Nutzer unterzeichnet Setup- und Widerrufstransaktionen. Der Bevollmächtigte unterzeichnet Transfers.

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.