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.
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.
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:
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:
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
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:
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:
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.
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.
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:
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.
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:
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:
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.