Conceptos básicos de Token-2022
9 ejemplos para empezar con Token-2022 (Extensiones de Token) - 7 básicos y 2 intermedios.
Prerrequisitos
solana config set --url devnet
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --versioncargo add anchor-lang@0.32.1 anchor-spl@0.32.1ID del programa Token-2022: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.
Ejemplos básicos
1. Crear una acuñación de Token-2022
Mismo flujo de CLI que el Token SPL clásico con ID de programa explícito.
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --decimals 6- La cuenta de acuñación es más grande cuando las extensiones están habilitadas
- La acuñación predeterminada sin extensiones se comporta como el Token clásico
- Siempre pase el ID del programa en las rutas de derivación del cliente
Relacionado: Tarifas de transferencia - extensión de tarifa
2. Crear ATA para Token-2022 Mint
La derivación de ATA incluye el ID del programa de token.
spl-token create-account <MINT> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb- Un ID de programa incorrecto en la derivación genera una dirección ATA incorrecta
- El programa de Token Asociado se comparte con el Token clásico
- El alquiler escala con el tamaño de la cuenta cuando las extensiones se adjuntan a las cuentas
Relacionado: Cuentas de Token Asociadas (ATA)
3. Inspeccionar el diseño de la extensión
La visualización muestra las extensiones habilitadas en la acuñación/cuenta.
spl-token display <MINT> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb- Los datos de la extensión se añaden al diseño SPL base
- Las extensiones inmutables no se pueden eliminar después de la inicialización
- Planifique el conjunto de extensiones antes de la creación de la acuñación en mainnet
Relacionado: Metadatos y puntero de metadatos
4. Acuñar y transferir (sin extensiones)
El Token-2022 base sin extensiones refleja el comportamiento clásico.
spl-token mint <MINT> 1000000 --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
spl-token transfer <MINT> 500000 <RECIPIENT> --fund-recipient --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb- Las billeteras deben detectar el programa Token-2022 en el campo del propietario de la cuenta de acuñación
- El paquete
@solana-program/token-2022proporciona constructores de instrucciones - El soporte de DEX varía; verifique la compatibilidad del enrutador
Relacionado: Migración desde SPL Token
5. Leer el programa propietario de la acuñación a través de RPC
Los clientes se ramifican según el programa de token antes de construir las instrucciones.
import { createSolanaRpc, address } from "@solana/kit";
const TOKEN_2022 = address("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const { value } = await rpc.getAccountInfo(address("MINT_PUBKEY")).send();
const isToken2022 = value?.owner === TOKEN_2022;
console.log("Token-2022 mint:", isToken2022);- El campo
ownerde la acuñación es el ID del programa de token - Utilice el paquete correcto para la codificación de instrucciones
- DAS puede unificar lecturas; las transacciones aún necesitan el programa correcto
Relacionado: Lectura de NFTs (API DAS)
6. Habilitar la extensión de tarifa de transferencia (CLI)
Extensión de ingresos común configurada en la inicialización de la acuñación.
# Las banderas de extensión varían según la versión de spl-token - consulte la página de tarifas de transferencia para el flujo completo
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --decimals 6 --enable-transfer-fees- Los puntos básicos de la tarifa y la tarifa máxima se establecen en los datos de inicialización de la extensión
- Las tarifas retenidas se acumulan en las cuentas hasta que se cosechan
- Las billeteras deben mostrar el monto neto recibido
Relacionado: Tarifas de transferencia
7. Usar token_interface en Anchor
Ruta de código única para acuñaciones de Token y Token-2022.
use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
#[derive(Accounts)]
pub struct Deposit<'info> {
pub mint: InterfaceAccount<'info, Mint>,
#[account(mut)]
pub user_token: InterfaceAccount<'info, TokenAccount>,
pub token_program: Interface<'info, TokenInterface>,
}InterfaceAccountdeserializa ambos diseños de programa- Pase la cuenta
token_programreal que coincida con el propietario de la acuñación - Requerido para protocolos que aceptan tokens listados arbitrariamente
Relacionado: SPL Token en Programas
Ejemplos intermedios
8. Descripción general de la extensión Transfer Hook
Programa personalizado invocado en cada transferencia.
// ID del programa de gancho de transferencia almacenado en la extensión de acuñación
// Token-2022 CPIs al gancho con cuentas adicionales de remaining_accounts- El gancho puede aplicar listas de permitidos, regalías o contabilidad
- Las cuentas adicionales deben pasarse en las transacciones del cliente
- CU avanzada y modos de fallo - probar en Surfpool 0.12.0
Relacionado: Ganchos de transferencia
9. Elegir extensiones para los requisitos del producto
| Necesidad | Extensión |
|---|---|
| Ingresos en transferencias | Tarifa de transferencia |
| Puerta de enlace de cumplimiento | Estado de cuenta predeterminado + no transferible |
| Metadatos en la acuñación | Puntero de metadatos |
| Privacidad | Transferencia confidencial |
- Habilite solo lo que necesita: las extensiones inmutables agregan complejidad permanente
- Documente el comportamiento de las billeteras no compatibles para los usuarios
Relacionado: Mejores prácticas de Token-2022
Versiones de la pila: Esta página se escribió 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.