EN

TransferFeeConfig (extensión)

Extensión del lado Mint de Token-2022 que cobra una comisión porcentual en cada transferencia. Las comisiones se acumulan como saldos retenidos en las Token Accounts destinatarias y las reclama más tarde la autoridad de retiro.

Token-2022 Program 108 bytes

Ejemplo: PYUSD Mint (Token-2022)

(en caché; se actualiza cada hora · solo mainnet)

Mint Owner Amount Delegate Option Delegate (empty) State Is Native Native (reserved) Delegated Amount Close Authority Option Close Authority (empty) Account Type (Token-2022) MintCloseAuthority (header) Close Authority PermanentDelegate (header) Delegate TransferFeeConfig (header) Transfer Fee Config Authority Withdraw Withheld Authority Fee Config Data ConfidentialTransferMint (header) ConfidentialTransferMint ConfidentialTransferFee (header) ConfidentialTransferFee TransferHook (header) Hook Authority Hook Program ID MetadataPointer (header) Pointer Authority Metadata Address TokenMetadata (header) Update Authority Mint Name Symbol URI Data
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 01 00 00 00 6c 91 aa 49 65 90 12 f8 ab e9 61 ec
0010 24 b6 10 74 92 65 47 53 2f f0 94 ed 5b 69 39 82
0020 db 98 73 13 12 cd 38 46 01 a4 02 00 06 01 01 00
0030 00 00 17 85 32 61 ef 6a b8 53 2a 67 f0 53 86 5a
0040 ad 31 29 3f cf 07 cf 12 0a b5 b9 a1 57 06 54 8d
0050 c0 2b 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00a0 00 00 00 00 00 01 03 00 20 00 17 85 32 61 ef 6a
00b0 b8 53 2a 67 f0 53 86 5a ad 31 29 3f cf 07 cf 12
00c0 0a b5 b9 a1 57 06 54 8d c0 2b 0c 00 20 00 17 85
00d0 32 61 ef 6a b8 53 2a 67 f0 53 86 5a ad 31 29 3f
00e0 cf 07 cf 12 0a b5 b9 a1 57 06 54 8d c0 2b 01 00
00f0 6c 00 17 85 32 61 ef 6a b8 53 2a 67 f0 53 86 5a
0100 ad 31 29 3f cf 07 cf 12 0a b5 b9 a1 57 06 54 8d
0110 c0 2b 17 85 32 61 ef 6a b8 53 2a 67 f0 53 86 5a
0120 ad 31 29 3f cf 07 cf 12 0a b5 b9 a1 57 06 54 8d
0130 c0 2b 00 00 00 00 00 00 00 00 5d 02 00 00 00 00
0140 00 00 00 00 00 00 00 00 00 00 00 00 5d 02 00 00
0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00
0160 41 00 17 85 32 61 ef 6a b8 53 2a 67 f0 53 86 5a
0170 ad 31 29 3f cf 07 cf 12 0a b5 b9 a1 57 06 54 8d
0180 c0 2b 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01a0 00 00 00 10 00 81 00 17 85 32 61 ef 6a b8 53 2a
01b0 67 f0 53 86 5a ad 31 29 3f cf 07 cf 12 0a b5 b9
01c0 a1 57 06 54 8d c0 2b 1c 37 e6 43 3b 73 04 dd 82
01d0 73 7a e4 0d 9b 8b f3 c4 9f 5b 0e 6c 49 a8 d5 33
01e0 28 b3 e5 06 90 1c 57 01 00 00 00 00 00 00 00 00
01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0220 00 00 00 00 00 00 00 00 0e 00 40 00 17 85 32 61
0230 ef 6a b8 53 2a 67 f0 53 86 5a ad 31 29 3f cf 07
0240 cf 12 0a b5 b9 a1 57 06 54 8d c0 2b 00 00 00 00
0250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0260 00 00 00 00 00 00 00 00 00 00 00 00 12 00 40 00
0270 17 85 32 61 ef 6a b8 53 2a 67 f0 53 86 5a ad 31
0280 29 3f cf 07 cf 12 0a b5 b9 a1 57 06 54 8d c0 2b
0290 17 92 48 3b 6c 8a 2a 87 b7 47 1d 81 4f 95 91 f9
02a0 39 5c 84 0a 9c e3 d9 f4 d5 ba 7d 3a 4b 8a 74 9e
02b0 13 00 ae 00 17 85 32 61 ef 6a b8 53 2a 67 f0 53
02c0 86 5a ad 31 29 3f cf 07 cf 12 0a b5 b9 a1 57 06
02d0 54 8d c0 2b 17 92 48 3b 6c 8a 2a 87 b7 47 1d 81
02e0 4f 95 91 f9 39 5c 84 0a 9c e3 d9 f4 d5 ba 7d 3a
02f0 4b 8a 74 9e 0a 00 00 00 50 61 79 50 61 6c 20 55
0300 53 44 05 00 00 00 50 59 55 53 44 4f 00 00 00 68
0310 74 74 70 73 3a 2f 2f 74 6f 6b 65 6e 2d 6d 65 74
0320 61 64 61 74 61 2e 70 61 78 6f 73 2e 63 6f 6d 2f
0330 70 79 75 73 64 5f 6d 65 74 61 64 61 74 61 2f 70
0340 72 6f 64 2f 73 6f 6c 61 6e 61 2f 70 79 75 73 64
0350 5f 6d 65 74 61 64 61 74 61 2e 6a 73 6f 6e 00 00
0360 00 00

Qué es

TransferFeeConfig es una extensión de Mint de Token-2022 que impone una comisión porcentual en cada transferencia del token. Las comisiones no van a una tesorería en el momento de la transferencia — se acumulan como saldos retenidos dentro de la Token Account del destinatario (mediante la extensión emparejada TransferFeeAmount), y la withdraw_withheld_authority las reclama más tarde.

Por qué existe

SPL Token no tiene comisiones nativas. Los protocolos (DEX, apps de pago, aplicadores de regalías de NFT) cobran comisiones enrutando a través de una billetera extra a nivel de aplicación — con pérdidas, difícil de auditar, fácil de eludir. Token-2022 permite que la propia Mint aplique una política de comisiones, de modo que cada transferencia del token paga la comisión, ya pase por un DEX, un envío de billetera o una CPI desde otro protocolo.

Diseño de bytes

Esta es la carga útil de una entrada TLV TransferFeeConfig (extension_type = 1, length = 108). La entrada on-chain completa son 4 bytes de cabecera TLV (consulta el primer de diseño TLV) más esta carga útil de 108 bytes.

Offset Tamaño Campo Tipo Notas
0 32 transfer_fee_config_authority OptionalNonZeroPubkey Actualiza la configuración de comisiones. Pubkey a cero = None (deshabilitada — comisiones congeladas para siempre). Sin byte de etiqueta.
32 32 withdraw_withheld_authority OptionalNonZeroPubkey Reclama las comisiones retenidas de las Token Accounts. Todo a cero = None (comisiones no cobrables).
64 8 withheld_amount u64 LE Total de comisiones retenidas a nivel de Mint (separado de los montos retenidos por cuenta).
72 18 older_transfer_fee struct TransferFee Configuración previa a la actualización — activa hasta que llega newer.epoch.
90 18 newer_transfer_fee struct TransferFee Configuración activa a partir de newer.epoch.

El struct anidado TransferFee ocupa 18 bytes:

Offset Tamaño Campo Tipo Notas
0 8 epoch u64 LE Epoch en que esta configuración entró (o entrará) en vigor.
8 8 maximum_fee u64 LE Tope absoluto en unidades atómicas (por transferencia).
16 2 transfer_fee_basis_points u16 LE Tasa de comisión en puntos básicos (100 = 1%).

Carga útil total: 108 bytes.

Por qué dos configuraciones de comisión

Los cambios de comisión no surten efecto de inmediato. Cuando la autoridad fija una nueva comisión vía SetTransferFee, el valor va a newer_transfer_fee con epoch fijado dos epochs por delante; hasta entonces, la red sigue cobrando older_transfer_fee. El modelo de dos configuraciones + epoch da a los titulares una ventana para reaccionar antes de que entre la nueva tasa.

Un decodificador que muestre la comisión actual debe leer el epoch actual del clúster y elegir newer si epoch_actual >= newer.epoch, en caso contrario older. Mostrar solo newer.transfer_fee_basis_points es el error canónico aquí.

Dónde lo encuentras

PYUSD (la stablecoin de PayPal) lleva esta extensión con una configuración de 0 puntos básicos — presente para la auditabilidad de cumplimiento sin cobrar realmente. Los despliegues con comisión real son más raros pero crecientes: tokens comunitarios de reparto de ingresos, tokens RWA con regalías de transferencia, y algunos memecoins experimentales que enrutan comisiones a una billetera del creador.

Errores comunes

  • Las extensiones de Token-2022 usan una tercera codificación opcional: OptionalNonZeroPubkey. Mismo tamaño de 32 bytes que una Pubkey normal sin byte de etiqueta — todos los bytes a cero significan None. Distinta tanto del COption<Pubkey> de SPL (etiqueta de 4 bytes + 32 = 36 bytes) como del Option<Pubkey> de Borsh (etiqueta de 1 byte + 32 = 33 bytes). Tres codificaciones opcionales coexisten en una sola cuenta de Token-2022.
  • Las comisiones se retienen, no se queman. La comisión se resta del saldo del emisor y aterriza en la extensión TransferFeeAmount.withheld_amount por cuenta del destinatario. La withdraw_withheld_authority luego las recoge vía WithdrawWithheldTokensFromAccounts y WithdrawWithheldTokensFromMint.
  • maximum_fee es por transferencia, no por periodo. Una comisión del 1% sobre una transferencia de 1.000.000 USDC con maximum_fee = 1000 se topa en $0,001 (unidades atómicas = 1000), no en los $10.000 que implicarían los puntos básicos sobre una comisión sin tope.
  • Retraso de actualización de dos epochs. Fijar una nueva comisión no surte efecto hasta el epoch siguiente al siguiente — aproximadamente cuatro o cinco días en producción. Planifica los textos de la interfaz y las notificaciones en torno a ese retraso.
  • Leer la comisión activa requiere el epoch actual del clúster. No muestres los parámetros de newer_transfer_fee como «la comisión» a menos que el epoch haya cambiado; de lo contrario, los usuarios ven una tasa que aún no están pagando.

Última verificación: 2026-05-19