Como um Erro Simples Pode Transformar 1.000 USDC em 1 XLM

Como um Erro Simples Pode Transformar 1.000 USDC em 1 XLM

Traduzido do inglês

Um dia, um usuário entrou em contato com o suporte do rabbit.io alegando que, após uma troca, recebeu 1 XLM em vez de 1.000 USDC.

Parecia uma perda grave. Um lumen vale muito menos que um dólar: no momento, o XLM está sendo negociado em torno de US$ 0,22. Perder quase o valor total dessa forma seria alarmante para qualquer pessoa.

Naturalmente, começamos a investigar o caso imediatamente. Se tivesse acontecido de o valor errado ou o ativo errado ter sido enviado por nossa culpa, teríamos tomado providências na hora e garantido que o usuário recebesse os fundos corretos.

Mas a história revelou-se muito mais interessante.

Nossos sistemas funcionaram exatamente como pretendido. 1.000 USDC foram enviados para o endereço fornecido pelo usuário, sem erros ou falhas da nossa parte. No entanto, na rede Stellar existe um detalhe arquitetônico sutil que pode, literalmente, transformar 1.000 USDC em 1 XLM se você o ignorar.

Deixe-me explicar como isso acontece.

Um Hábito do Ethereum

O cliente do rabbit.io não era um iniciante. Pelo contrário, era um usuário de cripto experiente que deliberadamente armazenava seus fundos em carteiras não custodiais em vez de corretoras. A maior parte de sua experiência, no entanto, vinha de redes baseadas em EVM.

No mundo do Ethereum, os usuários se acostumam com um modelo simples: qualquer token enviado para o seu endereço chegará com sucesso. No pior dos casos, você só precisa adicionar manualmente o token à interface da sua carteira. E mesmo quando o aplicativo da carteira não suporta um token específico, você pode importar sua frase semente (seed phrase) para outra carteira que suporte.

A Stellar funciona de forma muito diferente.

Sua arquitetura é fundamentalmente diferente do Ethereum, Binance Smart Chain ou Polygon. Até o conceito de endereço é diferente. Em redes EVM, os endereços são efetivamente gratuitos. Na Stellar, criar um endereço no registro (ledger) custa 1 XLM.

E essa quantia exata — 1 XLM — foi o que nosso cliente viu em sua carteira após a troca.

Como a Stellar é Diferente

A diferença mais importante entre a Stellar e as redes baseadas em EVM reside em como os ativos são recebidos.

Na Stellar, uma carteira deve aprovar explicitamente qualquer novo token antes que ele possa ser creditado. Por exemplo, para receber USDC pela primeira vez, uma conta Stellar precisa criar uma trustline (linha de confiança) com o emissor do USDC. A criação de uma trustline exige o bloqueio de 0,5 XLM como reserva, o que garante a entrada correspondente na ledger.

Originalmente, se um token fosse enviado para um endereço sem uma trustline existente, a transação simplesmente falharia. O valor total permaneceria com o remetente.

A partir do Stellar Protocol 15, esse comportamento foi alterado com a introdução de saldos reivindicáveis (claimable balances). O objetivo era melhorar a usabilidade e permitir que tokens fossem enviados até mesmo para contas "não preparadas".

Quando enviamos USDC para o endereço Stellar do nosso cliente que não possuía uma trustline para USDC, o protocolo lidou com a transação da seguinte forma:

  • os fundos foram deduzidos da nossa carteira;
  • os fundos não foram creditados no saldo do destinatário;
  • 1.000 USDC foram colocados em um objeto especial da ledger chamado Claimable Balance Entry (Entrada de Saldo Reivindicável).

Em outras palavras, os fundos foram registrados na ledger e permaneceram lá, esperando que alguém os reivindicasse explicitamente. Quem tem permissão para fazer isso é definido pelas condições da transação. Por padrão, tanto o remetente quanto o destinatário são reivindicadores elegíveis.

Mas de onde vieram os 1 XLM na conta do destinatário? A resposta é: de nós — embora nunca tenhamos enviado intencionalmente.

Veja como essas transações são realmente processadas.

Passo 1. O remetente inicia uma transferência de USDC e assina uma transação com os seguintes parâmetros:

  • Operação: payment (pagamento)
  • Ativo: USDC
  • Destino: um endereço que ainda não existe na rede Stellar
  • Valor: 1.000 USDC

Nesta fase, o remetente concorda implicitamente em pagar qualquer quantia de XLM necessária para processar a transação. Na prática, os usuários raramente prestam atenção a esse detalhe, porque as taxas de transação na Stellar costumam ser insignificantes.

Passo 2. A Stellar realiza uma série de validações básicas para verificar se a operação pode ser executada

  • A conta do destinatário existe? Não
  • O ativo transferido é o token nativo XLM? Não
  • O destinatário possui uma trustline para o ativo que está sendo enviado? Não

Somadas, essas condições significam que um pagamento direto não é possível.

Passo 3. Em vez de rejeitar a transação imediatamente, a Stellar ativa o mecanismo de saldo reivindicável.

Para isso, a rede:

  • cria um saldo reivindicável para 1.000 USDC,
  • especifica quem tem permissão para reivindicá-lo (tanto o remetente quanto o destinatário).

No entanto, para que o destinatário seja listado como um potencial reivindicador, a conta do destinatário deve existir na rede. No momento da transação, a conta existia apenas dentro do aplicativo de carteira do destinatário. Ela ainda não havia sido criada na ledger da Stellar.

Nessas condições, a conta é criada como parte da mesma transação.

Como mencionado anteriormente, criar uma conta na Stellar não é de graça. O 1 XLM necessário para criar a conta é retirado da origem da operação, ou seja, do saldo do remetente:

  • 1 XLM é deduzido do remetente,
  • esse 1 XLM é creditado na conta recém-criada,
  • a conta agora é considerada ativa.

Este 1 XLM faz parte do custo de execução da transação — um custo que aceitamos implicitamente ao assinar a transação. Tecnicamente, ele acaba no saldo do destinatário, mas o destinatário não pode realmente usá-lo. Em particular, o destinatário não pode pegar metade desse valor para criar uma trustline para USDC e reivindicar os fundos.

Se a conta do destinatário já existisse na rede, mas simplesmente não tivesse uma trustline para USDC, nenhum 1 XLM adicional teria sido necessário. Nesse caso, o destinatário não teria visto nenhuma mudança visível em sua carteira.

Como Resolvemos o Problema

O primeiro passo foi o destinatário assinar uma operação changeTrust para o ativo USDC. Para que esta operação tenha sucesso, a carteira deve ter pelo menos 0,5 XLM de saldo livre, que fica bloqueado como reserva quando a trustline é criada.

Nosso cliente não tinha nenhum XLM livre. Mais precisamente, o único XLM na conta era o 1 XLM que apareceu lá como resultado da troca — mas esse valor estava totalmente bloqueado como reserva base e não podia ser usado.

Portanto, sugerimos uma solução alternativa simples: trocar uma pequena quantidade de qualquer criptomoeda disponível por lumens. Depois de fazer isso, o cliente finalmente teve XLM livre suficiente para criar uma trustline em sua carteira.

Assim que a trustline para USDC foi estabelecida, o usuário conseguiu reivindicar os 1.000 USDC. Neste caso, tudo terminou bem para todas as partes envolvidas.

Este é um Caso Isolado?

A situação que nosso cliente enfrentou não é única. E ele teve muita sorte por estar usando carteiras não custodiais totalmente sob seu próprio controle. Foi precisamente isso que tornou o problema relativamente fácil de resolver.

Lembrei-me desta história porque, há poucos dias, li sobre um caso muito semelhante envolvendo outro usuário. O valor era exatamente o mesmo — 1.000 USDC — mas as circunstâncias tornaram o problema muito mais difícil de corrigir.

Três dias atrás, um comentário apareceu no LinkedIn sob a última postagem do CEO da Uphold, Simon McLoughlin, onde um usuário da Uphold descreveu a seguinte situação:

  • Ele tentou depositar USDC na corretora Uphold via rede Stellar.
  • Por engano, selecionou um endereço de depósito XLM em vez de um endereço de depósito USDC na interface da Uphold.
  • Assim como no nosso caso, ele viu 1 XLM creditado em seu saldo em vez de 1.000 USDC.
  • O suporte da Uphold, incluindo um especialista sênior, respondeu categoricamente: “Não temos seus tokens. Não podemos vê-los. Não podemos devolvê-los.”
  • A carteira de onde os fundos foram enviados não fornecia uma função de Reivindicação (Claim) para tais cenários. Provavelmente, era uma carteira custodial com funcionalidade limitada, possivelmente outra CEX.
  • Após esgotar todos os canais padrão, o usuário tentou escalar o problema diretamente ao CEO.

Dada a semelhança dos sintomas, acredito que o problema subjacente seja exatamente o mesmo.

Provavelmente, a Uphold gera endereços de depósito sob demanda, e o endereço XLM para o qual o usuário enviou os fundos ainda não havia sido criado na ledger da Stellar. Isso explicaria por que 1 XLM apareceu na conta como resultado da transação. No entanto, os 1.000 USDC não apareceram, e resolver a situação exigiria que a Uphold criasse manualmente uma trustline para USDC para aquele endereço.

Por que o suporte se recusou a ajudar?

Meu palpite é a arquitetura de segurança. Qualquer empresa que lide com criptomoedas investe pesadamente na segurança das carteiras. Parece que a Uphold não implementou um processo para criar trustlines fora do fluxo de depósito padrão esperado. Adicionar tal funcionalidade retroativamente, cumprindo todos os requisitos de segurança internos, pode custar à corretora muito mais do que os 1.000 USDC perdidos pelo usuário.

Até o momento, o comentário sob a postagem do CEO foi removido. Não sei se foi deletado pelo próprio usuário ou pela corretora. Espero que o problema tenha sido resolvido e o usuário tenha optado por remover o comentário por conta própria. Mas se o comentário foi removido pela Uphold, isso seria um sinal preocupante.

Esses problemas não devem ser enterrados silenciosamente. Pelo contrário, merecem atenção — para que outros usuários não repitam o mesmo erro. É por isso que decidi compartilhar nossa história e a história do usuário da Uphold aqui.

O Que Fazer Se Você Cair na Armadilha do Saldo Reivindicável

Se pelo menos uma das carteiras envolvidas — seja a do remetente ou a do destinatário — for totalmente controlada pelo proprietário dos fundos, a situação é relativamente simples:

  • O destinatário pode adicionar uma pequena quantia de XLM à sua carteira, criar a trustline necessária e, em seguida, reivindicar o saldo reivindicável (claimable balance).
  • O remetente pode recuperar o saldo reivindicável com uma única operação e, em seguida, reenviar os fundos para um endereço de destinatário diferente — um que esteja devidamente preparado para receber o token.

No entanto, quando carteiras custodiais estão envolvidas — por exemplo, carteiras de CEX — as coisas se tornam muito mais complicadas.

Serviços custodiais não são obrigados a interferir manualmente em sua infraestrutura de carteira para corrigir o erro de um usuário, especialmente se isso introduzir riscos operacionais ou de segurança adicionais. Como resultado, você pode ter a assistência recusada, embora os fundos tecnicamente ainda existam na ledger.

Dito isso, ainda vale a pena tentar. Enquanto a corretora controlar as chaves privadas, existe uma chance de os fundos serem recuperados.

Se você se encontrar nesta situação:

  • Torne o caso o mais visível possível. Escreva sobre isso no X, LinkedIn ou Medium. Marque as contas oficiais. A reputação vale mais do que US$ 1.000.
  • Fale a língua dos engenheiros. Seu pedido deve soar mais ou menos assim: “Minha transação resultou em uma Entrada de Saldo Reivindicável (Claimable Balance Entry) com ID […]. Os fundos estão registrados na ledger e são controlados pela chave privada da sua carteira. Por favor, encaminhe este ticket para a equipe de engenharia ou DevOps para que possam verificar a propriedade e realizar uma operação claim_claimable_balance. Estou disposto a pagar uma taxa de recuperação.”
  • Entre em contato com a comunidade. O ecossistema Stellar possui uma comunidade de desenvolvedores muito unida. Às vezes, uma discussão pública no Discord ou em outras plataformas atrai a atenção de pessoas que conhecem pessoalmente as equipes técnicas por trás das grandes corretoras.

Em última análise, a melhor solução ainda é a prevenção. Ser seu próprio custodiante tem muitas vantagens, mas também traz um alto nível de responsabilidade. Ao enviar criptomoedas, a atenção aos detalhes é fundamental, pois alguns erros são muito mais fáceis de cometer do que de corrigir.