BlendFi
OfframpConceitos

Lock por usuário e tipo

Um cliente final só pode ter uma conversão offramp aberta por vez. Por que, qual erro você recebe, quando o lock libera.

A BlendFi limita cada cliente final a uma conversão aberta por tipo (pix_offramp ou pix_onramp) por vez. Tentar criar uma segunda conversão offramp para o mesmo cliente final enquanto a primeira está aberta retorna erro.

A regra

Para qualquer (user_id, transaction_type), no máximo uma conversão pode estar nos estados abertos: awaiting_deposit, partially_funded (transiente, nunca observado) e standby.

A regra é cross-direction permissiva: o mesmo cliente final pode ter uma onramp aberta e uma offramp aberta simultaneamente, mas não duas do mesmo tipo.

Por que essa regra existe

USDT é fungível. O endereço de depósito é por conversão. Se um cliente final tivesse duas offramps abertas ao mesmo tempo, um depósito ambíguo poderia ser matchado em mais de uma operação aberta. A regra elimina a ambiguidade na origem: cada depósito tem uma única conversão de destino.

Quando o lock libera

O lock é liberado assim que a conversão entra em estado terminal:

  • completed, failed, expired, canceled, abandoned, liquidated (transitório terminal antes de completed/failed).

Em liquidated, o lock segue ativo apenas até a liquidação avançar para completed ou failed. Na prática a janela é de segundos.

O erro que você recebe

Tentar POST /v1/quotes/:id/accept para um user_id que já tem uma conversão offramp aberta retorna um erro com código estável (a especificação completa vai na referência da API quando publicada). O request_id no erro permite rastrear a chamada no suporte.

Tratamento sugerido

Quando você recebe o erro de lock:

  1. Cheque se a conversão aberta é deste mesmo fluxo. Se for o mesmo cliente final tentando re-confirmar uma operação que ainda está válida, a UX correta é levá-lo de volta ao estado da conversão existente, não criar uma nova.
  2. Se a conversão aberta é antiga e o cliente final desistiu, cancele a anterior (se ainda em awaiting_deposit) ou aguarde a janela expirar (expired). Aí a nova chamada de aceite passa.
  3. Se a conversão aberta está em standby, decida entre liquidar ou esperar a janela de 7 dias terminar em abandoned. Veja Standby e liquidação manual.

Não tente burlar o lock

O lock é enforced no banco via índice único parcial. Não há flag para desabilitá-lo, e não há caminho lateral para criar duas conversões abertas do mesmo tipo para o mesmo cliente final. Modele sua UX em torno disso.

Próximos passos

Nesta página