Vendi USDC in una sola chiamata di funzione.
Aggiungi l'incasso senza diventare un exchange. Una sola chiamata SDK crea il deposito su Base, delega la determinazione del prezzo e restituisce gli identificativi che la tua app richiede. Aggiungi Peerlytics in seguito, quando ti servono scelta del percorso, contesto dell'explorer, webhook o infrastruttura gestita da agenti.
Mainnet di 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 dell'SDK
Tieni il codice del prodotto vicino alle azioni reali: creare, elencare, chiudere, limitare, osservare.
offramp()Crea o riprendi un deposito di vendita di USDC, delega la determinazione del prezzo e restituisce depositId + txHash.
deposits()Elenca i depositi di un indirizzo quando l'app necessita di una riconciliazione mirata dello stato del proprietario.
close()Preleva l'USDC non eseguito da un deposito esistente con il wallet firmatario.
Limita un ordine a un solo wallet taker, genera un link da condividere o rimuovi la restrizione.
useOfframp() e usePeerExtensionRegistration() per i frontend delle app di wallet.
PLATFORMS, CURRENCIES, helper di validazione e codici OfframpError.
Percorsi di sviluppo
Parti dal ciclo di vita del deposito, poi aggiungi dati e operazioni solo quando servono.
Quanto costa
La superficie per sviluppatori è il pacchetto, i template iniziali e il contratto tipizzato dell'SDK.
@usdctofiat/offramp è TypeScript con licenza MIT, con entry point core e React.
Una firma del wallet crea il deposito su Base. La tua app paga solo il normale gas di Base.
Pianificazione del percorso, letture dell'orderbook, contesto dell'explorer, x402, crediti API e webhook risiedono lì.
Flusso di produzione
Costruisci prima il percorso più breve, poi aggiungi ordini privati e osservabilità.
- 01Crea un deposito delegato dal wallet dell'utente o del bot con offramp().
- 02Usa deposits() per riconciliare lo stato locale dopo aggiornamenti, retry o riavvii del bot.
- 03Passa otcTaker quando l'acquirente è noto e l'ordine non deve essere eseguibile pubblicamente.
- 04Aggiungi @peerlytics/sdk quando ti servono pianificazione del percorso, link pubblici di esecuzione, contesto dell'explorer o webhook.
Domande degli sviluppatori
L'SDK custodisce le chiavi?
No. L'SDK firma con il WalletClient di viem che gli passi: il wallet del tuo utente, un server wallet o un bot wallet. Non detiene mai chiavi private.
L'SDK movimenta fiat?
No. Il fiat si muove direttamente tra acquirente e venditore sull'app di pagamento scelta. L'SDK gestisce solo gli USDC onchain e il ciclo di vita del deposito.
Mi serve una chiave API per creare depositi?
No. La creazione dei depositi è permissionless, dato che firma il tuo wallet. Una chiave API serve solo per registrare i webhook e per usare l'API Peerlytics.
Come si testa un'integrazione?
Non esiste una sandbox pubblica; l'SDK opera sulla mainnet di Base, quindi un deposito di prova è reale e individuabile sull'orderbook aperto. Usa il minimo di 1 USDC e o limitalo come deposito OTC (passa otcTaker così solo il tuo wallet può eseguirlo) oppure accetta che un acquirente possa eseguirlo prima che tu chiami close(). Confermalo onchain e tramite deposits(), poi esegui close().
Come si verificano i webhook?
Ogni consegna porta X-Usdctofiat-Signature: t=<unix>,v1=<hex>, un HMAC-SHA256 su timestamp.rawBody. Il verificatore di riferimento nel repository degli starter considera obsoleti i timestamp più vecchi di 5 minuti per difendersi dai replay; imposti quella finestra nel tuo verificatore, il mittente non la impone.