Vendez des USDC en un seul appel de fonction.
Ajoutez l'encaissement sans devenir un exchange. Un seul appel du SDK crée le dépôt sur Base, délègue la tarification et renvoie les identifiants dont votre appli a besoin. Ajoutez Peerlytics plus tard, quand vous aurez besoin du choix de voie, du contexte de l'explorateur, de webhooks ou d'une infrastructure pilotée par des agents.
Mainnet 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.
Surface du SDK
Gardez le code produit au plus près des actions réelles : créer, lister, clôturer, restreindre, observer.
offramp()Créez ou reprenez un dépôt de vente d'USDC, déléguez la tarification et renvoyez depositId + txHash.
deposits()Listez les dépôts d'une adresse quand l'appli a besoin d'une réconciliation restreinte de l'état du propriétaire.
close()Retirez les USDC non exécutés d'un dépôt existant avec le portefeuille signataire.
Restreignez un ordre à un seul portefeuille taker, générez un lien de partage ou supprimez la restriction.
useOfframp() et usePeerExtensionRegistration() pour les frontends d'applis de portefeuille.
PLATFORMS, CURRENCIES, assistants de validation et codes OfframpError.
Voies de développement
Commencez par le cycle de vie du dépôt, puis ajoutez les données et les opérations seulement au besoin.
Ce que ça coûte
La surface développeur, c'est le paquet, les modèles de départ et le contrat typé du SDK.
@usdctofiat/offramp est du TypeScript sous licence MIT, avec des points d'entrée core et React.
Une signature de portefeuille crée le dépôt sur Base. Votre appli ne paie que le gas normal de Base.
La planification de voie, les lectures de l'orderbook, le contexte de l'explorateur, x402, les crédits d'API et les webhooks y résident.
Flux de production
Construisez d'abord le chemin le plus court, puis ajoutez les ordres privés et l'observabilité.
- 01Créez un dépôt délégué depuis le portefeuille de l'utilisateur ou du bot avec offramp().
- 02Utilisez deposits() pour réconcilier l'état local après des rafraîchissements, des relances ou des redémarrages du bot.
- 03Passez otcTaker quand l'acheteur est connu et que l'ordre ne doit pas être exécutable publiquement.
- 04Ajoutez @peerlytics/sdk quand vous avez besoin de planification de voie, de liens publics d'exécution, du contexte de l'explorateur ou de webhooks.
Questions des développeurs
Le SDK détient-il les clés ?
Non. Le SDK signe avec le WalletClient viem que vous passez : le wallet de votre utilisateur, un wallet serveur ou un wallet de bot. Il ne détient jamais de clés privées.
Le SDK déplace-t-il du fiat ?
Non. Le fiat circule directement entre l'acheteur et le vendeur sur l'application de paiement choisie. Le SDK ne gère que l'USDC onchain et le cycle de vie du dépôt.
Ai-je besoin d'une clé d'API pour créer des dépôts ?
Non. La création de dépôts est sans permission, puisque votre wallet signe. Une clé d'API n'est nécessaire que pour enregistrer des webhooks et utiliser l'API Peerlytics.
Comment tester une intégration ?
Il n'y a pas de sandbox public ; le SDK cible le mainnet Base, donc un dépôt de test est réel et trouvable sur l'orderbook ouvert. Utilisez le minimum de 1 USDC, et soit restreignez-le en dépôt OTC (passez otcTaker pour que seul votre propre wallet puisse le remplir), soit acceptez qu'un acheteur puisse le prendre avant que vous n'appeliez close(). Confirmez-le onchain et via deposits(), puis appelez close().
Comment les webhooks sont-ils vérifiés ?
Chaque livraison porte X-Usdctofiat-Signature: t=<unix>,v1=<hex>, un HMAC-SHA256 sur timestamp.rawBody. Le vérificateur de référence dans le dépôt des starters traite les timestamps de plus de 5 minutes comme périmés pour se prémunir des replays ; vous définissez cette fenêtre dans votre propre vérificateur, l'émetteur ne l'impose pas.