Vende USDC con una sola llamada de función.
Añade retiros sin convertirte en un exchange. Una sola llamada del SDK crea el depósito en Base, delega la fijación de precios y devuelve los identificadores que tu app necesita. Añade Peerlytics más adelante cuando necesites elección de vía, contexto del explorador, webhooks o infraestructura operada por agentes.
Mainnet de Baseimport { useOfframp } from "@usdctofiat/offramp/react";
import { CURRENCIES, PLATFORMS } from "@usdctofiat/offramp";
function SellButton({ walletClient }) {
const { offramp, isLoading } = useOfframp();
return (
<button
disabled={isLoading}
onClick={() =>
offramp(walletClient, {
amount: "100",
platform: PLATFORMS.VENMO,
currency: CURRENCIES.USD,
identifier: "alice",
})
}
>
Sell 100 USDC
</button>
);
}import { CURRENCIES, PLATFORMS, offramp } from "@usdctofiat/offramp";
const result = await offramp(walletClient, {
amount: "100",
platform: PLATFORMS.REVOLUT,
currency: CURRENCIES.EUR,
identifier: "alice",
integratorId: "your-app",
referralId: "partner-123",
});
console.log(result.depositId, result.txHash, result.resumed);- depositId
- Escrow deposit ID. Reconcile and close against it.
- txHash
- Base transaction hash for the deposit creation.
- resumed
- true when an existing undelegated deposit was reused.
- otcLink
- Buyer link for private deposits; null when public.
Superficie del SDK
Mantén el código del producto cerca de las acciones reales: crear, listar, cerrar, restringir, observar.
offramp()Crea o reanuda un depósito de venta de USDC, delega la fijación de precios y devuelve depositId + txHash.
deposits()Lista los depósitos de una dirección cuando la app necesite una reconciliación acotada del estado del propietario.
close()Retira el USDC no ejecutado de un depósito existente con la billetera firmante.
Restringe una orden a una sola billetera taker, genera un enlace para compartir o elimina la restricción.
useOfframp() y usePeerExtensionRegistration() para frontends de apps de billetera.
PLATFORMS, CURRENCIES, ayudantes de validación y códigos OfframpError.
Rutas de desarrollo
Empieza con el ciclo de vida del depósito y luego añade datos y operaciones solo cuando haga falta.
Cuánto cuesta
La superficie para desarrolladores es el paquete, las plantillas iniciales y el contrato tipado del SDK.
@usdctofiat/offramp es TypeScript con licencia MIT, con puntos de entrada para core y React.
Una firma de billetera crea el depósito en Base. Tu app solo paga el gas normal de Base.
La planificación de vías, las lecturas del orderbook, el contexto del explorador, x402, los créditos de API y los webhooks viven ahí.
Flujo de producción
Construye primero la ruta más corta y luego añade órdenes privadas y observabilidad.
- 01Crea un depósito delegado desde la billetera del usuario o del bot con offramp().
- 02Usa deposits() para reconciliar el estado local tras refrescos, reintentos o reinicios del bot.
- 03Pasa otcTaker cuando el comprador es conocido y la orden no debe ser ejecutable públicamente.
- 04Añade @peerlytics/sdk cuando necesites planificación de vías, enlaces públicos de toma, contexto del explorador o webhooks.
Preguntas de desarrolladores
¿El SDK custodia claves?
No. El SDK firma con el WalletClient de viem que le pasas: la wallet de tu usuario, una wallet de servidor o una wallet de bot. Nunca guarda claves privadas.
¿El SDK mueve fiat?
No. El fiat se mueve directamente entre el comprador y el vendedor en la app de pago elegida. El SDK solo gestiona el USDC onchain y el ciclo de vida del depósito.
¿Necesito una clave de API para crear depósitos?
No. Crear depósitos no requiere permisos, ya que tu wallet firma. Solo se necesita una clave de API para registrar webhooks y usar la API de Peerlytics.
¿Cómo pruebo una integración?
No hay sandbox público; el SDK apunta a la mainnet de Base, así que un depósito de prueba es real y visible en el orderbook abierto. Usa el mínimo de 1 USDC y, o bien restríngelo como depósito OTC (pasa otcTaker para que solo tu propia wallet pueda completarlo), o acepta que un comprador podría tomarlo antes de que llames a close(). Confírmalo onchain y mediante deposits(), y luego ciérralo con close().
¿Cómo se verifican los webhooks?
Cada entrega lleva X-Usdctofiat-Signature: t=<unix>,v1=<hex>, un HMAC-SHA256 sobre timestamp.rawBody. El verificador de referencia en el repo de starters trata como caducadas las marcas de tiempo de más de 5 minutos para protegerse de repeticiones; esa ventana la fijas tú en tu propio verificador, el emisor no la impone.