Transferir USDC con Node.js y Ethers.js

Resumen

Enviar USDC de una billetera a otra usando Node.js y Ethers.js es posible sin depender de los productos de Circle, siempre que configures correctamente el contrato del token, el RPC y las claves de tu wallet. Esta guía está pensada para desarrolladores Web3 que quieren entender cómo automatizar transferencias en la red de prueba Ethereum Sepolia.

La lógica es directa: instalas una librería para hablar con la blockchain, defines el contrato del token, conectas un nodo RPC y firmas la transacción con la clave privada de la billetera que envía. Y aquí viene lo interesante: cada uno de esos pasos tiene un detalle técnico que vale la pena entender antes de ejecutar el script.

Cómo preparo el entorno con Node.js y Ethers.js

Lo primero es montar las herramientas básicas. Ethers.js es la librería de JavaScript que actúa como puente entre tu código y la blockchain de Ethereum.

Desde la terminal corres npm i ethers y se instalan los paquetes necesarios. Después creas un archivo, en este ejemplo send.js, y lo abres en tu editor preferido. VS Code funciona bien, pero cualquier editor sirve [0:30].

¿Qué hace Ethers.js en un script de transferencia? Es una librería de JavaScript que permite a tu aplicación interactuar con la blockchain: conectarse a un nodo, leer contratos y firmar transacciones.

El objetivo del programa es claro: mover USDC de una wallet de envío a una wallet de recepción. En el ejemplo se usan dos cuentas de MetaMask, Circle Sending con 9 USDC y algo de Sepolia ETH para pagar gas, y Circle Receiving con 1 USDC y sin ETH [1:20].

Cómo encuentro el token contract de USDC en Sepolia

Antes de transferir, necesitas la dirección exacta del smart contract de USDC en la red que vas a usar. Cada red (mainnet, Sepolia, Polygon) tiene su propia dirección.

La fuente oficial es la documentación de Circle. Entras a circle.com, eliges build Web3 enabled apps, te registras y dentro de docs buscas USDC. En la sección USDC on Test Networks aparece el contrato para Ethereum Sepolia, que copias y pegas en tu script para verificar que coincide con el que viene en el código de ejemplo [2:40].

Por qué importa el ABI del contrato

El ABI (Application Binary Interface) le dice a tu script qué funciones del contrato vas a usar. En este caso solo necesitas una: transfer.

En el ABI defines la función transfer junto con sus inputs, outputs, state mutability y type. Con eso, Ethers.js sabe cómo construir la llamada al contrato sin que tengas que cargar el contrato completo.

Luego creas una instancia del contrato dentro del script, que es la versión local con la que vas a trabajar para ejecutar la transferencia.

Cómo configuro el RPC endpoint con Infura

Un nodo RPC es lo que conecta tu aplicación con la blockchain. Sin él, tu script no tiene forma de enviar la transacción a la red.

Infura es uno de los proveedores más usados. El flujo es así:

  1. Entras a infura.io y vas al dashboard.
  2. Creas una cuenta si no la tienes y haces clic en create new API key.
  3. Le pones un nombre y eliges la red, en este caso Ethereum Sepolia.
  4. Guardas y copias el endpoint que te entrega Infura.
  5. Lo pegas en tu script reemplazando el placeholder de RPC endpoint.

Con ese endpoint, inicias el provider de Ethers.js, que es el objeto encargado de mandar y recibir información de la blockchain [4:10].

¿Qué es un RPC endpoint? Es la URL de un nodo que recibe las peticiones de tu aplicación y las traduce en operaciones sobre la blockchain.

Qué datos de la billetera necesito y cómo manejo la clave privada

Para que el script funcione, debes proporcionar tres datos: la dirección de la wallet que envía, la dirección de la wallet que recibe y la clave privada de la wallet emisora.

Las direcciones las copias directamente desde MetaMask. La clave privada es más delicada: la sacas entrando a tu cuenta en MetaMask, haciendo clic en account details y luego en show private key. MetaMask te pide la contraseña de la cuenta y te muestra la clave con un hold to reveal [6:30].

Una clave privada es el control total sobre los fondos de esa wallet. Nunca la pegues en repositorios públicos, capturas de pantalla, chats ni archivos sin cifrar. En el video se ve borrosa intencionalmente y la wallet usada está vacía, justo para evitar exponerla.

¿Por qué nunca debo compartir mi private key? Porque cualquiera con acceso a esa clave puede mover todos los fondos de la billetera sin permiso adicional. Es equivalente a entregar la cuenta completa.

Con las direcciones cargadas, la clave privada definida y el contrato instanciado, el script queda listo para llamar a la función transfer y mover los USDC entre wallets de forma programática. Cuéntame en los comentarios qué red vas a usar tú para tu primer envío.