Venda USDC em uma chamada de função.
Adicione saque sem virar uma exchange. Uma chamada do SDK cria o depósito na Base, delega a precificação e retorna os identificadores que seu app precisa. Adicione o Peerlytics depois, quando precisar de escolha de rota, contexto do explorador, webhooks ou infraestrutura operada por agentes.
Mainnet da 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.
Superfície do SDK
Mantenha o código do produto perto das ações reais: criar, listar, encerrar, restringir, observar.
offramp()Crie ou retome um depósito de venda de USDC, delegue a precificação e retorne depositId + txHash.
deposits()Liste os depósitos de um endereço quando o app precisar de uma reconciliação restrita do estado do proprietário.
close()Retire o USDC não executado de um depósito existente com a carteira assinante.
Restrinja uma ordem a uma única carteira taker, gere um link de compartilhamento ou remova a restrição.
useOfframp() e usePeerExtensionRegistration() para frontends de apps de carteira.
PLATFORMS, CURRENCIES, auxiliares de validação e códigos OfframpError.
Caminhos de desenvolvimento
Comece pelo ciclo de vida do depósito e só adicione dados e operações quando precisar.
Quanto custa
A superfície para desenvolvedores é o pacote, os modelos iniciais e o contrato tipado do SDK.
@usdctofiat/offramp é TypeScript com licença MIT, com pontos de entrada para core e React.
Uma assinatura de carteira cria o depósito na Base. Seu app paga apenas o gas normal da Base.
Planejamento de rotas, leituras do orderbook, contexto do explorador, x402, créditos de API e webhooks ficam ali.
Fluxo de produção
Construa primeiro o caminho mais curto e depois adicione ordens privadas e observabilidade.
- 01Crie um depósito delegado a partir da carteira do usuário ou do bot com offramp().
- 02Use deposits() para reconciliar o estado local após atualizações, retentativas ou reinícios do bot.
- 03Passe otcTaker quando o comprador for conhecido e a ordem não puder ser executável publicamente.
- 04Adicione @peerlytics/sdk quando precisar de planejamento de rotas, links públicos de execução, contexto do explorador ou webhooks.
Perguntas de desenvolvedores
O SDK custodia chaves?
Não. O SDK assina com o WalletClient da viem que você passa: a carteira do seu usuário, uma server wallet ou uma carteira de bot. Ele nunca guarda chaves privadas.
O SDK movimenta fiat?
Não. O fiat se move diretamente entre o comprador e o vendedor no app de pagamento escolhido. O SDK só cuida do USDC onchain e do ciclo de vida do depósito.
Preciso de uma chave de API para criar depósitos?
Não. Criar depósitos é permissionless, já que a sua carteira assina. Uma chave de API só é necessária para registrar webhooks e usar a API da Peerlytics.
Como faço para testar uma integração?
Não há sandbox público; o SDK aponta para a mainnet da Base, então um depósito de teste é real e descobrível no orderbook aberto. Use o mínimo de 1 USDC e, ou restrinja-o como um depósito OTC (passe otcTaker para que só a sua própria carteira possa preenchê-lo), ou aceite que um comprador pode tomá-lo antes de você chamar close(). Confirme onchain e via deposits(), depois faça o close().
Como os webhooks são verificados?
Cada entrega carrega X-Usdctofiat-Signature: t=<unix>,v1=<hex>, um HMAC-SHA256 sobre timestamp.rawBody. O verificador de referência no repositório de starters trata timestamps mais antigos que 5 minutos como obsoletos para proteger contra replays; você define essa janela no seu próprio verificador, o remetente não a impõe.