Tasas de Transferencia
La extensión de Tasa de Transferencia permite a las acuñaciones de Token-2022 cobrar una comisión por cada transferencia, retenida en cuentas de token hasta que se coseche (harvested) a un colector de comisiones. Permite ingresos en la cadena sin programas de transferencia personalizados.
Receta
spl-token create-token \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
--decimals 6 \
--transfer-fee-basis-points 100 \
--transfer-fee-maximum-fee 1000000use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
// Usar ayudantes de CPI de spl-token-2022 para harvest_withheld_tokens_to_mintCuándo usar esto:
- Ingresos del protocolo en transferencias secundarias
- Activos del mundo real tokenizados con comisiones del emisor
- Tokens de fidelización con mecánicas de redistribución
- Reemplazo de un seguimiento de comisiones frágil fuera de la cadena
Ejemplo Funcional
# Crear acuñación con comisión del 1% (100 bps), límite máximo de 1 token en bruto
MINT=$(spl-token create-token \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
--decimals 6 \
--transfer-fee-basis-points 100 \
--transfer-fee-maximum-fee 1000000 | awk '/Creating token/{print $3}')
spl-token create-account "$MINT" --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
spl-token mint "$MINT" 10000000 --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
# Transferir 1_000_000 en bruto - el destinatario recibe menos; comisión retenida
spl-token transfer "$MINT" 1000000 <RECIPIENT> --fund-recipient \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
spl-token display <RECIPIENT_ATA> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbLo que esto demuestra:
- Comisión calculada en puntos base (100 bps = 1%) limitada por
maximum_fee - La cantidad retenida permanece en la cuenta del destinatario o remitente según la configuración hasta la cosecha
- Las billeteras deben mostrar la cantidad neta, no la entrada bruta de la transferencia
Análisis Profundo
Cómo Funciona
- Configuración de la tasa de transferencia almacenada en la extensión de la acuñación (bps, comisión máxima, autoridad de la tasa de transferencia)
- En
Transfer, el programa mueve la porción de la comisión a un "cubo" de retenidas en las cuentas HarvestWithheldTokensToMintagrega las comisiones retenidas a la acuñaciónWithdrawWithheldTokensFromMintenvía las comisiones recolectadas a la cuenta de destino del colector
Matemáticas de la Comisión
| Configuración | Ejemplo | Sobre una transferencia de 1_000_000 en bruto |
|---|---|---|
| 100 bps | 1% | 10_000 de comisión si está por debajo del máximo |
| comisión máxima | 1_000_000 en bruto | Limita la comisión a 1 token de UI (6 decimales) |
Notas de TypeScript
// Al construir transferencias, obtén la acuñación con las extensiones analizadas
// Muestra: cantidad, comisión estimada, neto para el destinatario
// Incluye instrucciones de cosecha en los bots de ejecución de tesoreríaErrores Comunes
- Usuarios sorprendidos por la recepción neta - la UX espera la cantidad bruta. Solución: mostrar el desglose de la comisión antes de firmar.
- Comisiones retenidas atascadas en ATAs - sin ciclo de cosecha. Solución: automatizar
harvest_withhelden un bot de mantenimiento. - Incompatibilidad con DEX - los enrutadores pueden no pasar cuentas de extensión. Solución: verificar el soporte de Token-2022 en Jupiter/Meteora.
- Desbordamiento de puntos base - máximo 10_000 bps (100%). Solución: validar en la creación de la acuñación.
- Asumir instrucción de transferencia clásica - la extensión de comisión requiere el programa Token-2022. Solución: bifurcar según el propietario de la acuñación.
Alternativas
| Alternativa | Usar Cuándo | No Usar Cuándo |
|---|---|---|
| Tasa personalizada con hook de transferencia | Lógica de comisión compleja | La comisión simple de bps es suficiente |
| Impuesto de tesorería en tu programa | Control total en un solo programa | Transferencias de billetera estándar fuera de tu UI |
| Token Clásico + comisión fuera de la cadena | Máxima compatibilidad | Necesidad de una comisión ejecutable en la cadena |
Preguntas Frecuentes
¿Qué son las tasas de transferencia?
Comisión automática deducida en transferencias de Token-2022 según la configuración de la extensión de la acuñación.
¿Quién recibe las comisiones?
La autoridad de la tasa de transferencia retira las comisiones cosechadas a las cuentas colectoras configuradas.
¿Qué son los puntos base?
1 bps = 0.01%. 100 bps = 1% de la cantidad de transferencia antes del límite máximo.
¿Pueden cambiar las comisiones después del lanzamiento?
La autoridad de la tasa de transferencia puede actualizar los bps/máximo dentro de las reglas de la autoridad - documentar la gobernanza.
¿Las comisiones se aplican a la acuñación/quema?
Normalmente solo a las transferencias - verificar la especificación de la extensión para la configuración de tu acuñación.
¿Cómo cosecho las comisiones?
Ejecuta las instrucciones harvest_withheld_tokens_to_mint y luego withdraw_withheld_tokens_from_mint.
¿Las billeteras admiten la visualización de comisiones?
Varía - las billeteras principales están mejorando el soporte de Token-2022; prueba las billeteras de tu objetivo.
¿Puede la comisión ser del 0%?
La extensión puede existir con 0 bps - poco común; omitir la extensión si no se necesita comisión.
¿Impacto en los swaps AMM?
Los swaps son transferencias - se aplican comisiones a menos que el programa del pool maneje exenciones a través de un hook.
¿Pruebas en Devnet?
Usa el mismo ID de programa en devnet con Surfpool 0.12.0 para iteración local.
¿Configuración de comisión inmutable?
Algunos campos son inmutables al inicio - planifica antes de la acuñación en mainnet.
¿Relación con los hooks de transferencia?
Los hooks añaden lógica personalizada; la tasa de transferencia es una extensión nativa con matemáticas más simples.
Relacionado
- Conceptos Básicos de Token-2022 - ID del programa
- Hooks de Transferencia - lógica de transferencia personalizada
- Mejores Prácticas de Token-2022 - verificaciones del cliente
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.