Desenvolvedores

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.

@usdctofiat/offramp v4.xMainnet da BaseMIT · ESM + CJS
Off-ramp em uma chamadaMainnet da Base
import { 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>
  );
}
Crie um depósito e leia o resultado
create-deposit.ts
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);
OfframpResult
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.

Auxiliares de OTC

Restrinja uma ordem a uma única carteira taker, gere um link de compartilhamento ou remova a restrição.

Hooks do React

useOfframp() e usePeerExtensionRegistration() para frontends de apps de carteira.

Mapas tipados

PLATFORMS, CURRENCIES, auxiliares de validação e códigos OfframpError.

Quanto custa

A superfície para desenvolvedores é o pacote, os modelos iniciais e o contrato tipado do SDK.

Pacote
$0

@usdctofiat/offramp é TypeScript com licença MIT, com pontos de entrada para core e React.

Criação de depósito
Sem chave

Uma assinatura de carteira cria o depósito na Base. Seu app paga apenas o gas normal da Base.

Plano de dados
Peerlytics

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.

  1. 01Crie um depósito delegado a partir da carteira do usuário ou do bot com offramp().
  2. 02Use deposits() para reconciliar o estado local após atualizações, retentativas ou reinícios do bot.
  3. 03Passe otcTaker quando o comprador for conhecido e a ordem não puder ser executável publicamente.
  4. 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.