PYUSD en Solana: Guía práctica de integración (con RPC de BlockEden.xyz)
PayPal USD (PYUSD) ha llegado a Solana, marcando un hito importante para los pagos digitales. Esta guía ofrece un recorrido directo y orientado a producción para ingenieros que integren PYUSD en carteras, dApps y plataformas de comercio en Solana.
Todos los ejemplos usan código fresco compatible con Token-2022 y están diseñados para funcionar sin problemas con los endpoints RPC de Solana de baja latencia de BlockEden.xyz.
TL;DR
- Qué: PayPal USD (PYUSD) es ahora un token SPL nativo Token-2022 en Solana, que ofrece liquidación rápida y de bajo costo para una stablecoin reconocida globalmente.
- Parámetros clave: Mint
2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo, decimales6y programa de tokenToken-2022. - Conjunto de funciones: Aprovecha las Extensiones de Token de Solana (Token-2022). Tiene un Transfer Hook inicializado pero actualmente inactivo (programa nulo), junto con capacidades de transferencia confidencial y otras extensiones.
- Cross-chain: Una integración oficial con LayerZero permite que PYUSD se mueva entre Ethereum y Solana mediante un mecanismo seguro de quemado y acuñación, evitando puentes tradicionales.
- Acción: Usa esta guía como plantilla lista para añadir soporte de PYUSD a tu aplicación con los RPC fiables de Solana de BlockEden.xyz.
Por qué PYUSD en Solana es importante
La combinación de la marca PayPal con el rendimiento de Solana crea una nueva vía poderosa para dólares digitales.
- Confianza del consumidor + UX cripto: PYUSD es emitido por la compañía fiduciaria regulada Paxos y está profundamente integrado en PayPal y Venmo. Esto brinda a los usuarios un activo familiar. Pueden mantener un único saldo de PYUSD y elegir retirarlo a una cartera externa ya sea en Ethereum o Solana, abstraído de la complejidad de la cadena.
- Rieles listos para pagos: La arquitectura de Solana ofrece finalización de transacciones en menos de un segundo y tarifas que son fracciones de centavo. PYUSD coloca una unidad de cuenta estable y reconocible sobre esta red de liquidación eficiente, haciéndola ideal para pagos, comercio y remesas.
- Controles de nivel institucional: Al lanzarse como token Token-2022, PYUSD puede utilizar extensiones integradas para funciones como transferencias confidenciales, metadatos ricos y un delegado permanente. Esto permite cumplimiento avanzado y funcionalidad sin requerir contratos inteligentes personalizados y difíciles de auditar.
Lo esencial (fija esto)
Antes de escribir una sola línea de código, asegura estos parámetros. Siempre verifica la dirección del mint en un explorador de confianza para evitar interactuar con tokens fraudulentos.
- Mint (Mainnet):
2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo - Decimales:
6(significa 1 PYUSD = 1,000,000 unidades base) - Programa de token:
Token-2022(Program ID:TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) - Extensiones de token usadas (en el mint):
- Metadata y Metadata Pointer
- Delegado permanente
- Transfer Hook (inicializado con programa nulo)
- Configuración de Transferencia Confidencial
Puedes verificar todo esto en el Explorador de Solana. El explorador mostrará claramente la dirección oficial del mint y sus extensiones habilitadas.
Configura tu proyecto
Preparemos el entorno. Necesitarás las últimas librerías web3 y SPL token de Solana para garantizar compatibilidad total con Token-2022.
1. Librerías
Instala los paquetes necesarios desde npm.
npm i @solana/web3.js @solana/spl-token
2. Conexión RPC
Apunta tu aplicación al endpoint RPC de Solana Mainnet de BlockEden.xyz. Para producción, las variables de entorno son obligatorias.
// package.json
// npm i @solana/web3.js @solana/spl-token
import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import {
TOKEN_2022_PROGRAM_ID,
getMint,
getOrCreateAssociatedTokenAccount,
getAssociatedTokenAddress,
createTransferCheckedInstruction,
} from "@solana/spl-token";
// Usa tu URL RPC de Solana de BlockEden.xyz desde tu panel
const RPC_ENDPOINT =
process.env.SOLANA_RPC_URL ??
"[https://your-blockeden-solana-mainnet-endpoint.com](https://your-blockeden-solana-mainnet-endpoint.com)";
export const connection = new Connection(RPC_ENDPOINT, "confirmed");
// PYUSD (mainnet)
export const PYUSD_MINT = new PublicKey(
"2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",
);
Lectura de datos del Mint PYUSD
Primero, confirmemos programáticamente las propiedades del mint PYUSD. Este es un paso crucial para asegurar que tus constantes sean correctas y obtener detalles como el suministro total.
// Confirmar información del mint PYUSD vía APIs Token-2022
const mintInfo = await getMint(
connection,
PYUSD_MINT,
"confirmed",
TOKEN_2022_PROGRAM_ID, // Especificar el ID del programa
);
console.log({
supply: mintInfo.supply.toString(),
decimals: mintInfo.decimals, // Esperado 6
isInitialized: mintInfo.isInitialized,
});
Observa que pasamos explícitamente TOKEN_2022_PROGRAM_ID. Esta es la fuente más común de errores al trabajar con extensiones de token.
Crear o obtener Cuentas de Token Asociadas (ATAs)
Las Cuentas de Token Asociadas para tokens Token-2022 deben derivarse usando el ID del programa Token-2022. Si usas el TOKEN_PROGRAM_ID legado, las transacciones fallarán con error “incorrect program id”.
// Pagador y propietario de la nueva ATA. Reemplaza con la lógica de tu wallet.
const owner = Keypair.generate();
// Crear o obtener la ATA PYUSD del propietario (compatible con Token-2022)
const ownerAta = await getOrCreateAssociatedTokenAccount(
connection,
owner, // Pagador para la creación
PYUSD_MINT, // Mint
owner.publicKey, // Propietario de la ATA
false, // allowOwnerOffCurve
"confirmed",
undefined, // options
TOKEN_2022_PROGRAM_ID, // <-- IMPORTANTE: usar ID del programa Token-2022
);
console.log("Owner PYUSD ATA:", ownerAta.address.toBase58());
Verificar saldos de PYUSD
Para consultar el saldo de PYUSD de un usuario, consulta su ATA, recordando especificar el ID de programa correcto.
Usando @solana/spl-token
import { getAccount } from "@solana/spl-token";
const accountInfo = await getAccount(
connection,
ownerAta.address,
"confirmed",
TOKEN_2022_PROGRAM_ID,
);
const balance = Number(accountInfo.amount) / 10 ** mintInfo.decimals; // decimales = 6
console.log("PYUSD balance:", balance);
Usando JSON-RPC directo (curl)
También puedes consultar todas las cuentas de token de un propietario y filtrarlas por el ID del programa Token-2022.
curl -X POST "$SOLANA_RPC_URL" -H 'content-type: application/json' -d '{
"jsonrpc":"2.0",
"id":1,
"method":"getTokenAccountsByOwner",
"params":[
"<OWNER_PUBLIC_KEY>",
{ "programId":"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" },
{ "encoding":"jsonParsed" }
]
}'
Transferir PYUSD (usuario a usuario)
La regla de oro para transferir cualquier activo Token-2022 es usar createTransferCheckedInstruction. Esta instrucción incluye los decimales del token, evitando vulnerabilidades relacionadas con decimales.
Aquí tienes una función reutilizable completa para transferir PYUSD.
import { Transaction } from '@solana/web3.js';
async function transferPyusd({
fromWallet, // Keypair del remitente
toPubkey, // PublicKey del destinatario
uiAmount, // Monto en PYUSD, p.ej., 1.25
}: {
fromWallet: Keypair;
toPubkey: PublicKey;
uiAmount: number;
}) {
const decimals = 6; // De mintInfo.decimals
const rawAmount = BigInt(Math.round(uiAmount * (10 ** decimals)));
// Obtener la dirección ATA del remitente
const fromAta = await getAssociatedTokenAddress(
PYUSD_MINT,
fromWallet.publicKey,
false,
TOKEN_2022_PROGRAM_ID
);
// Asegurar que el ATA del destinatario exista para Token-2022
const toAta = await getOrCreateAssociatedTokenAccount(
connection,
fromWallet, // Pagador
PYUSD_MINT,
toPubkey,
false,
'confirmed',
undefined,
TOKEN_2022_PROGRAM_ID
);
const transferInstruction = createTransferCheckedInstruction(
fromAta, // ATA origen
PYUSD_MINT, // Mint
toAta.address, // ATA destino
fromWallet.publicKey, // Propietario del ATA origen
rawAmount, // Monto en unidades base
decimals, // Decimales
[], // Firmas multisig
TOKEN_2022_PROGRAM_ID // <-- IMPORTANTE
);
const transaction = new Transaction().add(transferInstruction);
// Establecer blockhash reciente y pagador de tarifas
transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
transaction.feePayer = fromWallet.publicKey;
const signature = await connection.sendTransaction(transaction, [fromWallet]);
await connection.confirmTransaction(signature, 'confirmed');
console.log('Transaction successful with signature:', signature);
return signature;
}
Nota sobre el Transfer Hook: El mint de PYUSD inicializa la extensión Transfer Hook pero establece su programa en null. Esto significa que las transferencias estándar funcionan actualmente sin cuentas o lógica adicional. Si PayPal/Paxos activan el hook en el futuro, actualizarán el mint para apuntar a un nuevo programa y tu integración deberá pasar las cuentas extra requeridas por esa interfaz.