Abstração de taxas

Cada transação na Solana requer SOL para pagar as taxas de rede. Mas os utilizadores que chegam à sua aplicação de pagamento esperam transacionar em stablecoins—não gerir um segundo saldo de token. A abstração de taxas remove este atrito ao ter outra pessoa a pagar as taxas.

Este guia abrange dois níveis:

  1. Como funciona o patrocínio de taxas — a primitiva subjacente da Solana
  2. Abstração de taxas em escala com Kora — um serviço de abstração de taxas pronto para produção

Como funciona o patrocínio de taxas

As transações na Solana têm um pagador de taxas designado—a conta que paga a taxa de rede. Por predefinição, este é o primeiro signatário. Mas pode especificar uma conta diferente como pagador de taxas, permitindo que um terceiro (o "patrocinador") cubra as taxas em nome do remetente.

Tanto o remetente como o patrocinador devem assinar a transação:

  • O remetente assina para autorizar a transferência dos seus tokens
  • O patrocinador assina para autorizar o pagamento da taxa de rede

Consulte Como funcionam os pagamentos na Solana para conceitos fundamentais de pagamento.

Os passos abaixo mostram o fluxo principal. Consulte a Demonstração para código completo executável.

Criar uma conta de patrocinador

Gere um keypair separado para o patrocinador que pagará as taxas de transação. O patrocinador precisa de SOL para as taxas, mas não precisa de deter os tokens que estão a ser transferidos.

Criar instrução de transferência

Crie a instrução de transferência de token com o remetente como autoridade. O remetente detém os tokens e deve assinar a transferência.

Enviar com patrocinador como pagador de taxa

Crie o cliente com o patrocinador definido como pagador de taxas via payer(sponsor), em seguida, chame client.sendTransaction. O patrocinador assina para pagar a taxa de rede enquanto o remetente assina para autorizar a transferência—sendTransaction recolhe automaticamente todos os signatários referenciados.

Criar uma conta de patrocinador

Gere um keypair separado para o patrocinador que pagará as taxas de transação. O patrocinador precisa de SOL para as taxas, mas não precisa de deter os tokens que estão a ser transferidos.

Criar instrução de transferência

Crie a instrução de transferência de token com o remetente como autoridade. O remetente detém os tokens e deve assinar a transferência.

Enviar com patrocinador como pagador de taxa

Crie o cliente com o patrocinador definido como pagador de taxas via payer(sponsor), em seguida, chame client.sendTransaction. O patrocinador assina para pagar a taxa de rede enquanto o remetente assina para autorizar a transferência—sendTransaction recolhe automaticamente todos os signatários referenciados.

Sponsor Transaction Fee
const sponsor = await generateKeyPairSigner();

Demonstração

Demo
// Generate keypairs for sender, recipient, and sponsor (fee payer)
const sender = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
const sponsor = await generateKeyPairSigner();
console.log("Sender Address:", sender.address);
console.log("Recipient Address:", recipient.address);
console.log("Sponsor Address (Fee Payer):", sponsor.address);
// Demo Setup: Create client, mint account, token accounts, and fund with initial tokens
const { client, mint } = await demoSetup(sender, recipient, sponsor);
console.log("\nMint Address:", mint.address);
// Derive the Associated Token Accounts addresses (ATAs) for sender and recipient
const [senderAta] = await findAssociatedTokenPda({
mint: mint.address,
owner: sender.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const [recipientAta] = await findAssociatedTokenPda({
mint: mint.address,
owner: recipient.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
console.log("Sender Token Account:", senderAta.toString());
console.log("Recipient Token Account:", recipientAta.toString());
// =============================================================================
// Sponsored Token Payment Demo
// =============================================================================
// Create instruction to transfer tokens from sender to recipient
// Transferring 250,000 base units = 0.25 tokens (with 6 decimals)
const transferInstruction = getTransferCheckedInstruction({
source: senderAta,
mint: mint.address,
destination: recipientAta,
authority: sender, // Sender signs to authorize the transfer
amount: 250_000n, // 0.25 tokens
decimals: 6
});
// Send transaction with sponsor as fee payer using @solana/kit
// The sponsor (client.payer) pays fees; the sender signs for the transfer
const { context } = await client.sendTransaction([transferInstruction]);
const signature = context.signature;
console.log("\n=== Sponsored Token Payment Complete ===");
console.log("Transaction Signature:", signature.toString());
// Fetch final token account balances from the RPC
const senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();
const recipientBalance = await client.rpc
.getTokenAccountBalance(recipientAta)
.send();
console.log("\nSender Token Account Balance:", senderBalance.value.uiAmount);
console.log(
"Recipient Token Account Balance:",
recipientBalance.value.uiAmount
);
// Fetch transaction details
const transaction = await client.rpc
.getTransaction(signature, {
encoding: "jsonParsed",
maxSupportedTransactionVersion: 0
})
.send();
const feePayer = transaction?.transaction.message.accountKeys?.[0];
console.log("\nNote: The first account in accountKeys is always the fee payer");
console.log("Fee Payer Address:", feePayer);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

Quando você cria uma token account para um utilizador final, ele pode fechá-la e recuperar o SOL usado para rent. Considere cobrar os utilizadores pela criação de conta em stablecoins, ou incorpore este custo na economia do seu produto.

Abstração de taxas em escala com Kora

A primitiva de pagador de taxa é poderosa, mas construir um sistema sem taxas em produção requer mais: gerir carteiras de patrocinadores, lidar com conversões de tokens (para que os utilizadores possam "pagar" taxas em USDC), limitação de taxa e controlos de segurança.

Kora lida com essa complexidade. É um servidor JSON-RPC que fornece abstração de taxas para que os usuários nunca precisem de SOL. Você pode patrocinar totalmente as taxas ou aceitar o pagamento de taxas em qualquer token.

Implemente o Kora com um único comando:

cargo install kora-cli
kora --config path/to/kora.toml rpc start --signers-config path/to/signers.toml

Em seguida, aponte um cliente Kit para o seu servidor Kora e envie transações com a mesma API utilizada acima:

pnpm add @solana/kora
import { address } from "@solana/kit";
import { createKitKoraClient } from "@solana/kora";
// A Kora-backed Kit client: Kora is the fee payer, and users pay
// fees in the SPL token of your choice instead of SOL
const kora = await createKitKoraClient({
endpoint: "https://your-kora-instance",
rpcUrl: "https://api.mainnet-beta.solana.com",
feeToken: address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), // USDC
feePayerWallet: sender // Signs to authorize the token fee payment
});
// Same instruction, same call—Kora sponsors the network fee
const { context } = await kora.sendTransaction([transferInstruction]);
console.log("Signature:", context.signature);

Recursos do Kora

Is this page helpful?

Índice

Editar Página
© 2026 Fundação Solana. Todos os direitos reservados.