Terceira etapa do fluxo de adição de liquidez: apresenta o resumo completo do aporte antes de qualquer assinatura — par, protocolo, faixa, valores exatos, custo total, gas e contexto de IL — e gerencia o fluxo de aprovação de token até a submissão da transação. Foco em iniciante que nunca assinou uma transação DeFi de LP; intermediário como segundo perfil que quer confirmar números antes de assinar.
Stepper de progressão (contexto imutável)
Chip-strip de saúde do pool (persistente, herdado de pools-02 e pools-04)
Rend. est. (7d) 12,4% · TVL R$ 135 M · Vol. 24h ↑1,3%Resumo do aporte (componente principal, leitura antes da assinatura)
┌─ VOCÊ VAI ADICIONAR ───────────────────────────┐
│ │
│ Par ETH / USDC │
│ Protocolo Concentrado num range (V3) │
│ Fee tier 0,05% │
│ Faixa ±10% do preço atual │
│ R$ 16.689 – R$ 20.397 │
│ │
│ ┌─ ETH ───────────────────────────────────┐ │
│ │ 1,17 ETH │ │
│ │ ≈ R$ 21.695 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ┌─ USDC ──────────────────────────────────┐ │
│ │ R$ 21.695,00 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ Total em tokens ≈ R$ 43.390 │
│ Gas estimado ≈ R$ 8,40 │
│ ───────────────────────────────────────── │
│ Total da operação ≈ R$ 43.398,40 │
│ (Timestamp: 14:32 · preço pode variar) │
│ │
└──────────────────────────────────────────────────┘
Lembrete de IL contextual (educação no ponto de commit — Pilar 4)
Fluxo de aprovação de token (gestão inline do fluxo ERC-20 approve → LP mint)
O fluxo de aprovação é dividido em etapas visuais explícitas — não surpresa de "popup na carteira":
Etapa A — Aprovação de ETH (quando necessária)
Etapa B — Aprovação de USDC (quando necessária)
Etapa C — Confirmar aporte (CTA final)
CTA principal (sticky rodapé em mobile, inline em desktop)
| Estado | Comportamento |
|---|---|
| Loading — carregando resumo | Skeleton em todos os campos do card + chip-strip. Label: "Preparando resumo do aporte ETH/USDC…" |
| Preço moveu > 2% | Banner não bloqueante: "O preço mudou desde que você abriu esta tela. Valores atualizados." + CTA "Rever valores" (volta para pools-04) e link "Continuar assim mesmo". |
| Aprovação ETH pendente | Card Etapa A destacado; Etapa B e CTA final em estado "aguardando", visíveis mas inativos. |
| Aprovação ETH assinada — aguardando confirmação on-chain | Card Etapa A com spinner + "Confirmando aprovação de ETH…" Etapa B e CTA ainda inativos. |
| Aprovação ETH confirmada | Card Etapa A com ✓ verde + "ETH aprovado." Card Etapa B entra em estado ativo. |
| Aprovação falhou | Card da etapa com ✗ vermelho + "Aprovação não concluída. Você pode tentar de novo ou ajustar o gas em Configurações avançadas." CTA "Tentar de novo" inline no card. |
| Aprovação rejeitada na carteira | "Aprovação cancelada. Você precisa aprovar o token para continuar." CTA "Tentar de novo" inline. |
| Confirmação do aporte assinada — aguardando mineração | CTA principal mostra spinner + "Transação enviada. Aguardando confirmação…" Banner discreto: "Você pode fechar esta tela — sua posição aparecerá em 'Minhas posições' quando confirmada." |
| Confirmação rejeitada na carteira | "Transação cancelada. Nenhum fundo foi movido." CTA "Tentar de novo" disponível. |
| Gas insuficiente | Erro inline: "Gas insuficiente para executar. Aumente a tolerância em Configurações avançadas." CTA "Ajustar gas" abre configurações avançadas. |
| Rede trocou durante o fluxo | Banner bloqueante: "Você trocou de rede. Esta posição é em [rede original]. Mude de volta para continuar." CTA "Mudar para [rede]". |
| Transação confirmada | Navega automaticamente para pools-06. |
| Transação revertida on-chain | Navega para pools-06 no estado de falha — ver pools-06. |
| Sem wallet | (Não deveria chegar aqui sem wallet — mas se ocorrer) Banner bloqueante: "Carteira desconectada. Reconecte para continuar." + CTA "Conectar carteira". |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › ETH/USDC › Adicionar liquidez |
| Título implícito | Passo 3 de 3: Revisar e confirmar |
| Frase de contexto | Você está fornecendo liquidez em |
| Label protocolo no resumo | Concentrado num range (V3) |
| Label faixa no resumo | ±10% do preço atual |
| Faixa em preços absolutos | R$ 16.689 – R$ 20.397 |
| Label gas | Gas estimado |
| Label total | Total da operação |
| Timestamp no resumo | Preços às 14:32 · podem variar até a confirmação |
| Link editar | Editar ▾ |
| IL reminder — faixa não-total | Lembrete: se o preço de ETH sair da faixa R$ 16.689–R$ 20.397, sua posição para de gerar rendimento até você ajustar. Isso não é perda de capital — é pausa no rendimento. |
| IL reminder — faixa total | Posição não tem expiração. Rendimento gerado enquanto houver volume no pool. |
| Link simulador IL | Ver simulação de IL → |
| Aprovação Etapa A | Passo 1 de 2: Permitir que o protocolo use seu ETH |
| Sub-copy aprovação | Você vai assinar uma aprovação na sua carteira. Essa ação não move ETH — apenas concede permissão ao contrato. |
| CTA aprovar | Aprovar ETH |
| Estado aprovado | ✓ ETH aprovado |
| Aprovação infinita (avançado) | Aprovação infinita concede acesso permanente ao contrato para este token. Use com cuidado. |
| CTA final desabilitado | Conclua as aprovações acima para confirmar. |
| CTA final ativo | Confirmar aporte |
| Assinatura pendente | Aguardando sua assinatura na carteira… |
| Tx enviada | Transação enviada. Aguardando confirmação… |
| Aviso tx enviada | Você pode fechar esta tela — sua posição aparecerá em 'Minhas posições' quando confirmada. |
| Erro de aprovação | Aprovação não concluída. Você pode tentar de novo ou ajustar o gas em Configurações avançadas. |
| Aprovação rejeitada | Aprovação cancelada. Você precisa aprovar o token para continuar. |
| Tx cancelada | Transação cancelada. Nenhum fundo foi movido. |
| Preço desatualizado | Preços desatualizados. Atualizando… |
| Preço moveu | O preço mudou desde que você abriu esta tela. Valores atualizados. |
| CTA revisar valores | Rever valores |
| CTA ignorar mudança de preço | Continuar assim mesmo |
| Gas subiu | Gas aumentou significativamente. O total estimado foi atualizado. |
| Pool morta — aviso no resumo | Pool com atividade baixa — rendimento estimado pode não se confirmar. |
| Gas insuficiente | Gas insuficiente para executar. Aumente a tolerância em Configurações avançadas. |
| Rede trocada | Você trocou de rede. Esta posição é em [rede original]. Mude de volta para continuar. |
[uniswap/_consolidado/visualizar-pool.md § Oportunidade — Contexto persistente no ato de operar].[uniswap/_consolidado/visualizar-pool.md § Insight — Sinalização de risco/variação in-place].[uniswap/_consolidado/visualizar-pool.md § Insight — Presets chips em qualquer decisão financeira] (herança do princípio, não do componente).[uniswap/_consolidado/visualizar-pool.md § Fricção — Métricas vivas sem âncora de snapshot].[pancake-final § Pilar 5 — Localização BR/LatAm como infraestrutura].[pancake-final § Pilar 2 — CTA dinâmico] + [uniswap-final § Insight — Estados como instrução acionável].[uniswap/_consolidado/nova-posicao.md § Insight — Stepper pedagógico e contextual].[pancake-final § Pilar 3 — Defesa em camadas].[uniswap/_consolidado/nova-posicao.md § Fricção — Ausência de estado do pool destino].[uniswap/_consolidado/visualizar-pool.md § Fricção — Unidade técnica não traduzida para intuitiva].[pancake-final § Fricção 2 — i18n parcial].[uniswap/_consolidado/visualizar-pool.md § Fricção — Desacoplamento widget↔contexto].[uniswap/_consolidado/visualizar-pool.md § Fricção — Affordance sem estado honesto].[pancake-final § Pilar 4]. Hipótese: usuário que vê o total em R$ nesta tela antes de confirmar tem 3x menos chance de cancelar a aprovação ao ver o número na carteira — elimina abandono por "susto de valor".[pancake-final § Pilar 4] + [uniswap/_consolidado/pools.md § Oportunidade — Sistema pedagógico de métricas DeFi]. Hipótese: usuário que lê "pausa no rendimento — não perda de capital" antes de confirmar não interpreta posição expirada como bug ou perda — reduz tickets de suporte.[pancake-final § Pilar 3]. Hipótese: usuário iniciante que entende "essa ação não move ETH" na aprovação ERC-20 tem mais confiança no produto e taxa de abandono na etapa de aprovação cai.[pancake-final § Pilar 5]. Hipótese: usuário BR que vê "R$ 43.398,40" como total da operação toma decisão na moeda que entende sem conversão mental.Intl.NumberFormat com locale pt-BR em todo o frontend. Custo de implementação real.Permite que o usuário declare o par de tokens que deseja prover liquidez e, com base nessa escolha, entenda e selecione o modo de provisão adequado ao seu perfil — sem precisar conhecer nomenclatura técnica de protocolo. Foco: iniciante (prioridade) e intermediário.
2.1 Seletor de par (Token A / Token B) Dois campos de busca de token em linha horizontal. Token A pré-selecionado com o token base da rede ativa (ex: ETH em Ethereum, BNB em BNB Chain) — default do caso 90%. Token B em branco.
Cada campo exibe:
2.2 Cards de modo de provisão (aparece após par válido selecionado) Três cards horizontais — um por modo. Cada card contém:
Modos:
| Label primário | Subtítulo | Chip gestão | Secondary |
|---|---|---|---|
| "Simples — depositar e esquecer" | "Deposite e receba taxas automaticamente. Sem ajustes necessários." | Passiva | V2 |
| "Concentrada — mais retorno, mais atenção" | "Defina uma faixa de preço. Retorno maior enquanto dentro da faixa." | Gestão ativa | V3 |
| "Programável — controle total" | "Configure regras personalizadas com lógica de hooks." | Configuração técnica | V4 |
O card "Simples" é selecionado por default para carteiras sem histórico de LP ou com primeiro acesso ao fluxo. Para carteiras com histórico de LP concentrado, o card "Concentrada" é pré-selecionado.
2.3 Card de saúde do pool (aparece após par + modo selecionados) Card inline abaixo dos cards de modo. Comportamento:
Conteúdo quando expandido:
2.4 CTA dinâmico Botão primário na base da tela. Muda de label conforme o preenchimento:
2.5 Stepper de progresso — 2 etapas visíveis no topo: "1 Configurar" (ativa) → "2 Confirmar". Labels fixos para todos os modos (não mudam com o modo, pois a Kotai já não usa nomenclatura técnica no stepper).
2.6 Breadcrumb + ação "Redefinir" — "Ganhar rendimento / Criar posição" + link "Redefinir tudo" que limpa par, modo e configurações.
RN-01 — Default de Token A por rede ativa. Token A = token nativo da rede ativa (ETH em Ethereum, BNB em BNB Chain, etc.). Carteira sem rede detectada: Token A em branco. Mudança de rede no header: Token A reseta para novo nativo; Token B persiste se disponível na nova rede.
RN-02 — Token A ≠ Token B. Ao selecionar Token B igual a Token A, Token B reseta para branco com aviso inline "Selecione um token diferente de [Token A]".
RN-03 — Recomendação de modo por heurística de par.
RN-04 — Card de saúde do pool: trigger de carregamento. Ao completar par + modo: dispara consulta de estado do pool. Loading state por até 5s. Após 5s sem resposta: exibe mensagem de fallback com opção de retry.
RN-05 — Pool novo: detecção e bloqueio de avanço sem aviso. Se par+modo resultar em pool inexistente e o usuário clicar em "Configurar minha posição" sem expandir o card de aviso, o card é auto-expandido e o botão fica enabled apenas após o usuário rolar até o card (scroll sentinel). Não exige confirmação formal aqui — o aviso completo vem na Tela 03.
RN-06 — Modo "Programável" (V4): barrier de entrada. Ao selecionar o card "Programável", um tooltip/inline banner aparece abaixo: "Este modo é para usuários avançados. Você pode começar com 'Simples' e migrar depois." CTA primário não muda — não bloqueia o avanço, apenas informa. Não usa type-to-confirm aqui (essa ação não é Tier 1 — é configuração reversível; type-to-confirm ocorre na Tela 03 se hooks estiverem ativos).
RN-07 — Validação par↔modo. Se par detectado como "pares correlacionados" (ex: USDC/USDT, stETH/ETH) e modo "Concentrada" ou "Programável" selecionado: nenhum bloqueio. Se par detectado como "par estável" e modo "Simples" selecionado: sem alerta (V2 para par estável é tecnicamente válido, APR menor que V3 mas sem gestão). Alerta ativo apenas quando a combinação implica perda estrutural provável: par volátil exótico com liquidez inexistente em modo "Concentrada" → "Este par tem histórico de baixo volume em provisão concentrada. A provisão simples pode ser mais adequada."
RN-08 — Propagação de estado para Tela 02.
Par + modo + fee tier (se V3/V4) + estado do pool (existente/novo/inativo) propagam para Tela 02 via URL parametrizada: /criar-pool?tokenA=ETH&tokenB=USDC&modo=concentrada&fee=3000&chain=1.
Vazio (sem par selecionado): Tela com dois campos de par em branco. Cards de modo não aparecem. CTA "Selecionar os tokens" cinza desabilitado. Microcopy acima dos campos: "Escolha os tokens para começar."
Loading (buscando estado do pool após par+modo): Skeleton no lugar do card de saúde — 3 linhas de placeholder animado. CTA muda para "Verificando pool..." (enabled mas desabilitado funcionalmente, com spinner inline). Após 5s sem resposta: "Não conseguimos verificar o estado deste pool. [Tentar de novo] ou [Continuar mesmo assim]."
Pool existente saudável: Card colapsado com label "Ver detalhes do pool ▾". CTA ativo. Nenhum aviso adicional.
Pool existente inativo (APR ≈ 0%, Volume ↓ > 70%): Card expandido com badge ⚠ "Pool pouco ativo". Texto: "Este pool tem baixo volume recente. Você pode ganhar menos taxas e ter mais impermanent loss sem compensação. [Ver detalhes ▾]". CTA continua ativo — não bloqueia; informa.
Pool novo (par+modo sem pool existente): Card expandido com banner azul "Você será o primeiro provedor". Texto: "Ao criar este pool, você define o preço inicial entre [Token A] e [Token B]. Atenção: se o preço estiver muito diferente do mercado, arbitradores corrigirão imediatamente e você pode perder parte do aporte. [Saiba mais ▾]". CTA ativo após rolar até o card.
Rede errada / não suportada: Banner no topo do fluxo: "Este pool não existe na rede atual ([Rede X]). Troque para [Rede Recomendada] ou escolha outro par." CTA bloqueado.
Carteira não conectada: CTA "Conectar carteira para continuar". Saldos dos tokens não exibidos nos campos. Modo de provisão e card de pool ainda carregam e ficam visíveis — o usuário pode explorar o fluxo antes de conectar (try-before-connect).
Token com risco detectado (scan inline): Badge ⚠ ao lado do nome do token no seletor. Ao selecionar: banner inline "Token não verificado — verifique o endereço antes de continuar. [Ver detalhes]". CTA ativo — não bloqueia, sinaliza.
Label de campo par:
Instrução inline (acima dos campos de par): "Escolha os dois tokens para os quais você quer fornecer liquidez."
Cards de modo (microcopy completo):
Card Simples:
Card Concentrada:
Card Programável:
Card de saúde do pool:
CTA dinâmico:
Mensagens de validação:
[uniswap-nova-posicao § Pontos isolados — Tela 1: ETH pré-selecionado como Token A][uniswap-nova-posicao § 🟢 Stepper pedagógico e contextual][uniswap-nova-posicao § 🟢 Microcopy pedagógica inline][uniswap-final § Padrão da Uniswap que NÃO se tornou fricção — try-before-connect][uniswap-nova-posicao § Observações adicionais — URL como state machine][pancake-final § Pilar 6 — CTA dinâmico + Default contextual][pancake-final § Pilar 3 — Risk signaling sistêmico] e [uniswap-final § Pilar 3 — Canonical mapping + risk signaling][uniswap-nova-posicao § 🔴 Estrutural — Versão como caixa-preta técnica] + [pancake-adicionar-liquidez § 🔴 Estrutural — Seleção de protocolo como caixa-preta técnica][uniswap-nova-posicao § 🔴 Estrutural — Ausência de estado do pool destino][pancake-final § Fricção 1 — Léxico de protocolo e infraestrutura] e [uniswap-final § Fricção 1 — Léxico de protocolo como UI][pancake-final § Fricção 10 — CTA disabled silencioso][pancake-adicionar-liquidez § 🔴 Estrutural — Componente de filtro de pool][pancake-final § Fricção 2 — i18n parcial][pancake-adicionar-liquidez § 🟡 Oportunidade 1 — Entrada por intenção] + Path B: inverter o fluxo.[uniswap-nova-posicao § 🟡 Oportunidade 1 — Pedagogia de versão] + Path B estratégico.[uniswap-nova-posicao § 🟡 Oportunidade 2 — Card de pré-visualização] + [uniswap-final § Pilar 5 — Pré-visualização rica antes de input][pancake-adicionar-liquidez § 🟡 Oportunidade 3 — Validação par↔protocolo inline][pancake-final § Pilar 3] + [uniswap-final § Pilar 3]Heurística de recomendação de modo: a regra de "par estável → Simples, par volátil → Concentrada" exige manutenção contínua de um mapeamento par↔tipo e thresholds de TVL/Volume que determinam quando o badge aparece. Se a heurística estiver errada, o badge "Recomendado" cria confiança falsa — pior que ausência de recomendação. Custo de engenharia: médio. Custo de manutenção: recorrente por release.
Cards de modo em linguagem de benefício: labels mais longos que os chips técnicos concorrentes (V2/V3) exigem testes de layout em mobile < 375px. Nomes mais longos aumentam surface area de i18n — tradução para ES/EN dos labels de modo precisa preservar o caráter pedagógico, não só traduzir literalmente.
Card de saúde do pool na Tela 01: adiciona uma consulta de API extra antes de avançar, aumentando latência percebida na etapa de configuração do par. Mitigação: skeleton imediato + timeout de 5s com fallback de "continuar mesmo assim". Risco de falso positivo: pool marcado como "inativo" por dados desatualizados de indexador — adiciona atrito desnecessário. Mitigação: usar janela de 24h, não ponto no tempo.
Try-before-connect: saldos não disponíveis sem carteira; card de saúde do pool carrega mas saldos ficam em branco. UX coerente mas pode gerar confusão em mobile onde o usuário espera que o "Conectar" apareça mais cedo. Prioridade do Pilar 7 (Mobile-first) e Pilar 6 (Default contextual) resolvem: CTA muda de label para "Conectar carteira para continuar" quando o usuário tenta avançar.
Modo "Programável" no fluxo padrão: expor V4 (hooks, configuração técnica) para usuário que pode ser iniciante tem custo de cognitive load. Mitigação: chip "Configuração técnica" e o banner de "modo avançado" sinalizam claramente que é opt-in para avançado. Não é bloqueio porque A8 (inverter sem motivo padrão herdável) se aplica: remover completamente V4 da lista exigiria justificativa de que o iniciante não pode acessá-lo nem via erro.

Tela de avaliação de um pool específico: o usuário (foco em iniciante, com intermediário como segundo perfil) precisa responder "este pool é bom para eu entrar?" antes de comprometer capital. Resolve a lacuna central do fluxo de pools dos concorrentes — onde o detalhe existe mas entrega dados sem mediação, e o contexto de saúde some exatamente quando o widget de ação abre.
Header de identidade sticky
V3 · 0,05%.Chip-strip de saúde (componente central, mobile-first)
Rend. est. (7d) 12,4% · TVL R$ 135 M · Vol. 24h ↑1,3%Chart de atividade
24h | 7d | 30d — chips horizontais, tap-and-stick em mobile.Card de saúde do pool (sidebar em desktop, abaixo do chart em mobile)
R$ 1.234,56, nunca $1,23K).52% ETH / 48% USDC. Resolve a perda da barra de proporção do desktop Uniswap no mobile.Tabela de transações
Tipo (↓/↑ colorido) · USD · Qtd. Token A · Qtd. Token B · Carteira · Horário.via roteador quando contrato = roteador/agregador canônico (1inch, Universal Router, etc.).Tipo · USD · Horário + chevron › na borda direita.CTAs principais (sticky bar em mobile, sidebar em desktop)
Section de contratos (colapsada por default)
POOL ou TOKEN antes de cada endereço (soluciona o truncamento de nomes longos no mobile — ex.: "P…", "Wise…", "Wrapp…" viram contexto semântico sem depender do nome completo).24h | 7d | 30d, estado ativo visível por underline ou fundo.| Estado | Comportamento |
|---|---|
| Loading inicial | Skeleton com label: "Carregando dados do pool ETH/USDC…" — skeleton cobre chip-strip, chart e card de saúde. Nunca skeleton mudo. |
| Erro de RPC / subgraph | Banner não bloqueante no topo: "Dados desatualizados há X minutos. Tentando reconectar…" + CTA Tentar agora. Tabela de transações mostra última versão em cache com timestamp visível. |
| Pool morta (Vol/TVL < 0,01 por ≥ 7d) | Chip-strip em âmbar. Caption do chart: "Sem transações nas últimas 24h." Caption de APR: "Pool com volume baixo. Taxas insuficientes para gerar rendimento significativo." CTA com aviso inline — não bloqueante. |
| Pool com token não verificado | Badge ⚠ vermelho no header sticky + na section de contratos + tooltip expandido. CTA com aviso inline: "Pelo menos um token não passou na verificação — revise antes de aportar." Não bloqueante. |
| Pool desbalanceada (um token > 85%) | Badge âmbar na barra de proporção + tooltip pedagógico sobre impacto de preço. |
| Sem wallet conectada | Toda a visualização disponível. Ao clicar em "Adicionar liquidez" → fluxo de conexão de carteira (não bloqueia visualização prévia). "Fazer troca" também acessível. |
| Rede ativa ≠ rede do pool | Banner: "Você está na rede [X]. Este pool existe na rede [Y]. Mude para continuar." + CTA de troca de rede inline. CTAs principais desabilitados com texto de contexto, não botões cinzas mudos. |
| Parcial multi-chain (RPC de rede do pool falhando) | Banner discreto: "Não foi possível carregar dados desta rede. Mostrando última versão disponível." — chart e tabela exibem dados em cache com timestamp. |
| Retorno do fluxo de adição (back-navigation de pools-03) | Página recarrega dados — sem estado especial de "sucesso" nesta tela; sucesso fica em pools-03. |
| Elemento | Texto |
|---|---|
| Header | ETH/USDC · V3 · 0,05% |
| Breadcrumb | Ganhar rendimento › ETH/USDC |
| Chip-strip | Rend. est. (7d) 12,4% · TVL R$ 135 M · Vol. 24h ↑1,3% |
| Label do chart | Atividade do pool |
| Presets de período | 24h | 7d | 30d |
| Caption — atividade normal | Volume distribuído ao longo do dia sem pico isolado. |
| Caption — concentrada | Atividade concentrada em 1 transação às 06h (67% do volume). |
| Caption — pool sem volume | Sem transações nas últimas 24h. |
| Caption — APR pool morta | Pool com volume baixo. As taxas coletadas nas últimas 24h são insuficientes para gerar rendimento significativo. |
| Caption — transações | 9 transações em 24h · 67% do volume em 1 trade às 05h. |
| Label de rendimento | Rendimento estimado (7d, sem IL) ⓘ |
| Tooltip de rendimento | Cálculo baseado nas taxas observadas nos últimos 7 dias. Não inclui perda impermanente (IL) — o resultado real depende da variação de preço dos dois tokens. |
| Label tarifas | Tarifas coletadas (24h) |
| Composição do par | 52% ETH / 48% USDC |
| Badge pool desbalanceada | Pool desbalanceada. Aporte pode ter impacto de preço elevado. |
| CTA primário | Adicionar liquidez |
| Aviso inline CTA — pool morta | Pool com baixa atividade — verifique antes de aportar. |
| Aviso inline CTA — token não verificado | Pelo menos um token não passou na verificação — revise antes de aportar. |
| CTA secundário | Fazer troca |
| Badge ⚠ Vol/TVL alto (expandido) | Volume excepcionalmente alto pode indicar negociação artificial ou incentivo temporário. Verifique a trajetória antes de aportar. |
| Badge ⚠ APR extremo (expandido) | Rendimentos acima de 100% raramente se sustentam. Veja a janela de cálculo antes de aportar. |
| Badge ⚠ token não verificado (header) | ⚠ Token não verificado |
| Eyebrow contrato | POOL |
| Eyebrow token | TOKEN |
| Timestamp | Dados em 11:28 · atualiza a cada 30s |
| Loading | Carregando dados do pool ETH/USDC… |
| Erro de dados | Dados desatualizados há X minutos. Tentando reconectar… |
| CTA retry | Tentar agora |
| Rede errada | Você está na rede [X]. Este pool existe na rede [Y]. Mude a rede para continuar. |
| CTA rede errada | Mudar para [Y] |
| Sem wallet + CTA ação | Conectar carteira para adicionar liquidez |
Ganhar rendimento › ETH/USDC mantido em mobile. Fonte: [uniswap visualizar-pool § Insight — Contexto herdado na ação][uniswap visualizar-pool § Insight — Contexto herdado na ação — chart por Volume][uniswap visualizar-pool § Insight — Presets chips em qualquer decisão financeira][pancake-final § Pilar 5 — Mobile-first interaction][uniswap visualizar-pool § Insight — Dados on-chain inline][uniswap visualizar-pool § Insight — Sticky de identidade + CTAs em mobile][uniswap pools § Oportunidade — Verificação por token em pool] + [pancake-final § Pilar 6][uniswap visualizar-pool § Insight — Sinalização de risco in-place][uniswap visualizar-pool § Fricção estrutural — APR 0,00% mudo][uniswap visualizar-pool § Fricção estrutural — Desacoplamento widget↔contexto][uniswap visualizar-pool § Fricção estrutural — Paridade informacional desktop↔mobile quebrada]POOL/TOKEN em contratos substitui labels de nome longo. Fonte: [uniswap visualizar-pool § Fricção estrutural — Truncamentos PT-BR sistêmicos][uniswap visualizar-pool § Cosmético-estrutural — Coluna Tipo truncada][uniswap visualizar-pool § Fricção estrutural — Métricas vivas sem âncora de snapshot][pancake-final § Fricção 2 — i18n parcial][pancake-final § Pilar 5 — Mobile-first interaction] + [uniswap visualizar-pool § Oportunidade — Contexto persistente no ato de operar]. Hipótese: usuário não decide adicionar liquidez sem ver os 3 KPIs — chip-strip elimina o risco de "aportar em pool morta achando que é normal".[pancake-final § Pilar 4 — Educação contextual] + [uniswap visualizar-pool § Oportunidade — Narrativa automática dos dados]. Hipótese: uma frase muda o tipo de pergunta que o usuário faz antes de aportar.[uniswap visualizar-pool § Fricção — Paridade informacional desktop↔mobile — barra descartada em mobile]. Hipótese: pool desbalanceada identificada em < 3s vs identificação impossível em mobile hoje.[uniswap visualizar-pool § Oportunidade — Tabela mobile expansível por linha]. Hipótese: auditoria de fluxo de caixa do pool disponível em mobile, eliminando desvio para Etherscan.[pancake-final § Pilar 6 — Risk signaling sistêmico]. Hipótese: usuário que chega ao detalhe com intenção de aportar vê o mesmo sinal que bloqueou o clique na lista — consistência de signal trail.Primeira tela do fluxo de adição de liquidez: o usuário (foco em iniciante) declara o par e recebe uma recomendação de protocolo com justificativa baseada em dados — substituindo a escolha técnica neutra ("V2/V3/Infinity/StableSwap?") por orientação contextual com critério explícito. Resolve "em qual protocolo devo aportar para este par?" antes de qualquer decisão de valor ou range.
Cabeçalho da tela
Seletor de par (estrutural, pré-preenchido se vindo de pools-02)
Stablecoins | Blue-chip | Recentes. Chips disparam busca filtrada — atalho para os casos mais comuns do iniciante sem exigir digitação.Card de protocolo recomendado (componente central desta tela)
Seletor de protocolo manual (colapsado por default, expande ao clicar "Ver outras opções ▾")
| Card | Nome primário | Descrição | Sub-label |
|---|---|---|---|
| V2 | Simples e passivo | Deposita e esquece. Sem gestão de faixa de preço. Rendimento distribuído uniformemente. | V2 |
| V3 | Concentrado num range | Maior eficiência de capital. Exige definição de faixa de preço e eventual rebalanceamento. | V3 |
| StableSwap | Pares correlacionados | Otimizado para stablecoins e pares com preço próximo. Não usar para pares voláteis. | StableSwap |
| Infinity | Customizável (avançado) | Lógica programável de LP. Para usuários com experiência em AMM. | Infinity |
Warning de combinação par×protocolo imprópria (aparece inline, não em modal separado)
Resumo fixo no rodapé (sticky em mobile, inline em desktop)
ETH/USDC · V3 · 0,05%A heurística é baseada em dados observados (volume por protocolo + fee tier para o par) — não editorial:
| Tipo de par | Protocolo recomendado | Fee tier |
|---|---|---|
| Estável × estável (USDC/USDT, USDC/DAI, USDT/BUSD) | StableSwap ou V3 0,01% | 0,01% |
| Blue-chip + stable (ETH/USDC, BNB/USDT, BTC/USDC) | V3, fee tier com maior volume observado | Geralmente 0,05% |
| Blue-chip + blue-chip (ETH/BTC, ETH/BNB) | V3 | 0,3% |
| Par volátil sem histórico suficiente | V2 | 0,3% |
| Par desconhecido (< 30d de histórico) | V2 — "ponto de partida seguro" | 0,3% |
Regras de disparo (OR — basta 1):
Warning é informativo, não bloqueante. CTA "Continuar assim mesmo" permanece disponível. Critério de volatilidade e correlação é revelado no link "Como funciona isso?" abaixo do warning.
| Estado | Comportamento |
|---|---|
| Vazio — entrada direta | Seletor de par vazio + chips qualitativos (Stablecoins / Blue-chip / Recentes). Card de protocolo ausente. CTA com label "Selecione um par para continuar", desabilitado. |
| Par selecionado — aguardando recomendação | Skeleton no card de protocolo: "Avaliando o melhor protocolo para ETH/USDC…" CTA desabilitado: "Avaliando protocolo…" |
| Par sem histórico suficiente (< 30d ou volume < threshold) | Card de protocolo em estado informativo: "Não temos dados suficientes para este par. Sugerimos V2 como ponto de partida seguro." Seletor manual disponível. |
| Combinação par×protocolo imprópria | Warning inline entre card e rodapé (ver regras de negócio). Não modal. |
| Sem wallet conectada | Formulário disponível para exploração (usuário pode ver recomendação e entender antes de conectar). CTA vira "Conectar carteira para continuar". |
| Rede incompatível (protocolo selecionado não disponível na rede ativa) | Warning inline: "V3 não está disponível em [rede atual]. Está disponível em: [lista de redes]. Mude a rede para continuar." CTA desabilitado com contexto. |
| Erro de heurística (API de recomendação falhou) | Card de protocolo em estado de fallback: "Não foi possível carregar a recomendação agora. Escolha manualmente:" → seletor manual expande automaticamente. |
| Pré-preenchido — vindo de pools-02 | Par visível, card de recomendação em estado "pré-confirmado" (protocolo já marcado). CTA ativo: "Continuar →" com resumo visível no rodapé. |
| Sucesso | Usuário confirma par + protocolo → avança para tela de configuração de range e valor (pools-04, fora do escopo deste arquivo). |
| Elemento | Texto |
|---|---|
| Título da tela | Adicionar liquidez |
| Sub-título default | Escolha o par e o protocolo para o seu aporte. |
| Sub-título pré-preenchido | Configurando aporte em ETH/USDC. |
| Placeholder seletor de token | Selecionar token |
| Chips de atalho (estado vazio) | Stablecoins | Blue-chip | Recentes |
| CTA trocar par | Trocar par ▾ |
| Card recomendado — declaração | Para ETH/USDC, recomendamos V3 |
| Card recomendado — dados | 72% do volume ativo está concentrado aqui. Fee tier: 0,05%. |
| Card recomendado — consequência | Concentrado num range: maior eficiência de capital, mas exige definição de faixa de preço e rebalanceamento eventual. |
| Badge recomendado | Mais popular para este par |
| CTA usar recomendação | Usar recomendação |
| Link opções manuais | Ver outras opções ▾ |
| Card V2 — nome | Simples e passivo |
| Card V2 — descrição | Deposita e esquece. Sem gestão de faixa de preço. Rendimento distribuído uniformemente. |
| Card V2 — sub-label | V2 |
| Card V3 — nome | Concentrado num range |
| Card V3 — descrição | Maior eficiência de capital. Exige escolha de faixa de preço e eventual rebalanceamento. |
| Card V3 — sub-label | V3 |
| Card StableSwap — nome | Pares correlacionados |
| Card StableSwap — descrição | Otimizado para stablecoins e pares com preço próximo. Não usar para pares voláteis. |
| Card StableSwap — sub-label | StableSwap |
| Card Infinity — nome | Customizável (avançado) |
| Card Infinity — descrição | Lógica programável de LP. Para usuários com experiência em AMM. |
| Card Infinity — sub-label | Infinity |
| Warning par×protocolo | BNB e CAKE não são ativos correlacionados. StableSwap é otimizado para pares como USDC/USDT. Continuar com V3? |
| CTA warning — aceitar | Usar V3 (recomendado) |
| CTA warning — ignorar | Continuar assim mesmo |
| Par sem histórico | Não temos dados suficientes para este par. Sugerimos V2 como ponto de partida seguro. |
| Erro de heurística | Não foi possível carregar a recomendação agora. Escolha manualmente: |
| Loading recomendação | Avaliando o melhor protocolo para ETH/USDC… |
| CTA desabilitado — sem par | Selecione um par para continuar |
| CTA desabilitado — aguardando | Avaliando protocolo… |
| Sem wallet | Conectar carteira para continuar |
| Rede incompatível | V3 não está disponível em [rede]. Disponível em: [lista]. Mude a rede para continuar. |
| Resumo rodapé | ETH/USDC · V3 · 0,05% |
| CTA principal | Continuar → |
| Link fee tier | Mudar fee tier ▾ |
| Link pedagógico por protocolo | Como funciona este protocolo? |
[uniswap visualizar-pool § Insight — Contexto herdado na ação][pancake adicionar-liquidez § Insight — Adaptação honesta do formulário ao protocolo] — Kotai herda o princípio e aplica na ausência de campos irrelevantes (fee tier, por exemplo, soma em V2).[uniswap-final § Insight — Estados como instrução acionável] + [pancake-final § Insight — Transparência proativa antes do CTA][uniswap-final § Insight — Ação imediata sem commit nem onboarding][pancake adicionar-liquidez § Oportunidade — Validação par↔protocolo inline] — Kotai herda a oportunidade e mantém respeito à soberania.[pancake adicionar-liquidez § Fricção estrutural — Seleção de protocolo como caixa-preta técnica] + [uniswap-final § Fricção 1 — Léxico de protocolo][pancake adicionar-liquidez § Fricção estrutural — Nomenclatura como progressão linear][pancake adicionar-liquidez § Fricção estrutural — Componente de filtro de pool: vocabulário intraduzível][pancake-final § Fricção 2 — i18n parcial][pancake adicionar-liquidez § Oportunidade — Entrada por intenção: protocolo recomendado por par][pancake-final § Pilar 1]. Hipótese: usuário que não conhece V2/V3 decide pelo perfil de gestão que quer, não por nomenclatura de protocolo.[pancake-final § Pilar 2]. Hipótese: recomendação ancorada em dado observado tem mais credibilidade que recomendação editorial — e converte mais do que ausência de recomendação.[pancake-final § Pilar 4]. Hipótese: iniciante que lê "exige rebalanceamento eventual" antes de escolher V3 não é surpreendido depois — reduz abandono no fluxo de configuração de range.[pancake-final § Pilar 7]. Hipótese: protocolo recomendado por par é o diferencial de posicionamento "DEX que orienta iniciante na escolha de protocolo, não só expõe opções".[pancake adicionar-liquidez § Oportunidade — Validação par↔protocolo inline]. Hipótese: iniciante que seleciona BNB+CAKE em StableSwap hoje incorre em perda estrutural silenciosa — warning inline com alternativa concreta elimina esse caso sem bloquear o avançado.Segunda etapa do fluxo de adição de liquidez em V3: o usuário (foco em iniciante) configura a faixa de preço em que sua liquidez ficará ativa e define os valores de cada token a depositar — orientado por presets de estratégia com justificativa pedagógica, sem precisar entender "ticks" ou "concentrated liquidity" em termos técnicos. Intermediário como segundo perfil, com modo "Personalizar" disponível para controle granular total.
Variação de protocolo: esta tela propõe o caminho V3 (recomendação de pools-03 para pares blue-chip como ETH/USDC). Para V2/StableSwap, o seletor de faixa não aparece e o stepper rotula o passo como "Inserir valores" em vez de "Definir faixa e valores" — o formulário adapta-se ao protocolo sem campos irrelevantes.
Stepper de progressão
ETH/USDC · V3 · 0,05% — link "← Voltar" no chip navega para pools-03 preservando par selecionado (context-preserving back, não destruição de estado).Chip-strip de saúde do pool (herdado de pools-02, persistente durante todo o fluxo)
Rend. est. (7d) 12,4% · TVL R$ 135 M · Vol. 24h ↑1,3%Seletor de estratégia de faixa (componente central da tela — V3 apenas)
Quatro opções em cartões empilhados (1 coluna em mobile, 2 colunas em desktop):
| Cartão | Label principal | Descrição inline | Sub-label técnico |
|---|---|---|---|
| Faixa total | Sem gestão de faixa | Liquidez ativa em qualquer preço. Rendimento menor, posição não expira. Parecido com V2 em comportamento. | 0 → ∞ |
| ±10% do preço atual | Faixa moderada (default) | Rendimento maior que faixa total. Posição para se o preço sair ~10%. Gestão ocasional. | R$ 16.689 – R$ 20.397 |
| ±5% do preço atual | Faixa estreita | Rendimento alto quando ativo. Expira com frequência — exige atenção regular. | R$ 17.616 – R$ 19.470 |
| Personalizar | Definir manualmente | Para usuário avançado. Define preço mínimo e máximo exatos. | — |
Recomendado para iniciante + justificativa: "Boa faixa de partida: rendimento maior que faixa total com gestão menos frequente que faixa estreita."R$ ↔ ETH).Visualização da faixa (mini-chart de contexto)
1 ETH = R$ 18.543,20 (locale PT-BR, vírgula decimal).Preview de IL contextual (educação no ponto de decisão — Pilar 4)
Campos de valor de aporte
Disponível: 2,34 ETH / Disponível: R$ 4.567,00.25% / 50% / 75% / Máx. em ambos os campos.≈ R$ 21.695 sob o campo ETH, atualizado em tempo real com oracle fresco. Quando oracle > 30s: valor em cinza com asterisco + "Preço pode estar desatualizado."⚠ Saldo insuficiente.Estimativa de custo total + gas
Total: ~R$ 43.390 em tokens + ~R$ 8,40 em gasEstimativa às 14:32 · atualiza a cada 30s.CTA de progressão (sticky rodapé em mobile, inline em desktop)
"Configurações avançadas" ▾ — colapsado por default; expande para:
15 min / 30 min / 1h.Badge "Recomendado para iniciante" no cartão ±10% — visual compacto, sem texto longo.
| Estado | Comportamento |
|---|---|
| Vazio — entrada sem contexto | Redireciona para pools-03: "Comece escolhendo o par e o protocolo." |
| Loading — oracle de preço | Skeleton no chip-strip + mini-chart + campos de valor. Label: "Carregando dados do pool ETH/USDC…" CTA desabilitado: "Buscando dados do pool…" |
| Oracle stale (> 30s) | Campos de valor exibem eyebrow USD em cinza com "Preço desatualizado · Reconectando…". CTA continua disponível com aviso: "Preço pode ter mudado. Confirme na próxima tela." |
| Range inválido (min ≥ max em "Personalizar") | Borda vermelha nos inputs + label: "Preço mínimo deve ser menor que o máximo." CTA desabilitado. |
| Range single-asset (faixa descolada do preço atual) | Área sombreada do chart some. Um campo de valor é desabilitado com label contextual. Badge âmbar: "Sua posição entra com apenas um token nesta faixa." Não bloqueia — é escolha válida para LP direcional. |
| Pool ainda não existe (primeiro LP) | Chip-strip substitui KPIs por: "Você será o primeiro provedor. Defina o preço inicial de 1 ETH em USDC." Campo de "Preço inicial" aparece em vez de mini-chart histórico. Warning obrigatório expandido: "Preço inicial incorreto pode resultar em perda imediata por arbitragem." CTA: "Continuar com preço inicial →" |
| Saldo insuficiente | Campo do token deficitário com borda âmbar + ⚠ Saldo insuficiente. CTA desabilitado com label: "Saldo de [token] insuficiente." |
| Saldo insuficiente para gas | Aviso na linha de estimativa de custo: "Saldo de ETH insuficiente para pagar o gas (~R$ 8,40). Seu aporte de ETH está próximo do máximo disponível." CTA desabilitado. |
| Sem wallet conectada | Chip-strip mostra métricas do pool (dados públicos). Campos de valor exibem saldo como —. Chips de percentual em outline com opacidade 60%. CTA: "Conectar carteira para continuar." |
| Pool morta (Vol/TVL < 0,01 por ≥ 7d) | Chip-strip em âmbar. Banner colapsável expandido por default: "Pool com atividade muito baixa. O rendimento estimado pode não se confirmar." Não bloqueia aporte. |
| Gas excepcionalmente alto | Badge âmbar na linha de estimativa: "Gas elevado agora. Transação pode custar mais que o estimado." CTA disponível. |
| Preço moveu durante o preenchimento (> 2%) | Toast não intrusivo: "O preço atual mudou. Faixa e proporção atualizados." Campos recalculam automaticamente sem perder o valor inserido pelo usuário. |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › ETH/USDC › Adicionar liquidez |
| Chip de contexto do passo anterior | ETH/USDC · V3 · 0,05% · ← Voltar |
| Stepper passo 2 (V3) | Definir faixa e valores |
| Stepper passo 2 (V2) | Inserir valores |
| Cartão Faixa total | Sem gestão de faixa |
| Cartão Faixa total — descrição | Liquidez ativa em qualquer preço. Rendimento menor, posição não expira. Parecido com V2 em comportamento. |
| Cartão ±10% — label | Faixa moderada |
| Cartão ±10% — badge | Recomendado para iniciante |
| Cartão ±10% — justificativa | Boa faixa de partida: rendimento maior que faixa total com gestão menos frequente que faixa estreita. |
| Cartão ±5% — label | Faixa estreita |
| Cartão ±5% — descrição | Rendimento alto quando ativo. Expira com frequência — exige atenção regular. |
| Cartão Personalizar — label | Definir manualmente |
| Caption do chart | A área colorida mostra onde sua posição vai gerar rendimento. Fora dela, o rendimento para até você ajustar a faixa. |
| Preço atual | 1 ETH = R$ 18.543,20 |
| Preview IL — ±10% | Se o preço sair desta faixa, sua posição para de gerar rendimento até você ajustar. ETH/USDC saiu de uma faixa de ±10% em aproximadamente 40% dos dias no último mês. |
| Link pedagógico | O que é impermanent loss? ⓘ |
| Saldo disponível | Disponível: 2,34 ETH |
| Eyebrow USD | ≈ R$ 21.695 |
| Range single-asset (campo inativo) | Nesta faixa, somente ETH entra na posição. |
| Estimativa de custo | Total: ~R$ 43.390 em tokens + ~R$ 8,40 em gas |
| Timestamp gas | Estimativa às 14:32 · atualiza a cada 30s |
| Gas elevado | Gas elevado agora. Transação pode custar mais que o estimado. |
| Tolerância de variação de preço (avançado) | Tolerância de variação de preço |
| Slippage Auto tooltip | Auto: calculado com base na profundidade do pool e na volatilidade recente. Para este par: 0,5%. |
| Deadline (avançado) | Transação expira após |
| CTA — sem faixa | Escolha uma estratégia de faixa |
| CTA — sem valor | Insira o valor de aporte |
| CTA — saldo insuficiente | Saldo de ETH insuficiente |
| CTA — sem wallet | Conectar carteira para continuar |
| CTA — pronto | Continuar → |
| Primeiro LP — chip-strip | Você será o primeiro provedor. Defina o preço inicial de 1 ETH em USDC. |
| Primeiro LP — warning | Preço inicial incorreto pode resultar em perda imediata por arbitragem. Revise com cuidado antes de continuar. |
| Adaptação V2 (campo de range ausente) | V2 distribui liquidez em todos os preços — sem necessidade de definir faixa. |
| Oracle stale | Preço desatualizado · Reconectando… |
| Preço moveu | O preço atual mudou. Faixa e proporção atualizados. |
[uniswap/_consolidado/nova-posicao.md § Insight — Stepper pedagógico e contextual]. Kotai herda o padrão e estende para 3 passos (par/protocolo separado do range em pools-03).[pancake/_consolidado/adicionar-liquidez.md § Insight — Adaptação honesta do formulário ao protocolo].[uniswap/_consolidado/nova-posicao.md § Insight — Microcopy pedagógica inline].[uniswap/_consolidado/nova-posicao.md § Insight — Feedback visual explícito de estado].25% / 50% / 75% / Máx. em campos de aporte: elimina cálculo cognitivo de "quanto é 50% do meu saldo". Fonte: [uniswap/_consolidado/visualizar-pool.md § Insight — Presets chips em qualquer decisão financeira].[uniswap/_consolidado/visualizar-pool.md § Fricção estrutural — Affordance sem estado honesto].[pancake-final § Pilar 5 — Mobile-first interaction].[uniswap/_consolidado/visualizar-pool.md § Oportunidade — Contexto persistente no ato de operar].[pancake-final § Pilar 5 — Localização BR/LatAm como infraestrutura].[uniswap/_consolidado/visualizar-pool.md § Fricção estrutural — Unidade técnica não traduzida para intuitiva] + [uniswap/_consolidado/visualizar-pool.md § Oportunidade — Tradução técnica→intuitiva].[uniswap-final § Insight — Estados como instrução acionável] + [pancake-final § Pilar 2 — CTA dinâmico].[uniswap/_consolidado/nova-posicao.md § Fricção — Affordance e semântica ambígua em campos de decisão financeira].[uniswap/_consolidado/nova-posicao.md § Fricção — Versão como caixa-preta] + [pancake/_consolidado/adicionar-liquidez.md § Fricção — Seleção de protocolo como caixa-preta técnica][uniswap/_consolidado/nova-posicao.md § Fricção — Ausência de estado do pool destino][uniswap/_consolidado/visualizar-pool.md § Fricção — Affordance sem estado honesto][uniswap/_consolidado/visualizar-pool.md § Fricção — Unidade técnica não traduzida][pancake-final § Fricção 2 — i18n parcial][uniswap/_consolidado/nova-posicao.md § Ponto isolado — "30 minutes" não traduzido][pancake-final § Pilar 7] + [uniswap/_consolidado/nova-posicao.md § Oportunidade — Pedagogia de versão: cartões de trade-off]. Hipótese: iniciante que escolhe "Faixa moderada" cria posição mais adequada ao seu perfil de gestão do que iniciante que enfrenta campo de min/max em preço absoluto sem referência.[pancake-final § Pilar 4] + [uniswap/_consolidado/pools.md § Sistema pedagógico de métricas DeFi]. Hipótese: iniciante que lê "ETH/USDC saiu de ±10% em ~40% dos dias" calibra expectativa de gestão antes de aportar — reduz abandono confuso de posições expiradas.[pancake-final § Pilar 5]. Hipótese: usuário BR toma decisão de aporte na moeda que entende sem conversão mental.[uniswap/_consolidado/nova-posicao.md § Oportunidade — Slippage adaptativo ao par/pool]. Hipótese: slippage calibrado por profundidade + volatilidade do par reduz transações falhas em pool com baixa liquidez e reduz exposição a MEV em pool líquida.[uniswap/_consolidado/nova-posicao.md § Observações — URL como state machine]. Hipótese: setup de LP shareable por link reduz custo de suporte ("como eu reproduzo o que estava fazendo?") e viabiliza deep-link de campanhas de liquidez.Permite que o usuário configure os parâmetros específicos da sua posição (faixa de preço quando aplicável, valor de aporte de cada token) com visibilidade do estado atual do pool e feedback preditivo de resultado. Foco: intermediário para o modo Concentrada; iniciante para o modo Simples.
Esta tela tem dois layouts conforme o modo escolhido na Tela 01. O layout Simples é apresentado primeiro; o Concentrada, em seguida. Modo Programável compartilha o layout Concentrada com adição de uma seção de configuração de hook ao final (não detalhada nesta proposta — escopo de uma tela futura).
2.A.1 Card de saúde do pool (propagado da Tela 01, agora sempre expandido na Tela 02) Exibe TVL, Volume 24h + variação, APR estimado (7d), badge de atividade, e — quando pool é novo — o aviso de "você define o preço inicial" expandido com o campo de preço inicial editável.
2.A.2 Campos de aporte Dois campos empilhados verticalmente (Token A / Token B). Cada campo:
Acoplamento de campos: Ao digitar em Token A, Token B auto-preenche conforme o ratio de preço atual do pool. Ao digitar em Token B, Token A auto-preenche. Um ponto de entrada altera o outro. Exceção: pool novo — ambos os campos são independentes; o usuário define o aporte em cada token livremente; a razão entre eles determina o preço inicial do pool.
2.A.3 Resumo de custo e proteção Abaixo dos campos de aporte:
2.A.4 Stepper — Etapa 1 ativa. Etapa 2 futura. 2.A.5 Breadcrumb — "Ganhar rendimento / Criar posição / Configurar"
2.B.1 Card de saúde do pool (mesmo componente do Layout A, sempre expandido aqui)
2.B.2 Seletor de faixa de preço
O componente mais importante desta tela. Estrutura:
Presets de faixa — 3 cards horizontais:
| Label | Faixa | Indicador | Nota |
|---|---|---|---|
| "Conservadora" | ±10% do preço atual | "Dentro do range ~90% do tempo (30d)" | Menor retorno/risco |
| "Moderada" | ±30% do preço atual | "Dentro do range ~75% do tempo (30d)" | Equilíbrio |
| "Ampla" | Full range (sem limite) | "Sempre dentro do range" | Menor eficiência de capital |
Cada preset mostra:
Inputs de faixa manual (abaixo dos presets):
Visualização de faixa:
2.B.3 Campos de aporte (mesmo componente do Layout A) Diferença: quando o preço atual estiver fora da faixa definida pelo usuário, apenas um dos campos fica habilitado (comportamento natural de LP concentrada — o pool só aceita o token do lado do range). Exibir aviso inline: "Com esta faixa, você só aporta [Token X] até o preço entrar na faixa." Este aviso previne confusão de "por que só um campo está ativo?".
2.B.4 Seletor de fee tier (aparece apenas em modo Concentrada/V3) Segmented control horizontal com 4 chips: "0,01%" / "0,05%" / "0,3%" / "1%" — não oculto nem dropdown. Chip com maior liquidez no par selecionado recebe badge "Mais usado neste par". Tooltip de cada tier ao tocar:
2.B.5 Resumo de custo e proteção (mesmo que Layout A)
2.B.6 Stepper e Breadcrumb — iguais ao Layout A.
RN-09 — Propagação de contexto da Tela 01. Par, modo e estado do pool (existente saudável / inativo / novo) chegam propagados por URL ou estado de formulário. Se o usuário acessar a Tela 02 diretamente (via URL sem estado da Tela 01), redirecionar para Tela 01 com o par pré-preenchido se disponível na URL.
RN-10 — Acoplamento de campos de aporte em pool existente. Ao digitar Token A: Token B = valor Token A × (reserva Token B / reserva Token A) do pool. Ao digitar Token B: Token A = valor Token B × (reserva Token A / reserva Token B). O acoplamento respeita a composição atual do pool — não usa preço de mercado externo diretamente para evitar slippage no cálculo de preview.
RN-11 — Pool novo: campos independentes + campo de preço inicial. Quando o pool é novo (detectado na Tela 01): campo "Preço inicial: 1 [Token A] = ? [Token B]" aparece no card de saúde expandido, acima dos campos de aporte. Usuário define o preço → campos de aporte ficam independentes (qualquer ratio é aceito). Após definir o preço: se o usuário alterar Token A, Token B sugere o valor correspondente (não força). O aviso de risco de arbitragem permanece visível durante todo o preenchimento.
RN-12 — Validação de saldo. Ao blur (perda de foco) de cada campo: comparar com saldo disponível. Se valor > saldo: campo com borda vermelha + mensagem de saldo insuficiente + dois CTAs de recuperação ("Comprar com fiat" / "Ver endereço de depósito"). O CTA principal não é bloqueado ainda — o botão da tela muda para o estado de erro descrito abaixo.
RN-13 — Faixa inválida (modo Concentrada). Preço mínimo ≥ preço máximo: ambos os campos ficam com borda vermelha, aviso inline "O preço mínimo deve ser menor que o preço máximo", CTA de avanço bloqueado.
RN-14 — Faixa muito estreita (modo Concentrada): aviso preventivo. Quando faixa < 2% de largura do preço atual em par volátil (token não-stable): aviso inline não-bloqueante "Faixa muito estreita — o preço pode sair em horas. Considere ampliar a faixa." Badge na visualização de faixa muda para laranja. CTA continua habilitado.
RN-15 — Out-of-range imediata: preço atual fora da faixa definida. Se preço atual > preço máximo definido ou < preço mínimo definido: aviso proeminente acima dos campos de aporte "⚠ O preço atual está fora da sua faixa — você não ganhará taxas até o preço entrar na faixa." Um dos campos de aporte fica readonly com valor 0 (comportamento de LP concentrada fora do range). CTA continua habilitado com label "Configurar posição fora do range" (não "Configurar minha posição") para sinalizar o estado.
RN-16 — Slippage adaptativo. Valor de "Auto" calculado por: profundidade de liquidez do pool para o aporte + volatilidade 24h do par + tamanho do aporte em USD. Par estável/alta liquidez: sugestão de 0,1%. Pool morto ou baixa profundidade: sugestão de 3–5% + warning "Profundidade baixa — slippage alto esperado." Pool novo: 1% como default com aviso. Valor editável manualmente pelo usuário. Se slippage manual > 5%: warning "Slippage alto — sua transação pode ser alvo de MEV (front-running)." Se slippage manual > 15%: warning mais forte + chips de alternativa.
RN-17 — Auto-flip de preço por magnitude. Quando ratio Token A / Token B < 0,001 (ex: BTCB/USDT exibido como 0,0000X): botão "Inverter par" aparece na visualização de faixa; ao clicar, inverte a base de preço e recalcula os campos. Badge discreto "(invertido: 1 [Token B] = X [Token A])" fica visível.
RN-18 — Fee tier pré-selecionado por heurística. Fee tier com maior TVL ativo para o par selecionado é pré-selecionado. Se não houver dados (pool novo): fee tier mais comum para o tipo de par (0,3% para a maioria; 0,05% para pares estáveis). Badge "Mais usado neste par" no chip pré-selecionado.
RN-19 — CTA de avanço: condições de habilitação. Habilitado quando: par válido + campos de aporte preenchidos com valor > 0 + saldo suficiente em ambos os tokens + faixa válida (se Concentrada). Label: "Revisar posição" (não "Confirmar" — a confirmação real é na Tela 03).
Vazio (campos não preenchidos): Campos de aporte em branco com placeholder "0". Botão de fill-max disponível. CTA "Inserir o valor do aporte" (disabled). Presets de faixa visíveis mas sem dados de indicador de probabilidade enquanto o aporte é zero.
Loading (carregando dados de liquidez do pool para cálculo de slippage adaptativo e indicadores de preset): Skeleton nos indicadores de preset ("Dentro do range ~?%"). Slippage exibe "Auto (calculando...)". Máximo 3s de loading; fallback: valores estimados com disclaimer "Baseado em dados de mercado. Pode variar."
Saldo insuficiente (um ou ambos os tokens): Campo com borda vermelha. Mensagem: "Saldo insuficiente de [Token]. Você tem [saldo disponível]." Dois CTAs inline: "Comprar [Token] com fiat" / "Trazer de outra carteira". CTA principal muda para "Saldo insuficiente — ajuste o valor" (disabled, laranja).
Faixa inválida (min ≥ max, modo Concentrada): Ambos os campos de faixa com borda vermelha. Mensagem inline: "O preço mínimo deve ser menor que o preço máximo." Visualização de faixa exibe estado de erro (barra vermelha). CTA bloqueado.
Out-of-range imediata (preço atual fora da faixa, modo Concentrada): Banner amarelo: "⚠ O preço atual está fora da sua faixa. Você não ganhará taxas até o preço entrar nela. [Por quê isso acontece? ▾]" Colapsável com explicação: "Em provisão concentrada, você só ganha taxas quando o preço estiver dentro da faixa que você definiu. Fora da faixa, sua posição fica ativa mas parada." CTA muda para "Configurar posição fora da faixa" — enabled, mas label diferente para sinalizar o estado.
Pool novo (par sem pool existente): Campo "Preço inicial" no card de saúde expandido. Campos de aporte independentes (sem acoplamento). Aviso permanente: "Atenção: o preço que você definir determina a taxa de câmbio inicial deste pool. Se estiver muito diferente do preço de mercado, arbitradores vão corrigir imediatamente e você pode perder parte do aporte." Tooltip "Saiba mais" explica arbitragem em 2 frases.
Slippage alto detectado (> 5%): Warning não-bloqueante: "Slippage acima de 5% — sua transação pode ser alvo de front-running (MEV)." Chips de alternativa: "Usar MEV protection" / "Reduzir aporte" / "Manter assim".
Rede errada detectada durante preenchimento: Banner no topo: "Você trocou para [Rede X]. Este pool está em [Rede Y]. Troque de volta ou comece um novo par." CTA bloqueado.
Carteira desconectada durante preenchimento: Banner no topo: "Carteira desconectada. [Reconectar]." Campos permanecem preenchidos. CTA bloqueado até reconexão.
Label de seção dos campos de aporte: "Quanto você quer depositar?"
Instrução no campo de aporte: "Digite o valor e o outro campo é preenchido automaticamente."
Presets de faixa (modo Concentrada):
Campos de faixa manual:
Chip de slippage:
Tempo da transação:
Aviso out-of-range: "⚠ O preço atual está fora da sua faixa. Você não ganhará taxas até o preço entrar nela."
Aviso pool novo: "Atenção: você define o preço inicial deste pool. Se estiver muito diferente do mercado, você pode perder parte do aporte por arbitragem no primeiro bloco."
Aviso faixa muito estreita: "Faixa muito estreita — o preço pode sair em horas. Considere ampliar a faixa ou usar a opção 'Moderada'."
Mensagens de saldo insuficiente: "Saldo insuficiente de [Token]. Você tem [saldo disponível] disponível."
CTA de avanço:
[uniswap-nova-posicao § Pontos isolados — Tela 3: Settings de slippage/deadline em popover][uniswap-nova-posicao § 🟢 Feedback visual explícito de estado — Tela 3: chip Auto][pancake-final § 🟢 Transparência proativa antes do CTA] + [uniswap-final § 🟢 Estados como instrução acionável][uniswap-nova-posicao] + [pancake-adicionar-liquidez][uniswap-nova-posicao][uniswap-final § 🟢 Múltiplas representações do mesmo dado + bidirecionalidade][uniswap-nova-posicao § 🔴 Pontos isolados — Tela 3: Auto = 2,5% sem critério][uniswap-nova-posicao § 🔴 Pontos isolados — Tela 3: "30 minutes" não traduzido] + [uniswap-nova-posicao § 🔴 Affordance e semântica ambígua — "Prazo final da transação"][uniswap-nova-posicao § 🔴 Affordance e semântica ambígua — "Nível de tarifas"][uniswap-nova-posicao § 🔴 Estrutural — Ausência de estado do pool destino][uniswap-nova-posicao § Observações adicionais — Caso "pool ainda não existe"][pancake-final § Fricção 13 — Gráficos e métricas hover-only][pancake-final § Pilar 7 — Mobile-first + BR/LatAm — auto-flip de preço por magnitude][uniswap-final § Pilar 5 — Presets de range com probabilidade e APR estimado][uniswap-nova-posicao § 🟡 Oportunidade 3 — Slippage adaptativo][pancake-final § Pilar 6 — Card de saldo insuficiente com duas saídas][pancake-adicionar-liquidez § 🟡 Oportunidade 2 — Filtros por consequência financeira]Dois layouts (A e B): dobra o custo de design e implementação do componente de tela. Mitigação: componentes compartilhados (card de saúde, campos de aporte, resumo de custo) extraídos para biblioteca interna; apenas o seletor de faixa e o fee tier são exclusivos do Layout B. Custo de manutenção: mudanças nos componentes compartilhados impactam ambos os layouts.
Presets de faixa com probabilidade histórica: modelo probabilístico com dependência de indexação de histórico de preço por par. Se o índice ficar desatualizado ou offline, indicadores ficam em "—" (fallback gracioso). Risco de gaming: usuários avançados podem tentar arbitrar os presets se os números ficarem estáveis — mitigado por atualização frequente (diária ou por bloco de 100 trades).
Slippage adaptativo em pool novo: sem profundidade de liquidez existente para calcular slippage, o modelo usa estimativa por tamanho de aporte + spread de mercado externo. A estimativa é intrinsecamente imprecisa para pools novos. Mitigação: label explícito "Auto (estimado para pool novo — pode variar)" + default mais conservador (1%).
Card de saúde sempre expandido na Tela 02: aumenta a altura total da tela, especialmente em mobile. Para pool inativo ou novo, o card tem conteúdo mais denso. Risco de scroll fatigue em mobile. Mitigação: card colapsável após o usuário ter interagido com ele ao menos uma vez (estado persistido por sessão).
Acoplamento Token A ↔ B + faixa out-of-range: quando o preço atual está fora da faixa, um dos campos fica readonly (valor 0). Isso pode confundir o usuário que digitou um valor e viu o campo ser zerado. Microcopy do aviso de out-of-range precisa explicar o comportamento: "Com o preço fora da sua faixa, você só deposita [Token X] agora." Custo de estado de componente: mais lógica de sincronização entre seletor de faixa e campos de aporte.
Estado pós-transação do fluxo de adição de liquidez: cobre a transição de "transação submetida" para "posição ativa" (ou "falhou") e, em caso de sucesso, entrega ao iniciante o onboarding de gestão específico para V3 — o que monitorar, quando agir e como gerenciar a faixa de preço — antes que ele abandone o produto sem entender o que acabou de criar. Intermediário como segundo perfil: vê o resumo da posição e navega diretamente para "Minhas posições".
Card de identidade da posição criada (sempre visível, independente do estado da tx)
#123456 + ícone de cópiaIndicador de estado da transação (componente central, muda conforme estado)
Estado A — Pendente (tx submetida, aguardando mineração):
0xabc…def → Ver no Etherscan ↗Estado B — Confirmado (tx minerada, posição ativa):
Estado C — Falhou (tx revertida on-chain):
Bloco "O que acontece agora" — onboarding de gestão V3 (apenas no Estado B confirmado — Pilar 4)
Este bloco é a diferenciação central desta tela. Todo concorrente mostra "Transaction Submitted" e deixa o usuário à própria sorte em V3. O Kotai entrega o manual de voo antes do usuário fechar a tela:
Para faixa não-total (±10% ou ±5%):
Seção colapsável por default em intermediário; expandida por default em iniciante (heurística: primeira posição LP do usuário → expandida).
Título da seção: "Sua posição precisa de atenção às vezes"
Três itens em lista compacta com ícones:
| Ícone | Situação | O que acontece | O que fazer |
|---|---|---|---|
| 🟢 | Preço dentro da faixa | Posição ativa — gerando rendimento a cada troca | Nada. O rendimento acumula automaticamente. |
| 🟡 | Preço se aproxima do limite | Posição ainda ativa, mas perto de expirar | Avalie se quer mover a faixa. Uma notificação vai te avisar. |
| ⬜ | Preço saiu da faixa | Posição parou de gerar rendimento | Ajuste a faixa ou retire a liquidez. Sem urgência — capital não está em risco. |
Copy de rodapé: "Saída da faixa não é perda. Quando o preço sai, sua posição fica parada — sem rendimento, mas com o capital preservado. Você pode agir quando quiser."
Link pedagógico: "Entender gestão de posição V3 →" — abre painel de ajuda lateral (não nova aba).
Para faixa total:
Preferência de notificação (apenas no Estado B — ação de valor imediato)
CTAs de navegação (sticky bar em mobile, inline em desktop)
| Estado | Comportamento |
|---|---|
| Pendente — normal | Estado A completo: loading animado, estimativa de tempo, hash + link explorer, banner "pode fechar". |
| Pendente — lento (> 5 min) | Aviso de timeout: "Transação demorando mais que o esperado. Pode ser acelerada na sua carteira." Links: "Como acelerar" (ajuda) + "Aguardar". |
| Pendente — usuário fechou a tela e voltou | Retoma no estado atual da tx: se ainda pendente, mostra Estado A; se confirmada, mostra Estado B; se falhou, Estado C. URL da tela inclui hash — estado é recuperável. |
| Confirmada — primeiro LP | Estado B + bloco "O que acontece agora" expandido por default. Toggle de notificação visível. |
| Confirmada — LP recorrente | Estado B + bloco "O que acontece agora" colapsado por default. Toggle de notificação visível. |
| Falhou — slippage excedido | Estado C. Diagnóstico: "A variação de preço durante a transação foi maior que a tolerância definida." CTA primário: "Tentar de novo com tolerância maior" (abre pools-05 com sugestão de aumentar tolerância). |
| Falhou — gas insuficiente | Estado C. Diagnóstico: "Gas insuficiente para executar." CTA primário: "Tentar de novo com gas maior" (abre pools-05 com configurações avançadas abertas). |
| Falhou — allowance insuficiente | Estado C. Diagnóstico: "Permissão de token expirou ou foi insuficiente." CTA primário: "Tentar de novo" (abre pools-05; o fluxo de aprovação é reiniciado). |
| Falhou — revert genérico | Estado C. Diagnóstico: "A transação foi revertida pelo contrato. Tente de novo." + link "Ver detalhes do erro" para log técnico. |
| Acesso direto sem hash | Redireciona para pools-01 com banner: "Sessão expirada. Comece um novo aporte." |
| Wallet desconectada durante pendência | Banner discreto: "Carteira desconectada. Sua transação continua sendo processada independentemente." — polling não depende de wallet para monitorar. |
| Sem conexão com explorer (link para Etherscan falha) | Link "Ver no Etherscan ↗" fica cinza com tooltip: "Explorer temporariamente indisponível." Hash ainda é exibido e copiável. |
| Elemento | Texto |
|---|---|
| Card identidade — par | ETH / USDC · V3 · 0,05% |
| Card identidade — faixa | R$ 16.689 – R$ 20.397 (±10%) |
| Card identidade — valores | 1,17 ETH + R$ 21.695 USDC · Total: ≈ R$ 43.390 |
| Estado A — Título | Transação enviada |
| Estado A — sub-copy | Sua posição está sendo confirmada na blockchain. Isso geralmente leva de 15 segundos a 3 minutos. |
| Link explorer | Ver no Etherscan ↗ |
| Banner "pode fechar" | Você pode fechar esta tela com segurança. Sua posição aparecerá em 'Minhas posições' assim que confirmada. |
| Progresso estimado | Estimativa: ~45 segundos |
| Estado B — Título | Posição criada com sucesso! |
| Estado B — sub-copy | Sua liquidez já está ativa no pool ETH/USDC. Você começa a ganhar rendimento com cada troca feita neste par. |
| Estado C — Título | Transação não concluída |
| Estado C — nenhum fundo movido | Nenhum token saiu da sua carteira. |
| CTA tentar de novo | Tentar de novo |
| Link detalhes do erro | Ver detalhes do erro |
| Onboarding — título | Sua posição precisa de atenção às vezes |
| Item ativo (🟢) — situação | Preço dentro da faixa |
| Item ativo — o que acontece | Posição ativa — gerando rendimento a cada troca |
| Item ativo — o que fazer | Nada. O rendimento acumula automaticamente. |
| Item próximo do limite (🟡) — o que fazer | Avalie se quer mover a faixa. Uma notificação vai te avisar. |
| Item fora da faixa (⬜) — o que acontece | Posição parou de gerar rendimento |
| Item fora da faixa — o que fazer | Ajuste a faixa ou retire a liquidez. Sem urgência — capital não está em risco. |
| Rodapé onboarding | Saída da faixa não é perda. Quando o preço sai, sua posição fica parada — sem rendimento, mas com o capital preservado. Você pode agir quando quiser. |
| Link ajuda V3 | Entender gestão de posição V3 → |
| Onboarding faixa total | Posição ativa em todos os preços. Sem necessidade de ajuste de faixa. Rendimento acumula automaticamente. |
| Notificação — pergunta | Quer ser avisado quando o preço se aproximar da borda da faixa? |
| Toggle notificação | Ativar alertas de faixa |
| Sub-copy notificação | Você pode configurar outros canais de notificação em Preferências. |
| Timeout tx lenta | Sua transação está demorando mais que o esperado. Isso pode acontecer quando o gas está baixo. Você pode acelerá-la na sua carteira ou aguardar. |
| Link acelerar tx | Como acelerar |
| CTA primário | Ver minha posição |
| CTA secundário | Ver o pool |
| Link adicionar mais | Adicionar mais liquidez |
| Slippage excedido | A variação de preço durante a transação foi maior que a tolerância definida. Tente de novo com tolerância maior em Configurações avançadas. |
| Gas insuficiente | Gas insuficiente para executar. Aumente o gas em Configurações avançadas e tente de novo. |
| Allowance insuficiente | Permissão de token expirou ou foi insuficiente. As aprovações serão solicitadas novamente. |
| Revert genérico | A transação foi revertida pelo contrato. Isso pode ter ocorrido por mudança de preço abrupta. Tente de novo. |
| Compartilhamento | Copiar link desta posição |
| Explorer indisponível | Explorer temporariamente indisponível. |
[uniswap/_consolidado/visualizar-pool.md § Insight — Sticky de identidade + CTAs em mobile].[uniswap/_consolidado/visualizar-pool.md § Insight — Dados on-chain inline sem desvio para explorer externo].[pancake-final § Pilar 2 — CTA dinâmico + Default contextual] (informação proativa sobre o que o usuário pode fazer, não só o que o sistema está fazendo).[pancake-final § Insight — Transparência proativa antes do CTA] + [uniswap-final § Insight — Estados como instrução acionável].[proposta/pools/pools-01.md § Estados — Sucesso — usuário criou primeira posição] — continuidade narrativa interna do fluxo.[pancake-final § Pilar 5 — Localização BR/LatAm].[pancake-final § Pilar 7 — Curadoria opinionada] — produto opinionado não pressupõe que o usuário quer notificações.[pancake-final § Fricção 2 — i18n parcial].[uniswap/_consolidado/visualizar-pool.md § Fricção — Affordance sem estado honesto].[pancake-final § Pilar 4]. Hipótese: usuário que lê "saída da faixa não é perda de capital — é pausa no rendimento" antes de fechar a tela não vai abrir ticket de suporte dizendo "perdi meu dinheiro" quando a posição expirar. Diferenciador direto vs Uniswap e Pancake, que mostram apenas "Transaction Submitted" sem qualquer contexto de gestão.[pancake-final § Pilar 6]. Hipótese: LP que recebe notificação de faixa em risco tem mais chance de agir a tempo (ajustar faixa ou retirar) do que LP que monitora manualmente — reduz capital parado em posições expiradas sem gestão.[pancake-final § Pilar 5]. Hipótese: usuário mobile que fecha a tela confiante de que a posição vai aparecer em "Minhas posições" tem melhor experiência que usuário que fica com o app aberto por 3 minutos aguardando.[uniswap/_consolidado/visualizar-pool.md § Fricção — Affordance sem estado honesto] + [pancake-final § Pilar 4]. Hipótese: usuário que lê "slippage excedido — tente de novo com tolerância maior" tenta novamente em vez de abandonar o produto.Cockpit pessoal de uma posição LP: o usuário (foco em intermediário recorrente, com iniciante recém-criando a primeira posição como segundo perfil) quer saber "como está a minha posição?" — se está gerando rendimento (range status), quanto acumulou em taxas, qual é o resultado financeiro líquido (delta vs aporte + IL estimado) — e tomar ações de gestão. Tela radicalmente diferente de pools-02: pools-02 é o painel do pool como ativo público; esta tela é o painel de quem tem capital comprometido nele.
Ponto de entrada: "Ver minha posição" (pools-06) e "Gerenciar" (pools-01 › Minhas posições).
Header de identidade sticky
Card de desempenho pessoal (componente central)
↑ R$ 120,40 (2,3%) desde o aporte — verde quando positivo, vermelho quando negativo.Mini-chart de faixa de preço (mobile-first, herdado de pools-04)
Card de taxas acumuladas
0,003 ETH + 4,20 USDC ≈ R$ 59,80Informações da posição (seção colapsável por default em intermediário, expandida em primeira posição)
R$ 16.689 – R$ 20.397 (±10%) + protocolo + fee tier12 de abril de 20261,17 ETH + R$ 21.695 USDC ≈ R$ 43.390CTAs de gestão (sticky footer em mobile, inline em desktop)
#123456 + ícone de cópia. Link para explorer externo rotulado: "Ver no Etherscan ↗".positionId da URL. Se acessada sem ID, redireciona para pools-01 sub-tab "Minhas posições" com mensagem: "Selecione uma posição para gerenciar."[tickLower, tickUpper] da posição. Threshold de "Perto do limite" = preço dentro de 5% da borda mais próxima. Threshold configurável como preferência de notificação (ativado em pools-06).IL = valor_atual_da_posição - valor_hipotético_hold. Requer o preço dos dois tokens no momento do aporte (obtido do evento on-chain de mint). Se evento não disponível (posição migrada de outra versão ou importada), exibir "IL não disponível para esta posição" — nunca tentar estimar sem dado de referência.delta = valor_atual - valor_aportado. Inclui IL + taxas acumuladas + variação de preço dos tokens. Tooltip explica os três componentes.| Estado | Comportamento |
|---|---|
| Loading inicial | Skeleton em header, card de desempenho, mini-chart e taxas. Label: "Carregando sua posição ETH/USDC…" |
| Posição ativa, in-range | Badge 🟢 "Ativa". Card de taxas visível se taxas > R$0,01. |
| Posição perto do limite | Badge 🟡 "Perto do limite" + aviso inline colapsável: "O preço está a X% da borda inferior da faixa. Fora dela, o rendimento pausa." + link "Ajustar faixa". |
| Posição out-of-range | Badge ⬜ "Fora da faixa" + card de aviso expandido (não colapsável na primeira visita): "Sua posição parou de gerar rendimento. Capital preservado — sem urgência para agir." + CTAs inline: "Ajustar faixa" e "Remover liquidez". |
| Posição V2 / faixa total | Sem badge de range. Mini-chart sem banda. Seção de faixa com copy explicativo. |
| Sem taxas acumuladas | Card de taxas com "R$ 0,00 · As taxas acumulam conforme o pool é usado." CTA "Coletar taxas" desabilitado. |
| IL muito negativo (IL > 20% do aporte) | Tooltip de IL expandido automaticamente + link pedagógico: "Entender por que isso acontece →". Não bloqueia nenhuma ação. |
| Erro de RPC / dados | Banner não bloqueante: "Dados desatualizados há X minutos. Tentando reconectar…" + CTA "Tentar agora". |
| Wallet desconectada | Banner bloqueante: "Carteira desconectada. Reconecte para ver sua posição." + CTA "Conectar carteira". |
| Rede errada | Banner: "Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar." + CTA "Mudar para [Y]". CTAs de gestão desabilitados com label contextual. |
| Posição encerrada | Card read-only com valor de saída. Mensagem: "Esta posição foi encerrada em [data]." CTAs de gestão ocultos. |
| Primeiro acesso pós-criação (vindo de pools-06) | Seção "Informações da posição" expandida por default. Badge de onboarding: "Posição criada há X minutos — rendimento começa a acumular com cada troca." |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › Minhas posições › ETH/USDC |
| Título implícito da posição | ETH / USDC · V3 · 0,05% · #123456 |
| Badge ativo | ✅ Ativa |
| Badge perto do limite | ⚠ Perto do limite |
| Badge fora da faixa | ⬜ Fora da faixa |
| Label valor atual | Valor atual da posição |
| Delta positivo | ↑ R$ 120,40 (2,3%) desde o aporte |
| Delta negativo | ↓ R$ 85,20 (1,9%) desde o aporte |
| Label IL | Variação de composição estimada (IL) ⓘ |
| Tooltip IL | Quando os preços dos tokens mudam após o aporte, a composição da posição muda junto. Isso é o impermanent loss (IL). Não é uma perda realizada — só se concretiza se você retirar agora. Se o preço voltar ao patamar do aporte, o IL desaparece. |
| Tooltip delta | Inclui três componentes: taxas acumuladas, variação de preço dos tokens, e variação de composição (IL). |
| Label taxas | Taxas prontas para coletar |
| Valor taxas | 0,003 ETH + 4,20 USDC ≈ R$ 59,80 |
| Sem taxas | R$ 0,00 · As taxas acumulam conforme o pool é usado. |
| CTA coletar taxas (ativo) | Coletar taxas → |
| CTA coletar taxas (inativo) | Nenhuma taxa para coletar ainda. |
| CTA adicionar mais | Adicionar mais liquidez |
| CTA remover | Remover liquidez |
| Aviso out-of-range | Sua posição parou de gerar rendimento. Capital preservado — sem urgência para agir. |
| Link ajustar faixa | Ajustar faixa |
| Faixa V2 | Liquidez distribuída em todos os preços — sem faixa ativa. |
| Loading | Carregando sua posição ETH/USDC… |
| Dados desatualizados | Dados desatualizados há X minutos. Tentando reconectar… |
| Wallet desconectada | Carteira desconectada. Reconecte para ver sua posição. |
| Rede errada | Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar. |
| CTA mudar rede | Mudar para [Y] |
| Posição encerrada | Esta posição foi encerrada em [data]. |
| Onboarding pós-criação | Posição criada há X minutos — rendimento começa a acumular com cada troca. |
[uniswap posicao-populada-01 § Insight 1 — Pool detail bem populado vira argumento de venda][uniswap/_consolidado/visualizar-pool.md § Oportunidade — Contexto persistente no ato de operar][pancake-final § Pilar 5 — Mobile-first interaction][pancake-final § Pilar 5 — Localização BR/LatAm como infraestrutura][pancake-final § Pilar 2 — CTA dinâmico] + [uniswap-final § Insight — Estados como instrução acionável][uniswap/_consolidado/visualizar-pool.md § Insight — Dados on-chain inline][uniswap-final § Hierarquia de risco preservada por defaults pró-segurança][uniswap-final § Insight — Progressive disclosure como padrão arquitetural][uniswap posicao-populada-01 § Fricção 1 — APR 47% em fonte gigante é o APR médio da pool, não o APR do range escolhido][pancake-final § Pilar 6 — Risk signaling sistêmico] + [uniswap/_consolidado/visualizar-pool.md § Oportunidade — Contexto persistente no ato de operar][pancake-final § Fricção 1 — Léxico de protocolo e infraestrutura como vocabulário primário de UI][pancake-final § Fricção 2 — i18n parcial e inconsistente][uniswap-final § Insight — Estados como instrução acionável, não decoração][pancake-final § Pilar 4 — Educação contextual]. Hipótese: label menos alarmante aumenta taxa de usuários que leem o dado (vs fecham a tela), calibrando expectativa real.[pancake-final § Pilar 6 — Risk signaling sistêmico]. Hipótese: usuário que vê "Fora da faixa" no badge antes de qualquer número toma ação de gestão mais rápido que usuário que precisa interpretar um gráfico para descobrir isso.[uniswap/_consolidado/pools.md § Oportunidade — Sistema pedagógico de métricas DeFi]. Hipótese: "R$ 59,80 prontas para coletar" converte em ação; "APR 12,4%" não.[pancake-final § Pilar 5 — Mobile-first interaction].Intl.NumberFormat com locale pt-BR em todo cálculo de display — custo de implementação real em frontend.Tela de ação do segmento de stake: o usuário (foco em iniciante conservador que escolheu stake exatamente para evitar a complexidade de LP) decide quanto depositar, vê o rendimento estimado desdobrado em visão mensal e anual antes do commit, confirma os termos de lockup, e assina a transação. Mais simples que o fluxo LP (sem stepper, sem seleção de faixa, sem IL) — toda a decisão cabe em uma tela.
Ponto de entrada: CTA "Ver e depositar →" de pools-11, com pool pré-carregado.
Header de identidade do pool (sticky)
Rendimento est. 4,2% · Taxas: 3,8% · Incentivos: 0,4% · Sem prazo mínimo · Recompensa em USDC.Input de quantidade (componente central — a decisão primária)
25% | 50% | 75% | 100% — tap-targets de 44px mínimo. Calculam o valor em função do saldo disponível.Card de resultado estimado (atualiza em tempo real conforme o input muda)
Card de termos do stake (educação no ponto de commit — Pilar 4)
Prazo mínimo: Sem prazo mínimo (ou o prazo específico com badge âmbar se lockup aplicável).Recompensa em: USDC (ícone do token + nome).Penalidade por saque antecipado: Nenhuma (ou a penalidade específica se aplicável).Aprovação de token: Apenas o valor deste depósito.Estimativa de gas
Fluxo de aprovação de token (inline, quando necessária — mesmo padrão de pools-05 Etapa A)
CTA de confirmação (sticky rodapé em mobile, inline em desktop)
poolId da URL (vindo de pools-11). Sem contexto, redireciona para pools-11.| Estado | Comportamento |
|---|---|
| Loading inicial | Skeleton no card de resultado estimado + card de termos + estimativa de gas. Label: "Carregando dados do pool USDC…" |
| Input vazio | CTA desabilitado: "Insira um valor para continuar." Card de resultado mostra placeholder: "Digite um valor para ver o rendimento estimado." |
| Input preenchido — válido | Card de resultado atualiza com rendimento por mês e por ano. CTA ativo (se aprovação ok). |
| Valor > saldo | Input em âmbar. CTA desabilitado: "Saldo insuficiente de USDC." Linha de saldo em âmbar. |
| Gas alto (> 20% do rendimento mensal) | Badge âmbar: "Gas elevado em relação ao rendimento esperado. Verifique se vale a pena depositar agora." CTA disponível — soberania preservada. |
| Aprovação necessária | Card de aprovação inline aparece acima do CTA. CTA mostra: "Conclua a aprovação acima para continuar." |
| Aprovação assinada — aguardando confirmação on-chain | Card de aprovação com spinner + "Confirmando aprovação de USDC…" |
| Aprovação confirmada | Card de aprovação com ✓ verde + "USDC aprovado." CTA de confirmação entra em estado ativo. |
| Aguardando assinatura de depósito | Spinner no CTA + "Aguardando sua assinatura na carteira…" |
| Tx enviada — aguardando confirmação | CTA com loading + "Transação enviada. Aguardando confirmação…" + hash compacto. Banner: "Você pode fechar esta tela. Seu stake aparecerá em 'Meus stakes' quando confirmado." |
| Sucesso | Estado inline (sem navegar para nova tela): ícone de confirmação + "Depósito confirmado. Rendimento começa a acumular automaticamente." CTA muda para: "Ver meu stake →" (leva para sub-tab "Meus stakes" em pools-11 com o novo stake destacado). Link secundário: "Depositar mais" (reinicia o formulário). |
| Pool com lockup — confirmação | Aviso âmbar no card de termos antes do CTA: "Atenção: retirar antes de [X] dias resulta em perda dos incentivos acumulados." |
| Falha — gas insuficiente | "Gas insuficiente para executar. Aumente a tolerância em Configurações avançadas." CTA "Ajustar gas". |
| Falha — allowance insuficiente | "Permissão de token expirou ou foi insuficiente. A aprovação será solicitada novamente." |
| Falha — revert genérico | "Transação revertida. Nenhum USDC saiu da sua carteira." + link "Ver detalhes do erro". |
| Rede errada | Banner bloqueante: "Você está na rede [X]. Este pool de stake existe em [Y]. Mude para continuar." CTA "Mudar para [Y]". |
| Wallet desconectada | Banner bloqueante: "Carteira desconectada. Reconecte para continuar." CTA "Conectar carteira". |
| Snapshot desatualizado (> 60s) | Banner discreto: "Estimativas podem estar desatualizadas. Atualizando…" |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › Stake de token único › USDC |
| Chips header | Rendimento est. 4,2% · Taxas: 3,8% · Incentivos: 0,4% · Sem prazo mínimo · Recompensa em USDC |
| Label input | Quanto você quer depositar? |
| Linha de saldo | Disponível: 1.234,56 USDC ≈ R$ 1.234,56 |
| Chips atalho | 25% | 50% | 75% | 100% |
| Título card resultado | Resultado estimado |
| Rendimento mensal | ≈ R$ 4,32 (0,35% em 30 dias) |
| Rendimento anual | ≈ R$ 51,84 (4,2% ao ano) |
| Linha decomposição | Estimativa: taxas 3,8% + incentivos 0,4% · base: 7 dias de atividade. |
| Variabilidade | Pode variar com o volume do pool e com o preço do token de recompensa. |
| Recompensa em outro token | Recompensa em [token] — o valor em R$ depende do preço de [token] no momento da coleta. |
| Placeholder do card resultado | Digite um valor para ver o rendimento estimado. |
| Título card termos | Condições deste stake |
| Prazo — sem lockup | Prazo mínimo: Sem prazo mínimo |
| Prazo — com lockup | Prazo mínimo: 30 dias |
| Recompensa — mesmo token | Recompensa em: USDC |
| Penalidade — sem penalidade | Penalidade por saque antecipado: Nenhuma |
| Penalidade — com penalidade | Penalidade por saque antecipado: Perda dos incentivos acumulados |
| Aprovação de token | Aprovação de token: Apenas o valor deste depósito. |
| Aviso lockup | Atenção: retirar antes de 30 dias resulta em perda dos incentivos acumulados. As taxas coletadas são preservadas. |
| Link contrato | Ver contrato do pool → |
| Gas estimado | Gas estimado: ≈ R$ 2,80 |
| Timestamp gas | Estimativa às 11:28 · atualiza a cada 30s. |
| Gas alto | Gas elevado em relação ao rendimento esperado. Verifique se vale a pena depositar agora. |
| Card aprovação — título | Passo 1 de 2: Permitir que o protocolo use seu USDC. |
| Card aprovação — sub-copy | Você vai assinar uma aprovação na sua carteira. Esta ação não move USDC — apenas concede permissão ao contrato. |
| CTA aprovar | Aprovar USDC |
| Estado aprovado | ✓ USDC aprovado. |
| Aprovação infinita (avançado) | Aprovação infinita concede acesso permanente ao contrato para este token. Use com cuidado. |
| CTA — input vazio | Insira um valor para continuar. |
| CTA — saldo insuficiente | Saldo insuficiente de USDC. |
| CTA — aprovação pendente | Conclua a aprovação acima para continuar. |
| CTA — ativo | Confirmar depósito |
| Aguardando assinatura | Aguardando sua assinatura na carteira… |
| Tx enviada | Transação enviada. Aguardando confirmação… |
| Banner pode fechar | Você pode fechar esta tela. Seu stake aparecerá em 'Meus stakes' quando confirmado. |
| Sucesso — título | Depósito confirmado. Rendimento começa a acumular automaticamente. |
| CTA pós-sucesso (primário) | Ver meu stake → |
| Link pós-sucesso (secundário) | Depositar mais |
| Gas insuficiente | Gas insuficiente para executar. Aumente a tolerância em Configurações avançadas. |
| Allowance insuficiente | Permissão de token expirou ou foi insuficiente. A aprovação será solicitada novamente. |
| Revert genérico | Transação revertida. Nenhum USDC saiu da sua carteira. |
| Link detalhes do erro | Ver detalhes do erro |
| Rede errada | Você está na rede [X]. Este pool de stake existe em [Y]. Mude para continuar. |
| Wallet desconectada | Carteira desconectada. Reconecte para continuar. |
| Snapshot desatualizado | Estimativas podem estar desatualizadas. Atualizando… |
25% / 50% / 75% / 100% — atalhos de porcentagem eliminam cálculo cognitivo. Fonte: [uniswap/_consolidado/visualizar-pool.md § Insight — Presets chips em qualquer decisão financeira] + padrão interno herdado de pools-09.[pancake-final § Pilar 7 — Mobile-first interaction + Localização BR/LatAm como infraestrutura].[pancake-final § Pilar 6 — CTA dinâmico] + [uniswap-final § Insight — Estados como instrução acionável].[proposta/pools/pools-08.md § Gas > 50% do valor das taxas — aviso âmbar]. Aqui adaptado: threshold de 20% do rendimento mensal (não das taxas a coletar), porque o referencial é o custo de oportunidade do depósito, não de uma coleta pontual.[pancake-final § Pilar 2 — Defesa em camadas universal] + [proposta/pools/pools-05.md § Aprovação por valor exato].[pancake-final § Pilar 2 — Defesa em camadas universal] + [proposta/pools/pools-05.md § Fluxo de aprovação de token].[pancake-final § Pilar 6] + padrão interno herdado de pools-06, pools-08.[pancake-final § Insight — Transparência proativa antes do CTA].[uniswap/_consolidado/visualizar-pool.md § Fricção — Métricas vivas sem âncora de snapshot].[uniswap/_consolidado/visualizar-pool.md § Insight — Dados on-chain inline].[pancake/_consolidado/visualizar-farm.md § APR opaco / decomposição escondida — Fricção estrutural].[pancake-final § Fricção 5 — Risk signaling ausente em pontos de decisão de alto custo financeiro].[uniswap-final § Fricção 6 — Métricas DeFi sem decomposição, janela ou comparativo].[pancake-final § Fricção 2 — i18n parcial e inconsistente].[pancake-final § Fricção 10 — CTA disabled silencioso sem comunicar o gap].[pancake-final § Pilar 4 — Educação contextual + Transparência financeira] + [pancake/_consolidado/visualizar-farm.md § Oportunidade — APR decomposto visível por default]. Hipótese: iniciante que vê "≈ R$ 4,32 por mês" antes de confirmar tem uma âncora de expectativa realista — menos chance de desistir por "rendimento menor do que esperava" após o primeiro mês.[pancake-final § Pilar 4]. Hipótese: LP que lê "sem prazo mínimo — sem penalidade" antes de confirmar tem confiança de que pode sair quando quiser; LP que descobre lockup depois tende a não usar o produto novamente.[pancake-final § Pilar 2 — Defesa em camadas universal]. Hipótese: usuário que lê o aviso de lockup antes de confirmar faz o cálculo de "posso travar esse capital por X dias?" antes do commit — taxa de arrependimento pós-depósito cai.[pancake/_consolidado/visualizar-farm.md § Auto-flip de preço por magnitude] + [pancake-final § Pilar 7 — Mobile-first interaction + Localização BR/LatAm como infraestrutura]. Hipótese: usuário que opera em valores grandes pensa em R$ primeiro — a inversão elimina a conversão mental.Intl.NumberFormat com locale pt-BR para ambas as linhas — valores com casas decimais no formato R$ 4,32. Custo de implementação pontual, valor recorrente.Fluxo de claim das taxas acumuladas de uma posição LP ativa: o usuário (foco em iniciante e intermediário igualmente) decide se quer receber as taxas como tokens soltos na carteira ou reinvesti-las como liquidez adicional — e confirma a transação. Ação de baixo risco (não remove a posição), mas ainda exige assinatura on-chain e gera custo de gas. Ponto de entrada: CTA "Coletar taxas →" de pools-07.
Header de identidade da posição (herdado de pools-07, sticky)
Card de taxas a receber (componente principal — o que o usuário vai receber)
0,003 ETH ≈ R$ 55,604,20 USDC ≈ R$ 4,20Total ≈ R$ 59,80Seletor de destino das taxas (escolha única, radio implícito de dois cartões)
| Opção | Label principal | Descrição | Quando disponível |
|---|---|---|---|
| Receber na carteira (default) | Receber como tokens | ETH e USDC vão direto para a sua carteira. Pode trocar ou reaplicar quando quiser. | Sempre |
| Reinvestir no pool | Adicionar como liquidez | Taxas são adicionadas como liquidez na mesma faixa. Aumenta a posição sem nova transação de swap. | Somente se a posição estiver in-range |
Estimativa de gas
CTA de confirmação (sticky rodapé em mobile, inline em desktop)
positionId da URL (vindo de pools-07). Se acessada diretamente sem contexto, redireciona para pools-01.| Estado | Comportamento |
|---|---|
| Loading | Skeleton no card de taxas + estimativa de gas. Label: "Carregando taxas da posição #123456…" |
| Gas excepcionalmente alto | Badge âmbar + copy: "Gas elevado. Taxa de rede representa mais de 50% do que você vai receber. Verifique se vale a pena coletar agora." CTA disponível. |
| Gas muito baixo | Badge âmbar: "Gas pode ser insuficiente. Transação pode não executar. Ajuste o limite de gas em Configurações avançadas ▾." Link "Configurações avançadas ▾" expande o campo de max fee inline. |
| Posição out-of-range | Seletor "Reinvestir" desabilitado com label contextual. Default "Receber na carteira" permanece ativo. Badge de range visible no header. |
| Aprovação pendente (se necessária) | Card de aprovação inline (padrão de pools-05). CTA de confirmação aguardando. |
| Aguardando assinatura | Spinner no CTA + "Aguardando sua assinatura na carteira…" |
| Transação enviada | Navega automaticamente para estado de sucesso (tela 8-B, ver abaixo). |
| Transação rejeitada | "Coleta cancelada. Nenhum fundo foi movido." CTA "Tentar de novo" inline. |
| Erro de gas insuficiente | "Gas insuficiente para executar. Aumente a tolerância em Configurações avançadas." CTA "Ajustar gas". |
| Taxas insuficientes | Redireciona para pools-07: "Sem taxas suficientes para coletar no momento." |
| Rede errada | Banner: "Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar." CTA "Mudar para [Y]". |
| Sucesso — tokens na carteira | Toast + retorno automático para pools-07: "R$ 59,80 em taxas adicionados à sua carteira." |
| Sucesso — reinvestido | Toast + retorno automático para pools-07: "Taxas reinvestidas. Sua posição aumentou." |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › Minhas posições › ETH/USDC › Coletar taxas |
| Título do card | Você vai receber |
| Linha de token A | 0,003 ETH ≈ R$ 55,60 |
| Linha de token B | 4,20 USDC ≈ R$ 4,20 |
| Total | Total ≈ R$ 59,80 |
| Timestamp | Calculado às 11:28 — pode variar levemente até a confirmação. |
| Opção A — nome | Receber como tokens |
| Opção A — descrição | ETH e USDC vão direto para a sua carteira. Pode trocar ou reaplicar quando quiser. |
| Opção B — nome | Adicionar como liquidez |
| Opção B — descrição | Taxas são adicionadas como liquidez na mesma faixa. Aumenta a posição sem nova transação de swap. |
| Opção B desabilitada | Disponível somente quando a posição está ativa. |
| Aviso reinvest | Ao reinvestir, você adiciona liquidez na mesma faixa com os dois tokens. Se a faixa sair de range depois, o rendimento pausa novamente. |
| Label gas | Gas estimado: ≈ R$ 3,20 |
| Timestamp gas | Estimativa às 11:28 · atualiza a cada 30s. |
| Gas alto | Gas elevado. A taxa de rede representa mais de 50% do que você vai receber. Verifique se vale a pena coletar agora. |
| Gas aumentou | Gas aumentou desde que você abriu esta tela. Estimativa atualizada. |
| CTA confirmar | Confirmar coleta |
| Aguardando assinatura | Aguardando sua assinatura na carteira… |
| Sem wallet | Conectar carteira para continuar |
| Tx cancelada | Coleta cancelada. Nenhum fundo foi movido. |
| Gas insuficiente | Gas insuficiente para executar. Aumente a tolerância em Configurações avançadas. |
| Sucesso — carteira | R$ 59,80 em taxas adicionados à sua carteira. |
| Sucesso — reinvestido | Taxas reinvestidas. Sua posição aumentou. |
| Rede errada | Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar. |
| Link pedagógico | O que são taxas de LP? |
| Link voltar | ← Voltar para minha posição |
[uniswap posicao-populada-01 § Insight 1 — template de identidade resistente a casos bom/ruim][pancake-final § Pilar 5 — Localização BR/LatAm como infraestrutura][pancake-final § Pilar 2 — CTA dinâmico][pancake-final § Pilar 4 — Educação contextual + Transparência financeira][uniswap/_consolidado/visualizar-pool.md § Fricção — Métricas vivas sem âncora de snapshot][pancake-final § Pilar 3 — Defesa em camadas][pancake-final § Insight — Transparência proativa antes do CTA][uniswap-final § Insight — Ação imediata sem commit nem onboarding][pancake-final § Fricção 2 — i18n parcial][uniswap-final § Fricção 6 — Métricas DeFi sem decomposição, janela ou comparativo][pancake-final § Fricção 2][pancake-final § Pilar 3]. Hipótese: usuário que vê "gas representa 50% do que você vai receber" posterga a coleta para momento de gas mais baixo — economia real de custo sem bloqueio de produto.[pancake-final § Pilar 7 — Curadoria opinionada]. Hipótese: iniciante que recebe tokens na carteira e depois decide reaplicar tem mais contexto do que iniciante que pressiona "reinvestir" sem saber o que isso significa.[pancake-final § Pilar 4]. Hipótese: usuário que vê o total em R$ antes de confirmar tem menos chance de cancelar surpreso com o valor na carteira.Intl.NumberFormat com locale pt-BR — custo pontual de implementação, mas valor recorrente.Permite ao usuário filtrar suas posições de liquidez por rede blockchain, exibindo o seletor em formato de bottom sheet (mobile) ou dropdown inline (desktop) a partir do botão "Rede" na toolbar de filtros. Foco em intermediário que tem posições cross-chain; iniciante deve conseguir entender a lista sem decodificar vocabulário técnico.
2.1 Botão de filtro "Rede" na toolbar (estado fechado — referência)
Rede v (com chevron)Todas as redes v[Nome da rede] v + ícone da rede à esquerdaTodas as redes); Rede (N) quando N redes específicas selecionadas e difere do default — paridade de affordance com filtros Status e Protocolo2.2 Seletor de rede (bottom sheet no mobile / dropdown no desktop) Estrutura hierárquica em três seções com header humanizado:
Seção A — "Todas as redes" (agregado)
Todas as redes + ícone composto (mosaico de logos)Seção B — "Rápidas e baratas" (header de seção)
~R$ 0,05 gas (calculado pela mediana da última semana, atualizado diariamente)Seção C — "Outras redes" (header de seção)
Novo ou Beta mostram tooltip on-tap com 1 frase contextual (ver §5 Microcopy)2.3 Sinalização de estado ativo
2.4 CTA de aplicação (mobile)
Aplicar filtroSeleção
Todas as redes é mutuamente exclusivo com seleção individual; clicar em Todas as redes desmarca todas; clicar em qualquer rede individual desmarca Todas as redes automaticamente.+ Nova posição para criar na rede selecionada (heranças de comportamento do hub de posições).Exibição condicional
count(posições do usuário) == 0 aparecem na lista mas ficam ligeiramente esmaecidas (opacity 60%) com microcopy inline: "Você não tem posições nesta rede". Não são ocultadas — usuário pode filtrar pra confirmar isso.Novo: exibido por 60 dias após integração da rede; acompanhado obrigatoriamente de tooltip de contexto (ver §5).Beta: exibido enquanto a rede estiver em estágio de integração parcial; tooltip com aviso de instabilidade potencial.Gas badge
Propagação de estado
N posições).Vazio — nenhuma posição em nenhuma rede Não afeta o seletor de rede em si; o seletor ainda exibe todas as redes disponíveis. A lista de posições fica vazia independente da seleção de rede.
Loading — carregando redes suportadas
Rede v na toolbar fica disabled enquanto lista carrega.Atualizando….Erro — falha ao carregar lista de redes
Rede sem suporte ao par/protocolo selecionado (filtro cruzado)
Protocolo está ativo (ex.: "Posição com hooks"), redes que não suportam aquele protocolo ficam desabilitadas com tooltip: "Este tipo de posição não está disponível nesta rede".Modo sem wallet / desconectado
Rede errada (wallet ativa em rede diferente da selecionada)
Botão de filtro (toolbar)
Todas as redes ↓Base ↓ (com ícone da rede)Rede (3) ↓Rede ↓ (spinner pequeno)Headers de seção
Todas as redes é autodescritivo)Rápidas e baratasOutras redesGas badges
~R$ 0,05 gas / ~R$ 15,00 gasi: "Custo médio estimado de uma transação de liquidez nesta rede nos últimos 7 dias, em reais."Tooltip para badge Novo (ex.: rede Tempo)
Tooltip para badge Beta
Item esmaecido (sem posições nesta rede)
CTA de aplicação (mobile)
Aplicar filtroRede incompatível com protocolo (disabled)
Todas as redes agrega cross-chain automaticamente — replicação consciente do padrão validado no Uniswap; iniciante nunca precisa configurar para ver tudo. [uniswap suas-posicoes-04 § Insight 1][uniswap suas-posicoes-04 § Insight 2]Novo/Beta em redes recém-integradas — sinal de produto vivo, construção de confiança com intermediário. [uniswap suas-posicoes-04 § Insight 3][uniswap consolidado suas-posicoes § Cosmética — Filtros sem indicador de estado ativo]Rápidas e baratas / Outras redes elimina escolha cega com consequência financeira. [uniswap suas-posicoes-04 § Fricção 1 — catálogo sem categorização]Rede v no botão de filtro — Uniswap usa ícone composto sem texto; os outros filtros têm label (Status v, Protocolo v), criando assimetria de affordance. [uniswap suas-posicoes-04 § Fricção 2 — affordance fraca do filtro de rede]Novo/Beta — badge Novo sem contexto é gatilho de curiosidade sem entrega de informação; tooltip de 1 frase resolve sem poluir a lista. [uniswap suas-posicoes-04 § Fricção 3 — Tempo sem contexto]Rápidas e baratas / Outras redes) em vez de catálogo técnico (L1 / L2 / app-chain). A oportunidade da indústria é que todos os concorrentes (Uniswap, 1inch, Curve, PancakeSwap) listam redes em catálogo plano. Hipótese de diferenciação: usuário iniciante/intermediário escolhe rede por custo e praticidade, não por arquitetura técnica — categorizar por outcome (Rápidas e baratas) torna a decisão de rede uma decisão de UX, não de infra. [uniswap suas-posicoes-04 § Oportunidade — seletor por finalidade][pancake-relatorio-final § Fricção 2 — i18n parcial] [uniswap-relatorio-final § Pilar 4 — Default contextual em camadas]count(posições) == 0 esmaecidas mas não ocultas — sem origem direta nos relatórios. Justificativa: esconder a rede seria A2 (sobre-escopar) e criaria confusão se o usuário espera ver uma rede que sabe que existe; esmaecida comunica "você não tem posições aqui" sem impedir exploração. Risco: pode parecer desabilitada. Evidência a coletar: teste A/B entre "escondida", "esmaecida" e "normal" medindo confusão vs. completeness.Categorização editorial das redes (Rápidas e baratas / Outras) exige critério explícito e manutenção contínua: quando uma nova chain é integrada, alguém decide em qual seção ela entra. Se Ethereum melhorar drasticamente o gas (improvável no horizonte de 2 anos), a categorização precisa de revisão. Aceitar como custo de produto opinionado.
Gas badge em BRL exige pipeline de dados de preço de gas por rede + câmbio BRL/USD. Aumenta dependência de APIs externas; falha nessa pipeline degrada o badge para ausente (não para dado errado). Implementar com fallback gracioso obrigatório.
Bottom sheet no mobile (Pilar 5) é mais complexo de animar que dropdown simples. Custo de componente; ganho: tapping area maior, mais espaço para seções humanizadas. Justificado para seletor com categorias e tooltips.
i18n: gas badge em BRL é locale PT-BR — para usuários em outro locale, o badge precisaria converter para a moeda local. Escopo inicial: exibir em BRL para locale PT-BR; para outros locales, exibir em USD com mesmo padrão. Adiciona 1 variante de string por badge.
Transforma o estado de "carteira conectada sem posições" de placeholder passivo em assistente ativo de onboarding — lê os saldos on-chain da wallet e sugere uma primeira posição concreta baseada no que o usuário já tem. Perfil-foco: iniciante conectando a carteira pela primeira vez ou intermediário retornando após fechar todas as posições.
Estrutural — define o paradigma da tela:
Variante A — saldo compatível para LP (2 tokens com saldo > $10 equivalente):
Variante B — saldo em apenas 1 token (count(tokens > $10) == 1):
Variante C — saldo insuficiente (total < $10 equivalente, mas saldo > $0):
Variante D — saldo nulo ou erro de leitura de saldo:
Cosmético:
Condicionalidade desta tela: renderizada quando count(posições da wallet na Kotai) == 0. Ao criar a primeira posição (via qualquer caminho), redirect para T02.
Leitura de saldos on-chain: executada ao montar a tela. Timeout de 5s — se não completar em 5s, exibir Variante D com badge de erro. Não persistir saldos; ler sempre em tempo real. Não requer aprovação adicional de permissão (read-only).
Lógica de seleção de variante:
Pool sugerida (Variante A) — critérios de seleção (visíveis via "ver critérios"):
CTA "Criar essa posição": ao clicar, vai para criar-pool-01 com par + modo + range + fee pré-configurados. O usuário pode editar qualquer parâmetro dentro do fluxo criar-pool; esta tela apenas define os defaults de entrada.
Cards educacionais: após dismiss individual, estado persistido. Não reaparecem na mesma sessão nem nas próximas (opt-out permanente por card). Botão de reativar nas configurações.
Toolbar inativa: exibida para preservar consistência arquitetural com T02 (usuário reconhece o layout ao criar posições). Texto "Sem posições para filtrar" elimina confusão de "por que não funciona".
Redirect após criação: ao detectar que count(posições) passou de 0 para 1+ (event listener ou polling a cada 15s enquanto a tela está visível), redirect automático para T02 com toast "Posição criada com sucesso."
| Estado | Comportamento |
|---|---|
| Loading de saldo | Skeleton no card prescritivo preservando dimensões; restante da tela (header, toolbar inativa, cards edu, sidebar) carregados independentemente |
| Variante A (2 tokens) | Card prescritivo com par + APR estimado + CTA direto "Criar essa posição" |
| Variante B (1 token) | Card prescritivo com sugestão de split + CTA "Comprar [Token B]" |
| Variante C (saldo insuficiente) | Card prescritivo com on-ramp BR como CTA primário |
| Variante D (saldo nulo / erro) | Card genérico com dois CTAs (PIX + transferência); badge de erro discreto se motivado por timeout |
| Erro de leitura (timeout >5s) | Variante D com badge "Não foi possível ler seu saldo — exibindo orientação genérica." |
| Após dismiss de Card A | Card A some com animação; Card B permanece visível |
| Após dismiss de ambos | Área vira spacer neutro; sem colapso visual abrupto do layout |
| Após criação de posição | Redirect para T02 com toast "Posição criada com sucesso." |
| Carteira desconectada | Redirect para T01 |
| Rede errada | Banner informativo (mesmo padrão de T02): "Suas posições em [Rede] ficam indisponíveis nesta rede. [Trocar para Rede]" |
| Mobile | Card prescritivo ocupa 100% da largura; sidebar colapsa para abaixo dos cards educacionais; CTA "Criar essa posição" como botão full-width dentro do card; CTA manual como link abaixo dos cards edu |
| Elemento | Texto PT-BR |
|---|---|
| Header subtítulo | "Você ainda não tem posições. Veja por onde começar ↓" |
| Variante A | |
| Card texto | "Você tem [R$ 5.250 em USDC] e [R$ 3.100 em ETH]. Pool sugerida para começar: USDC/ETH, taxa 0,05%. Retorno médio nos últimos 30 dias: ~4,9% ao ano." |
| Caveat IL | "(estimativa 30d, sem Impermanent Loss) ⓘ" |
| Tooltip caveat | "Estimativa baseada nas tarifas coletadas pelos provedores desta pool nos últimos 30 dias. Impermanent Loss pode reduzir seu retorno real dependendo da variação de preço entre os tokens." |
| Nota conservadora | "Esta é uma configuração conservadora para primeira posição." |
| Badge transparência | "Sugestão baseada em: par com maior liquidez nos seus tokens [ver critérios]" |
| CTA prescritivo | "Criar essa posição" |
| Link explainer | "Entender os riscos antes de continuar →" |
| Link manual | "Configurar manualmente →" |
| Variante B | |
| Card texto | "Você tem R$ 8.200 em ETH. Para adicionar liquidez em ETH/USDC, você precisará de uma parte em USDC. Quer comprar USDC primeiro?" |
| CTA split | "Comprar USDC" |
| Link alternativo | "Ver pools com só ETH →" |
| Link manual | "Configurar manualmente →" |
| Variante C | |
| Card texto | "Para ganhar rendimento com liquidez, você precisa de criptos em carteira. Compre via PIX — taxas a partir de 1,5%." |
| CTA on-ramp | "Comprar com PIX" |
| Link transferência | "Já tenho cripto em outra exchange — Trazer para cá →" |
| Variante D | |
| Card texto genérico | "Para ganhar rendimento com suas criptos, você precisa de saldo em carteira. Compre via PIX ou traga de outra exchange." |
| CTA A | "Comprar com PIX" |
| CTA B | "Trazer de outra exchange" |
| Badge erro leitura | "Não foi possível ler seu saldo — exibindo orientação genérica." |
| Comum | |
| Toolbar inativa | "Sem posições para filtrar" |
| Card edu A título | "Primeira vez? Como funciona ganhar com liquidez" |
| Card edu A subtítulo | "Leitura de 3 min — sem jargão técnico" |
| Card edu A tag | "Para começar" |
| Card edu B título | "Comparando estratégias de provisão de liquidez" |
| Card edu B tag | "Para quem já usa DeFi" |
| CTA manual | "Adicionar posição manualmente →" |
| Loading saldo | "Analisando sua carteira..." |
| Toast pós-criação | "Posição criada com sucesso." |
[uniswap suas-posicoes § Empty state como espaço editorial — tela 6][uniswap suas-posicoes § Separação visual entre gestão pessoal e discovery pública — telas 5 e 6][uniswap-final § Progressive disclosure como padrão arquitetural][uniswap-final § Estados (vazio, erro, transitório) como instrução acionável][pancake-final § Pedagogia embutida no ponto de decisão][uniswap suas-posicoes § Fricção estrutural: header rewards zerado sem condicional de estado — telas 1 e 6][uniswap suas-posicoes § Fricção cosmética: CTAs paralelos sem hierarquia pedagógica — telas 1 e 5][uniswap suas-posicoes § Oportunidade: empty state prescritivo baseado em saldo da wallet — telas 1 e 6][uniswap suas-posicoes § Fricção estrutural: conteúdo editorial voltado a power user — telas 5 e 6][uniswap suas-posicoes § Oportunidade: empty state prescritivo baseado em saldo da wallet — telas 1 e 6] — passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes têm empty state genérico; (2) ✓ afeta iniciante diretamente; (3) ✓ leitura on-chain + regras editoriais = factível; (4) ✓ empty state passa de placeholder para assistente. Hipótese concreta: iniciante com USDC + ETH vê "Pool sugerida: USDC/ETH 0,05%" e tem um caminho concreto em vez de ter que descobrir o par ideal sozinho. Evidência a coletar: taxa de criação de primeira posição via CTA prescritivo vs CTA manual; comparar por variante (A/B/C/D).[pancake-final § Pilar 7 — Localização BR/LatAm como infraestrutura] + [uniswap-final § Pilar 1 — Localização BR/LatAm como infraestrutura] — usuário BR sem saldo mas com intenção vê PIX como primeiro caminho em vez de Moonpay global. Hipótese: taxa de abandono no funil de funding cai quando on-ramp local é o default visível.[uniswap suas-posicoes § Fricção estrutural: conteúdo editorial voltado a power user — alternativa concreta] — dois cards servem os dois perfis sem excluir nenhum; hierarquia visual coloca iniciante em primeiro.Fluxo de saída de uma posição LP: o usuário (foco em iniciante que se assusta com o IL e intermediário que quer rebalancear) decide quanto da posição retirar (parcial ou total), vê o impacto real em tokens e R$, entende o IL realizado pela primeira vez como dado contextualizado — e confirma a transação. A ação é significativa: remove capital comprometido e finaliza ou reduz uma posição.
Ponto de entrada: CTA "Remover liquidez" de pools-07. Segundo ponto de entrada: aviso out-of-range em pools-07 ("Remover liquidez" inline).
Header de identidade da posição (sticky, herdado de pools-07 e pools-08)
Seletor de percentual de remoção (componente central — o quanto remover)
25% | 50% | 75% | 100% — tap-targets de largura mínima 44px em mobile.Card de preview de saída (o que o usuário vai receber ao percentual selecionado)
0,87 ETH ≈ R$ 16.133 (calculado pelo percentual)R$ 16.194,75 USDCTotal ≈ R$ 32.328Card de resultado da posição (IL contextualizado — componente pedagógico)
≈ R$ 43.390≈ R$ 32.328+R$ 59,80Resultado líquido: ≈ -R$ 180,20 (-0,41%) — abaixo das linhas. Pode ser positivo se taxas superaram o IL.Estimativa de gas
CTA de progressão (sticky rodapé em mobile, inline em desktop)
positionId da URL. Sem contexto, redireciona para pools-01.100% pré-selecionado.100% pré-selecionado (a maioria dos usuários que clica em "Remover liquidez" quer sair completamente; quem quer remoção parcial ajusta).| Estado | Comportamento |
|---|---|
| Loading | Skeleton em seletor de %, card de preview e card de resultado. Label: "Carregando dados da posição #123456…" |
| Posição out-of-range (preço acima da faixa) | Badge ⬜ no header. Card de preview mostra ~100% ETH. Nota: "Posição fora da faixa — saída é ~100% em ETH." |
| Posição out-of-range (preço abaixo da faixa) | Badge ⬜ no header. Card de preview mostra ~100% USDC. Nota: "Posição fora da faixa — saída é ~100% em USDC." |
| Resultado líquido positivo | Caption: "As taxas acumuladas superaram a variação de composição. O resultado líquido desta posição foi positivo." Linha de resultado em verde. |
| Resultado líquido negativo | Caption pedagógica (ver componente 4). Linha de resultado em âmbar — não em vermelho (âmbar = atenção, não alarme). |
| Sem taxas acumuladas | Linha "Taxas acumuladas incluídas" mostra R$ 0,00. Sem comportamento especial. |
| Remoção 100% selecionada | CTA muda para "Encerrar posição". Aviso informativo inline (não bloqueante): "Esta ação encerra sua posição permanentemente. Capital e taxas vão para a sua carteira." |
| Preço moveu > 2% | Banner não bloqueante: "O preço mudou. Preview atualizado." Card de preview recalcula. |
| Aguardando assinatura | Spinner no CTA + "Aguardando sua assinatura na carteira…" |
| Tx enviada — aguardando confirmação | Estado inline: ícone loading + "Transação enviada. Aguardando confirmação…" + hash compacto + link "Ver no Etherscan ↗" + banner: "Você pode fechar esta tela. Os tokens aparecerão na sua carteira quando confirmado." Botão "← Voltar para minha posição" substituído por link "Ver status da transação" para evitar back-nav com transação em voo. |
| Sucesso — remoção parcial | Toast: "R$ 16.194 retirados da posição. Posição continua ativa com R$ X." → retorna para pools-07 com dados atualizados. |
| Sucesso — encerramento total | Banner in-place: "Posição encerrada. R$ 32.328 adicionados à sua carteira." CTA: "Ver catálogo de pools" (primário) + "Voltar para Minhas posições" (link). |
| Falha — slippage excedido | "Variação de preço maior que a tolerância. Tente de novo com tolerância maior em Configurações avançadas." CTA "Tentar de novo". |
| Falha — gas insuficiente | "Gas insuficiente. Aumente a tolerância em Configurações avançadas." CTA "Ajustar gas". |
| Falha — revert genérico | "Transação revertida. Nenhum fundo foi movido." CTA "Tentar de novo" + link "Ver detalhes do erro". |
| Rede errada | Banner: "Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar." CTAs desabilitados com label contextual. |
| Wallet desconectada | Banner bloqueante: "Carteira desconectada. Reconecte para continuar." CTA "Conectar carteira". |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › Minhas posições › ETH/USDC › Remover liquidez |
| Chips de atalho | 25% | 50% | 75% | 100% |
| Título do card de preview | Você vai receber |
| Linha de taxas incluídas | + 0,003 ETH e 4,20 USDC em taxas acumuladas incluídas. |
| Título do card de resultado | Resumo da sua posição |
| Linha valor aportado | Valor aportado: ≈ R$ 43.390 |
| Linha valor a retirar | Valor a retirar: ≈ R$ 32.328 |
| Linha IL | Variação de composição (IL): -R$ 240 (-0,55%) |
| Linha taxas | Taxas acumuladas: +R$ 59,80 |
| Linha resultado | Resultado líquido: ≈ -R$ 180,20 (-0,41%) |
| Caption — resultado negativo | A variação de composição (IL) foi maior que as taxas acumuladas nesta posição. Se você tivesse mantido os tokens sem aportar, estaria com R$ 180 a mais — mas as taxas coletadas reduziram essa diferença. |
| Caption — resultado positivo | As taxas acumuladas superaram a variação de composição. O resultado líquido desta posição foi positivo. |
| Nota de composição | Composição exata calculada no momento da transação. |
| Nota out-of-range (acima) | Posição fora da faixa — saída é ~100% em ETH. |
| Nota out-of-range (abaixo) | Posição fora da faixa — saída é ~100% em USDC. |
| Gas estimado | Gas estimado: ≈ R$ 5,40 |
| Timestamp gas | Estimativa às 14:32 · atualiza a cada 30s. |
| Aviso encerramento | Esta ação encerra sua posição permanentemente. Capital e taxas vão para a sua carteira. |
| CTA remoção parcial | Confirmar remoção |
| CTA encerramento | Encerrar posição |
| Aguardando assinatura | Aguardando sua assinatura na carteira… |
| Tx enviada | Transação enviada. Aguardando confirmação… |
| Banner pode fechar | Você pode fechar esta tela. Os tokens aparecerão na sua carteira quando confirmado. |
| Sucesso parcial | R$ 16.194 retirados da posição. Posição continua ativa com R$ X. |
| Sucesso total | Posição encerrada. R$ 32.328 adicionados à sua carteira. |
| CTA pós-sucesso total (primário) | Ver catálogo de pools |
| Link pós-sucesso total | Voltar para Minhas posições |
| Slippage excedido | Variação de preço maior que a tolerância. Tente de novo com tolerância maior em Configurações avançadas. |
| Gas insuficiente | Gas insuficiente. Aumente a tolerância em Configurações avançadas. |
| Revert genérico | Transação revertida. Nenhum fundo foi movido. |
| Preço moveu | O preço mudou. Preview atualizado. |
| Rede errada | Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar. |
| Link pedagógico IL | O que é IL e como ele afeta minha saída? |
[uniswap posicao-populada-01 § Insight 1 — template de identidade persistente][pancake-final § Pilar 5 — Localização BR/LatAm como infraestrutura]25% / 50% / 75% / 100% — atalhos de quantidade eliminam cálculo cognitivo. Fonte: [uniswap/_consolidado/visualizar-pool.md § Insight — Presets chips em qualquer decisão financeira][pancake-final § Pilar 2 — CTA dinâmico][pancake-final § Insight — Transparência proativa antes do CTA][pancake-final § Pilar 2] + herdado de pools-06.[uniswap-final § Progressive disclosure como padrão arquitetural][uniswap/_consolidado/visualizar-pool.md § Fricção — Métricas vivas sem âncora de snapshot][uniswap/_consolidado/nova-posicao.md § Fricção — Ausência de estado do pool destino na janela de decisão] + [uniswap-final § Fricção 6 — Métricas DeFi sem decomposição, janela ou comparativo][pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência][uniswap/_consolidado/nova-posicao.md § Fricção — Ausência de estado do pool destino][pancake-final § Fricção 2][uniswap-final § Fricção 7 — Affordances nivelados para ações de risco diferente][pancake-final § Pilar 4 — Educação contextual + Transparência financeira]. Hipótese: usuário que vê "as taxas reduziram a diferença" antes de confirmar a saída não interpreta a operação como falha do produto — calibra expectativa de LP.[pancake-final § Pilar 4] + [uniswap/_consolidado/pools.md § Oportunidade — Sistema pedagógico de métricas DeFi]. Hipótese: usuário com resultado negativo que lê "se você tivesse mantido os tokens, estaria com R$ 180 a mais — mas as taxas reduziram essa diferença" entende o trade-off de LP em vez de abrir ticket de suporte.[pancake-final § Pilar 3 — Defesa em camadas]. Hipótese: label preciso reduz erros acidentais de remoção total por parte de usuários que queriam remover parcialmente.[pancake-final § Pilar 6 — Risk signaling sistêmico]. Hipótese: usuário que vê "Fora da faixa" no header antes de confirmar entende por que a composição de saída é assimétrica.Intl.NumberFormat com locale pt-BR. Custo pontual, valor recorrente.Ponto de decisão e execução para o LP V3 cuja posição saiu da faixa ou está se aproximando do limite: apresenta a situação atual com custo explícito de reposicionamento (duas transações sequenciais), guia a escolha entre manter, reposicionar ou encerrar, e — quando o usuário opta por reposicionar — entrega o seletor de nova faixa pré-populado com sugestão centrada no preço atual. Foco em intermediário que criou sua primeira posição V3 e recebeu a notificação de pools-06; iniciante que segue o link "Ajustar faixa" de pools-07 como segundo perfil.
Ponto de entrada principal: CTA "Ajustar faixa" em pools-07 (visível quando badge = "Perto do limite" ou "Fora da faixa"). Ponto de entrada secundário: notificação de alerta de faixa ativada em pools-06.
Header de identidade da posição (sticky, herdado de pools-07/08/09)
Mini-chart de contexto (visualização da situação antes da decisão)
Card de situação atual (contexto antes da decisão)
Seletor de decisão (componente central — três opções como cartões-radio)
| Opção | Label primário | Consequência | Custo estimado |
|---|---|---|---|
| A — Manter como está | Manter posição | Sem rendimento até o preço retornar à faixa. Capital preservado. | R$ 0 em gas |
| B — Definir nova faixa | Reposicionar | Remove a posição atual e cria uma nova na faixa escolhida. 2 transações sequenciais. | ≈ R$ 16,80 em gas |
| C — Encerrar posição | Encerrar posição | Retira capital e taxas para a sua carteira. 1 transação. | ≈ R$ 5,40 em gas |
positionId pré-carregado — reutiliza o fluxo de remoção já especificado.Seletor de nova faixa (apenas quando Opção B selecionada — componente estrutural condicional)
Versão simplificada de pools-04 (Passo 2 — faixa e valores), sem stepper e sem seleção de par/protocolo (fixos da posição existente):
±5% do preço atual | ±10% | ±20% | Personalizado±10% — centrado no preço atual, não na faixa antiga.Manter faixa atual (±10%) com nota "Sua faixa atual ainda pode funcionar se o preço retornar."⇄ que inverte a exibição do par (para quando o preço nominal < 0,01 — auto-flip por magnitude herdado do insight do consolidado Pancake).Card de custo do reposicionamento (apenas quando Opção B selecionada)
CTA principal (sticky rodapé em mobile, inline em desktop)
positionId da URL. Sem contexto, redireciona para pools-01.positionId e contexto (taxas acumuladas, % de remoção = 100%).[preço_atual * (1 - offset), preço_atual * (1 + offset)] para o preset selecionado.positionId (novo NFT de LP). O NFT antigo é queimado na Transação 1.| Estado | Comportamento |
|---|---|
| Loading | Skeleton no mini-chart, card de situação e opções de decisão. Label: "Carregando situação da posição #123456…" |
| Perto do limite | Badge 🟡. Card de situação mostra "🟡 A 3% da borda inferior da faixa." Opção A default. Chart mostra preço próximo da borda. |
| Fora da faixa — acima | Badge ⬜. Card: "Composição atual: ≈ 100% ETH." Opção B default. |
| Fora da faixa — abaixo | Badge ⬜. Card: "Composição atual: ≈ 100% USDC." Opção B default. |
| Nova faixa não inclui preço atual | Aviso inline abaixo do seletor: "Esta faixa não inclui o preço atual. Sua posição começará fora da faixa imediatamente." Não bloqueante. |
| Gas stale | Badge âmbar no card de custo + "Gas pode ter mudado. Estimativa atualizada." |
| Preço moveu > 2% durante revisão | Banner não bloqueante: "O preço mudou enquanto você revisava. Faixa sugerida atualizada." |
| Opção B → confirmação passo 1 | Navega para tela de confirmação de remoção (mesmo padrão de pools-05 com copy de "reposicionamento"). |
| Opção C | Redireciona para pools-09 com positionId pré-carregado. |
| Sem taxas acumuladas | Linha de taxas no card de custo mostra: "Nenhuma taxa acumulada para coletar." |
| Rede errada | Banner bloqueante: "Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar." Todas as opções desabilitadas. |
| Wallet desconectada | Banner bloqueante: "Carteira desconectada. Reconecte para continuar." CTA "Conectar carteira". |
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › Minhas posições › ETH/USDC › Ajustar faixa |
| Card situação — fora da faixa | ⬜ Fora da faixa há 3 dias |
| Card situação — perto do limite | 🟡 A 3% da borda inferior da faixa |
| Capital preservado | Capital preservado: ≈ R$ 43.390 |
| Composição — preço acima | Composição atual: ≈ 100% ETH |
| Composição — preço abaixo | Composição atual: ≈ 100% USDC |
| Taxas acumuladas | + R$ 59,80 em taxas prontas para coletar. |
| Copy pedagógico de urgência | Sem urgência — sua posição está preservada. Você pode agir quando quiser. |
| Opção A — label | Manter posição |
| Opção A — consequência | Sem rendimento até o preço retornar à faixa. Capital preservado. |
| Opção A — custo | R$ 0 em gas |
| Opção B — label | Reposicionar |
| Opção B — consequência | Remove a posição atual e cria uma nova na faixa escolhida. 2 transações sequenciais. |
| Opção B — custo | ≈ R$ 16,80 em gas |
| Opção C — label | Encerrar posição |
| Opção C — consequência | Retira capital e taxas para a sua carteira. 1 transação. |
| Opção C — custo | ≈ R$ 5,40 em gas |
| Presets de faixa | ±5% do preço atual | ±10% | ±20% | Personalizado |
| Faixa sugerida | Nova faixa sugerida: R$ 16.689 – R$ 22.252 |
| Cobertura histórica | Esta faixa cobre 82% da variação de preço dos últimos 7 dias. |
| Valores pré-populados | Com a mesma quantidade: 1,17 ETH + R$ 21.695 USDC |
| Link ajustar valores | Ajustar valores → |
| Card custo — título | Custo desta operação |
| Card custo — transação 1 | Transação 1 — Remover posição atual: ≈ R$ 8,40 em gas |
| Card custo — transação 2 | Transação 2 — Criar nova posição: ≈ R$ 8,40 em gas |
| Card custo — total | Total em gas: ≈ R$ 16,80 |
| Card custo — taxas incluídas | + R$ 59,80 em taxas acumuladas retornam para sua carteira na Transação 1. |
| Card custo — 2 assinaturas | Você vai assinar duas vezes na sua carteira — uma para cada transação. |
| Timestamp gas | Estimativa às 14:32 · atualiza a cada 30s. |
| Link pedagógico 2 transações | Por que são 2 transações? → |
| Bottom sheet — explicação | Reposicionar exige duas etapas separadas no contrato: primeiro remover a posição atual (queima o NFT antigo), depois criar uma nova posição com a nova faixa (gera um novo NFT). Não é possível "ajustar a faixa" de uma posição existente em V3 — o protocolo não tem essa operação. |
| CTA Opção A | ← Voltar para minha posição |
| CTA Opção B | Iniciar reposicionamento |
| CTA Opção C | Encerrar posição |
| Aviso faixa fora do preço atual | Esta faixa não inclui o preço atual. Sua posição começará fora da faixa imediatamente. |
| Gas stale | Gas pode ter mudado. Estimativa atualizada. |
| Preço moveu durante revisão | O preço mudou enquanto você revisava. Faixa sugerida atualizada. |
| Rede errada | Você está na rede [X]. Esta posição existe em [Y]. Mude para continuar. |
[uniswap posicao-populada-01 § Insight 1 — template de identidade persistente] + padrão interno herdado de pools-07, pools-08, pools-09.[pancake-final § Pilar 7 — Mobile-first interaction] + [pancake/_consolidado/visualizar-farm.md § Interação mobile tap-and-stick em gráficos].[pancake-final § Pilar 7 — Localização BR/LatAm como infraestrutura].[proposta/pools/pools-07.md § Estado out-of-range — "Capital preservado — sem urgência para agir"].[pancake-final § Pilar 6 — CTA dinâmico + Default contextual].[uniswap/_consolidado/nova-posicao.md § Insight — Feedback visual explícito de estado].[pancake-final § Pilar 6 — Default contextual em 4 camadas — contexto do usuário como primeira camada].[pancake/_consolidado/visualizar-farm.md § Auto-flip de preço por magnitude].[uniswap-final § Fricção 1 — Léxico de protocolo como UI sem tradução para consequência] (manifesta como "a operação parece trivial sem expor o custo real").[pancake-final § Fricção 12 — Estados intermediários e empty states sem distinguir 4 cenários].[pancake-final § Fricção 2 — i18n parcial e inconsistente].[pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência].[pancake-final § Pilar 4 — Educação contextual + Transparência financeira]. Hipótese: LP que vê "R$ 16,80 em gas (2 transações)" antes de confirmar toma decisão informada sobre se o custo vale dado o capital parado; LP que não sabe que vai pagar 2× e descobre só na carteira pode cancelar a segunda transação com a posição já removida — situação pior que a original.[pancake-final § Pilar 2 — Defesa em camadas universal]. Hipótese: LP que entende o mecanismo antes de assinar não cancela a segunda assinatura em pânico.[pancake-final § Pilar 4] + [uniswap/_consolidado/pools.md § Sistema pedagógico de métricas DeFi]. Hipótese: LP que vê "esta faixa cobre 82% dos últimos 7 dias" tem mais confiança na escolha que LP que escolhe por intuição.[pancake-final § Pilar 6]. Hipótese: LP "perto do limite" que vê Opção A como default considera que talvez não precise agir agora; o preço pode retornar sem custo de gas.positionId (novo NFT de LP). Quem linkava para a posição antiga (pools-06 compartilhamento, notifications) vai perder o link. Sem solução perfeita — avisar o usuário que o positionId vai mudar não é necessário para iniciante, mas pode confundir o avançado que tem scripts monitorando a posição.Intl.NumberFormat com locale pt-BR — custo pontual de implementação.Porta de entrada do segmento "Stake de token único" — o segundo segmento da seção "Ganhar rendimento" (ao lado de "Pares de liquidez"). O usuário (foco em iniciante conservador que viu o risco de IL nos cartões de pools-01 e escolheu o caminho sem variação de composição) navega por um catálogo de pools de stake de token único com curadoria opinionada, APR sempre decomposto e sem fragmentação por par — cada entrada é um único ativo.
Ponto de entrada: sub-tab "Stake de token único" na hero de pools-01 (segmento primário).
Orientação de segmento (bridging copy de pools-01 — não é um novo hero, é continuidade visual)
Filtros (barra horizontal acima da tabela — mesma altura e nível visual entre todos os filtros)
Bloco de curadoria (seção topo antes da tabela — análogo aos cartões "Recomendados" de pools-01)
Três cartões horizontais com pré-seleção curada, hierarquizados por risco:
| Cartão | Label | Resumo | Quando escolher |
|---|---|---|---|
| Rendimento estável | Rendimento estável | Stablecoins (ex: USDC, USDT). Rendimento mais baixo e previsível — zero variação no token depositado. | Se você quer rendimento sem risco de oscilação no ativo. |
| Crescer junto | Crescer junto | Token blue-chip: você deposita ETH e recebe mais ETH como rendimento. Rendimento acumula no mesmo ativo que você já tem. | Se você acredita no ativo e quer mais dele. |
| Rendimento ampliado | Rendimento ampliado | APR mais alto, mas parte do rendimento vem de outro token (ex: deposita USDC, recebe ETH + USDC). | Se você aceita exposição ao token de recompensa para ter APR maior. |
Tabela de pools de stake (componente central)
Colunas (da mais decisora à mais contextual, esquerda para direita):
| Coluna | Conteúdo | Notas |
|---|---|---|
| Token | Ícone + nome do token | + badge de rede quando relevante (ex: USDC on Base vs USDC nativo) |
| Rendimento estimado (7d) ⓘ | APR anualizado com tooltip pedagógico | Tooltip: "Cálculo baseado nos últimos 7 dias. Pode variar com o volume do pool e com o preço do token de recompensa." |
| Composto por | Decomposição sempre visível: Taxas: 3,8% · Incentivos: 0,4% |
Em fonte menor, inline embaixo do APR — nunca atrás de hover. Quando incentivos = 0%: exibe só Taxas: 4,2%. |
| Prazo mínimo | Sem prazo ou 7 dias ou 30 dias |
Badge âmbar quando prazo ≥ 30 dias com tooltip: "Saques antes deste prazo podem ter penalidade." |
| Recompensa em | Ícone + label do token de recompensa | Quando = mesmo token depositado: Mesmo token ✓. Quando diferente: ícone + nome + badge ⚠ se token de recompensa não verificado. |
| TVL | Valor total depositado no pool | Formato PT-BR (R$ 135 M, não $135K) |
| Sinal | Badges de risco | ⚠ amarelo: rendimento > 100% · ⚠ amarelo: lockup ≥ 30 dias · ⚠ vermelho: token de recompensa não verificado |
Sub-tab "Meus stakes" (contextual, com badge de contagem quando ≥ 1)
| Estado | Comportamento |
|---|---|
| Loading inicial | Skeleton nos 3 cartões curados + linhas da tabela (5 linhas placeholder refletindo a estrutura final). Label: "Carregando opções de stake…" |
| Sem wallet conectada | Tabela e catálogo totalmente visíveis. Sub-tab "Meus stakes" com empty state de conexão. Coluna CTA mostra "Conectar carteira para depositar" em hover. |
| Wallet conectada, sem stakes | Sub-tab "Meus stakes" com empty state de jornada estruturada (2 caminhos). |
| Busca sem resultados | "Nenhum pool de stake encontrado para '[termo]'. Tente outro token ou limpe os filtros." + link "Limpar filtros". |
| Filtros sem resultados | "Nenhum pool encontrado com esses filtros. Tente ampliar os critérios." + link "Limpar filtros". |
| Erro de dados (RPC / subgraph) | Banner não bloqueante: "Dados desatualizados há X minutos. Tentando reconectar…" + CTA "Tentar agora". Tabela exibe última versão em cache com timestamp visível. |
| Parcial multi-chain | Banner discreto: "Não foi possível carregar stakes de [rede]. Outras redes continuam visíveis." |
| APR extremo (>100%) | Badge ⚠ amarelo na coluna Sinal com tooltip: "Rendimentos acima de 100% raramente se sustentam. Veja a decomposição e a janela de cálculo antes de depositar." |
| Lockup com penalidade | Badge âmbar na coluna Prazo + tooltip com o texto exato da penalidade: "Saques antes de 30 dias perdem os incentivos acumulados — taxas são preservadas." |
| Token de recompensa não verificado | Badge ⚠ vermelho na coluna Sinal + na coluna Recompensa em. Tooltip: "O token de recompensa não passou nos critérios de verificação. Verifique antes de depositar." |
| Elemento | Texto |
|---|---|
| Badge de segmento | Stake de token único · Sem variação de composição |
| Frase orientadora | Deposite um token e receba rendimento. O token que você coloca é o que você retira — sem variação de composição. |
| Link pedagógico | Como funciona o stake? → |
| Bottom sheet — stake vs LP | No stake de token único, você deposita um ativo e recebe rendimento nele. Diferente dos pares de liquidez, não há variação de composição — o token que você depositou é o que você retira. O risco principal é o rendimento vir de um token de recompensa diferente: se esse token cair de preço, o rendimento efetivo pode ser menor que o APR estimado. |
| Buscar token | Buscar por token (ex: USDC, ETH) |
| Filtro prazo | Todos os prazos | Sem prazo mínimo | Até 7 dias | Mais de 30 dias |
| Filtro recompensa | Todos | Mesmo token | Outro token |
| Toggle verificados | Apenas verificados |
| Tooltip toggle verificados | Verificado = critérios objetivos do token. Não é garantia de rendimento. |
| Cartão Rendimento estável (justificativa) | Stablecoins têm variação de preço próxima de zero. Bom ponto de partida para rendimento previsível. |
| Cartão Crescer junto (justificativa) | Deposite ETH e receba mais ETH. Rendimento acumula no ativo que você já tem. |
| Cartão Rendimento ampliado (justificativa) | APR mais alto, mas parte do rendimento vem de outro token. Avalie o token de recompensa antes de depositar. |
| CTA do cartão | Ver opções → |
| Link metodologia | Como classificamos os stakes? |
| Coluna Rendimento estimado | Rendimento estimado (7d) ⓘ |
| Tooltip coluna Rendimento | Cálculo baseado nos últimos 7 dias. Pode variar com o volume do pool e com o preço do token de recompensa. |
| Decomposição — com incentivos | Taxas: 3,8% · Incentivos: 0,4% |
| Decomposição — sem incentivos | Taxas: 4,2% |
| Coluna Prazo | Sem prazo |
| Coluna Prazo — com lockup | 30 dias |
| Badge lockup longo | Tooltip: Saques antes de 30 dias podem ter penalidade. |
| Coluna Recompensa — mesmo token | Mesmo token ✓ |
| Label sort ativo | Ordenado por rendimento |
| CTA de linha | Ver e depositar → |
| Badge ⚠ APR extremo | Rendimentos acima de 100% raramente se sustentam. Veja a decomposição e a janela de cálculo antes de depositar. |
| Badge ⚠ recompensa não verificada | O token de recompensa não passou nos critérios de verificação. Verifique antes de depositar. |
| Empty "Meus stakes" sem wallet | Conecte sua carteira para ver seus stakes. |
| Empty "Meus stakes" wallet conectada | Você ainda não tem stakes ativos. Por onde quer começar? |
| Caminho 1 do empty | Ver opções de rendimento estável → |
| Caminho 2 do empty | Ver todas as opções → |
| Loading | Carregando opções de stake… |
| Busca sem resultados | Nenhum pool de stake encontrado para '[termo]'. Tente outro token ou limpe os filtros. |
| Filtros sem resultados | Nenhum pool encontrado com esses filtros. Tente ampliar os critérios. |
| Link limpar filtros | Limpar filtros |
| Erro de dados | Dados desatualizados há X minutos. Tentando reconectar… |
| CTA retry | Tentar agora |
| Link trocar segmento | ← Ver pares de liquidez |
[proposta/pools/pools-01.md § Bloco "Recomendados" — pool finder por perfil de risco] — herança do padrão interno; aplicado aqui ao segmento de stake com adaptação (3 perfis diferentes: Estável / Crescer junto / Ampliado em vez de Conservador / Moderado / Agressivo).[pancake-final § Insight — Cobertura proativa de estados não-triviais] + [proposta/pools/pools-01.md § Estado — Vazio — wallet conectada, sem posições].[uniswap/_consolidado/pools.md § Verificação por token em pool — Oportunidade].[pancake-final § Pilar 3 — Risk signaling sistêmico] + [uniswap/_consolidado/pools.md § Outliers sem sinalização].[proposta/pools/pools-01.md § Sort default — "Ordenado por atividade"] — herança do princípio de sort nomeado; aqui adaptado para stake (rendimento em vez de atividade).[pancake-final § Pilar 6 — CTA dinâmico].[uniswap/_consolidado/visualizar-pool.md § Fricção — Métricas vivas sem âncora de snapshot].[pancake/_consolidado/visualizar-farm.md § APR opaco / decomposição escondida] + [pancake/_consolidado/visualizar-farm.md § Oportunidade — APR decomposto visível por default].[pancake-final § Fricção 5 — Risk signaling ausente em pontos de decisão de alto custo financeiro].[pancake-final § Fricção 1 — Léxico de protocolo e infraestrutura como vocabulário primário de UI].[pancake-final § Fricção 2 — i18n parcial e inconsistente].[pancake-final § Fricção 11 — Densidade técnica avançada exposta no fluxo padrão] (inversão: dado crítico que estava escondido agora fica visível).[pancake-final § Pilar 4 — Educação contextual + Transparência financeira] + [pancake/_consolidado/visualizar-farm.md § Oportunidade — APR decomposto visível por default]. Hipótese: usuário que vê "Incentivos: 0,4%" antes de depositar entende que a maior parte do rendimento é taxa orgânica, não incentivo temporário — calibra expectativa antes do commit.[pancake-final § Pilar 3 — Risk signaling sistêmico]. Hipótese: iniciante que vê badge ⚠ vermelho no token de recompensa antes de clicar tem mais chance de investigar o token de recompensa antes de depositar.[pancake-final § Pilar 5 — Curadoria opinionada por default + Modo avançado opt-in]. Hipótese: iniciante que clica em "Ver opções de rendimento estável" chega no catálogo já filtrado por risco correspondente ao seu perfil — menos chance de se perder em opções de APR extremo.[pancake-final § Pilar 1 — Naming system]. Hipótese: iniciante que vê "Rendimento estável — deposite stablecoins" toma a decisão certa mais rápido que iniciante que vê "Syrup Pool — vCAKE staking".Apresenta ao usuário um resumo completo e imutável de todos os parâmetros configurados, o custo total da operação com breakdown, e a confirmação antes da assinatura da carteira — garantindo que o usuário sabe exatamente o que vai acontecer antes de se comprometer. Foco: iniciante (prioridade máxima nesta tela — é o último ponto de proteção antes de uma ação irreversível).
2.1 Header do resumo da posição Bloco no topo com:
2.2 Resumo de aporte Dois itens de linha — um por token:
2.3 Resumo financeiro (componente mais crítico desta tela — implementa transparência financeira total)
Dividido em dois blocos visuais com separador explícito entre eles. A separação é estrutural: a taxa do pool é rendimento futuro esperado (não custo); o gas é o único custo real desta operação; o aporte é capital recuperável. Misturar os três numa "lista de custos" é o framing errado que Pancake e Uniswap fazem — a Kotai separa os três com headers visuais.
Bloco A — O que você vai ganhar:
| Item | Valor | Tooltip |
|---|---|---|
| Taxa do pool | X% por swap dentro da sua faixa | "Porcentagem que você recebe de cada swap realizado dentro da sua posição. Valor futuro — não pago agora, não cobrado pela Kotai." |
Bloco B — O que você paga agora (para criar a posição):
| Item | Valor | Tooltip |
|---|---|---|
| Gas (taxa de rede) | R$ X,XX (≈ X ETH/BNB) | "Custo cobrado pela rede para processar a transação. Pode variar conforme congestionamento. Você paga mesmo se a transação falhar." |
Linha de total em destaque: "Você paga agora: R$ [gas]" — em fonte maior, abaixo do Bloco B. Nota complementar abaixo do total: "O aporte de R$ X.XXX,XX vai para a posição e pode ser retirado depois — não é custo." O framing em três camadas (taxa que você ganha / aporte recuperável / gas pago agora) previne os dois erros mais comuns do iniciante BR: ler a taxa do pool como custo pago à plataforma, e interpretar o aporte como saída irrecuperável de dinheiro.
2.4 Parâmetros de proteção Linha compacta: "Slippage máximo: [valor]% | Transação expira após: 30 minutos"
2.5 Aviso de pool novo (condicional — apenas quando pool é criado pela primeira vez) Banner destacado (fundo azul, não vermelho — informa, não alarma): "Você será o primeiro a fornecer liquidez neste pool. O preço inicial que você definiu ([valor]) ficará registrado na blockchain. Confirme que este preço reflete o valor de mercado atual."
Para este caso, o CTA muda (ver RN-20).
2.6 Warning de modo Programável com hook ativo (condicional — apenas para V4 com hook selecionado) Banner amarelo acima do CTA: "Este modo usa lógica personalizada (hook) de terceiros. A Kotai não audita hooks externos. Verifique a origem do hook antes de confirmar." Segue o padrão Tier 2 (perda de proteção, não perda direta) — modal de confirmação com consequência explicada, sem type-to-confirm completo (que é reservado para Tier 1).
2.7 CTA de confirmação (principal) Botão primário: "Criar minha posição"
Após clique no CTA: transição para estados de interação com a carteira (ver seção 4).
2.8 Stepper — Etapa 2 ativa: "Confirmar". Etapa 1 marcada como concluída. 2.9 Breadcrumb — "Ganhar rendimento / Criar posição / Confirmar" 2.10 Link "Ver no explorador de blocos" — fica disponível apenas após a transação ser submetida com hash conhecido.
RN-20 — CTA para pool novo: barreira extra de consciência. Quando o pool é novo: o CTA muda para "Confirmar e criar pool". Um checkbox inline aparece acima do CTA: "Entendo que estou criando um pool novo e que o preço inicial que defini pode ser corrigido por arbitragem." O checkbox deve ser marcado manualmente pelo usuário para habilitar o CTA. Este não é type-to-confirm (Tier 1) porque a perda esperada é limitada ao slippage de arbitragem, não à perda total do capital. Mas é uma barreira de consciência (Tier 2) explícita.
RN-21 — CTA para hook ativo (modo Programável). Quando hook de terceiro selecionado: o CTA muda para "Confirmar com hook ativo". Banner de aviso Tier 2 aparece. O botão fica habilitado sem type-to-confirm — o usuário escolheu ativamente o modo Programável na Tela 01, o que já foi uma decisão consciente. Redundância excessiva seria A3.
RN-22 — Imutabilidade dos parâmetros nesta tela. Nenhum campo é editável na Tela 03. Todos os valores são somente leitura. O único caminho de edição é clicar em "Voltar e editar" (que retorna à Tela 02 com todos os campos preservados — sem reset). Isso previne o caso de Uniswap onde o valor pode ser reescrito silenciosamente ao editar na tela de review.
RN-23 — Gas estimado: atualização e validade. O gas estimado é buscado na chegada à Tela 03 (não na Tela 02). Validade do estimate: 30 segundos. Após 30s: badge "Gas estimado desatualizado" + botão "Atualizar estimativa" inline. Se o gas aumentou > 20% entre estimate e submissão: aviso no estado de aguardando carteira "O gas subiu. Valor real pode ser maior." O CTA não é bloqueado — o usuário decide na carteira.
RN-24 — Equivalente em BRL: âncora de preço. O equivalente em BRL usa cotação de mercado no momento do carregamento da Tela 03 com timestamp: "Cotação em [HH:MM]". Não atualiza em tempo real para não gerar ansiedade de "o valor está mudando enquanto leio". Botão "Atualizar cotação" disponível se o usuário quiser.
RN-25 — Interação com a carteira: polling e estados. Após clique em "Criar minha posição":
RN-26 — Persistência de status cross-sessão. Se o usuário fechar o app após submeter a transação mas antes da confirmação: ao reabrir, banner no header "Você tem uma transação em andamento: criar posição [Token A/Token B]. [Ver status]." Polling continua em background se o app for PWA com service worker.
Estado normal (revisão ativa): Tela completa com todos os parâmetros, breakdown de custo, CTA ativo. Gas estimado com timestamp.
Pool novo — checkbox obrigatório: Banner azul + checkbox não marcado + CTA disabled até marcar. Ao marcar: CTA "Confirmar e criar pool" habilita (azul primário).
Hook ativo (Programável): Banner amarelo acima do CTA. Botão "Criar minha posição" com sublabel "usando hook [nome]". Nenhum bloqueio adicional.
Gas estimado expirado: Badge inline "Estimativa de gas desatualizada" + botão "Atualizar" ao lado. CTA continua ativo (o usuário pode prosseguir com estimativa antiga — só precisa ser informado).
Aguardando abertura do popup da carteira (estado 1–3s): Overlay sobre o modal com spinner + "Aguardando sua carteira...". Após 3s sem popup detectado: "Não viu o popup? [Reabrir popup] | [Cancelar e voltar]". Timer visual de 30s no spinner — após 30s sem interação: "Parece que a carteira não respondeu. [Tentar de novo] | [Cancelar]."
Aguardando confirmação na blockchain (após assinar na carteira): Tela de status:
Sucesso: Tela de confirmação:
Falha na transação (rejeitada pela rede): Mensagem: "Sua transação não foi processada." + causa específica se disponível:
Rejeição na carteira (usuário recusou o popup): Mensagem: "Você cancelou a assinatura na carteira." + CTA: "Tentar de novo" (primário) / "Voltar e editar" (secundário).
Carteira desconectada durante a revisão: Banner no topo: "Carteira desconectada. [Reconectar]" com nome da wallet e botão. Tela de revisão permanece visível (parâmetros preservados). CTA bloqueado até reconexão.
Título da tela: "Revisar posição"
Subtítulo do header do resumo: "Verifique tudo antes de criar sua posição. Esta ação não pode ser desfeita."
Linha de total do aporte: "Total a depositar: R$ X.XXX,XX" (nota: é o capital que você coloca na posição, não o custo)
Resumo financeiro:
Bloco A — O que você vai ganhar:
Bloco B — O que você paga agora:
Linha de proteção: "Slippage máximo: [X]% · Transação expira após: 30 minutos"
Banner de pool novo: "Você será o primeiro a fornecer liquidez neste pool. O preço inicial que você definiu ([valor]) ficará registrado na blockchain. Confirme que este preço reflete o valor de mercado atual."
Checkbox de pool novo: "Entendo que estou criando um pool novo e que o preço inicial pode ser corrigido por arbitragem imediatamente."
Banner de hook ativo: "Este modo usa lógica personalizada (hook) de terceiros. A Kotai não audita hooks externos. Verifique a origem do hook antes de confirmar."
CTAs:
Estados de carteira:
Sucesso:
Falhas:
[uniswap-nova-posicao § Observações adicionais — Mudança silenciosa de valores em momento crítico][uniswap-nova-posicao § 🟢 Feedback visual explícito de estado] + [pancake-final § Pilar 6 — CTA dinâmico][uniswap-final § 🟢 Múltiplas representações do mesmo dado][uniswap-final § 🟢 Copy preventiva que declara o porquê][uniswap-final § 🟢 Estados como instrução acionável][pancake-final § 🟢 Transparência proativa antes do CTA — MEV protection como chip persistente][pancake-final § Fricção 8 — Abandono em handoff] + [uniswap-final § Fricção 9 — Handoff a provedor externo sem rastro][uniswap-final § Fricção 5 — Cross-promo do ecossistema sobrepõe a tarefa][pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência — "Turn On Expert Mode" verde][pancake-final § 🟢 Transparência proativa antes do CTA — fee total antes do botão] + [uniswap-final § Fricção 6 — Métricas DeFi sem decomposição][pancake-final § Fricção 2] + [uniswap-final § Fricção 8][pancake-final § Pilar 4 — Educação contextual + transparência financeira ativa][pancake-final § Fricção 8 — Abandono em handoff] — a Kotai vai além do diagnóstico: resolve com persistência de estado cross-sessão.[uniswap-final § Pilar 5 — Modal de review prospectivo com cenários] (subset — cenários completos são escopo de iteração futura)Imutabilidade na Tela 03: o usuário não pode editar nada nesta tela — qualquer mudança exige "Voltar e editar". Em Tela 02, se o usuário mudou valores e voltou à Tela 03, todos os parâmetros são recalculados (gas estimado, equivalente BRL, breakdown). Custo: uma navegação extra por edição. Benefício: elimina o risco de edição silenciosa de valores críticos.
Gas estimado com TTL de 30s: em redes congestionadas, o gas pode subir significativamente em 30s. A Kotai não bloqueia o CTA por gas desatualizado — informa e deixa o usuário decidir. Risco: usuário confirma com estimativa de R$ 2,50 e paga R$ 8,00 de gas. Mitigação: o warning de expiração é proeminente; o tooltip do gas já diz "pode variar conforme congestionamento". Alternativa considerada e rejeitada: bloquear CTA até atualizar — criaria tensão de "não consigo confirmar" em redes ocupadas. A3.
Persistência de estado cross-sessão: requer storage local (localStorage/IndexedDB) ou backend de estado de transação. Se o produto não tem backend de usuário, a persistência fica só no dispositivo — banner não aparece em outro dispositivo. Aceitável para MVP; expandível com backend na próxima iteração.
Polling de confirmação: polling a cada 3s pode ser substituído por WebSocket ou event listener em RPC que suporte eth_subscribe. Em produção, WebSocket é preferível (menos carga de rede, menor latência de confirmação). Polling de 3s é fallback garantido para RPCs que não suportam subscribe.
Checkbox para pool novo: adiciona uma fricção Tier 2 que não existe em nenhum concorrente. Risco de A3 (solução pior que o problema) se usada para casos de baixo risco. Mitigação: o checkbox é restrito exclusivamente à criação de pools novos — não ao fluxo padrão de adicionar liquidez a pool existente. Esse escopo cirúrgico preserva a experiência do caso 90% e protege apenas o caso de alto risco.
Copy de transparência financeira: "Esta ação não pode ser desfeita" como subtítulo permanente da tela pode criar ansiedade excessiva para usuários que já estão confortáveis com DEX. Risco de A3 (friction desnecessária para intermediário). Mitigação: testar se o subtítulo causa mais abandonos do que protege — se sim, mover para tooltip ou retirar em futuras iterações.
Permite que o usuário autorize o contrato de LP a movimentar os tokens selecionados antes de criar a posição, com transparência sobre o que cada aprovação significa, o custo de gas e o tipo de aprovação escolhida. Foco: iniciante (máxima proteção e vocabulário acessível), intermediário (eficiência com controle).
Contexto narrativo: esta tela aparece entre a Tela 02 (configuração) e a Tela 03 (revisão), apenas quando um ou ambos os tokens ainda não têm aprovação suficiente para o valor de aporte configurado. Quando ambos os tokens já estão aprovados, a tela é pulada silenciosamente e o stepper em Tela 03 exibe apenas dois passos ("Configurar → Confirmar").
2.1 Header de contexto de aprovação
Título: "Autorizar seus tokens" Subtítulo: "Antes de criar sua posição, o protocolo precisa da sua autorização para movimentar os tokens escolhidos. Isso é um passo de segurança padrão e acontece uma vez por token."
Badge de passo no stepper expandido: "Passo 2 de 3: Autorização" (entre Configurar e Confirmar).
2.2 Lista de aprovações necessárias
Uma linha por token que precisa de aprovação. Tokens aprovados não aparecem na lista (eliminar ruído). Cada linha contém:
2.3 Seletor de tipo de aprovação (expandível por token, dentro da linha)
Dois chips horizontais:
Chip "Ilimitado" — tooltip: "Autorização ilimitada permite que o protocolo movimente qualquer quantidade deste token em suas transações futuras, sem nova confirmação. Conveniente, mas você concede mais acesso do que o necessário agora. Você pode revogar em Gerenciar aprovações."
Se o token suporta EIP-2612 (Permit2): aparece terceira opção em destaque, "Autorizar via assinatura (sem gas)" com badge verde "Recomendado — sem custo de gas". Tooltip: "Assinatura off-chain — não é uma transação de rede, não cobra gas. Funciona como uma autorização temporária e segura."
2.4 Estimativa de gas por aprovação
Linha abaixo do seletor de tipo: "Custo desta autorização: aprox. R$ X,XX" Tooltip: "Gas de rede. Você paga este custo mesmo que não crie a posição depois. Se usar autorização via assinatura (quando disponível), esse custo não existe."
2.5 CTA de avanço
Botão primário: "Continuar para revisão"
2.6 Stepper de progresso — Expandido para 3 etapas: "1 Configurar" (concluído, ✓) → "2 Autorizar" (ativa) → "3 Confirmar". Recolhe para 2 etapas em Tela 03 quando não há aprovações pendentes (pula a etapa de autorização silenciosamente).
2.7 Breadcrumb — "Ganhar rendimento / Criar posição / Autorizar tokens"
RN-27 — Pulo automático quando todos os tokens já estão aprovados. Ao avançar de Tela 02, o sistema verifica o estado de aprovação de ambos os tokens para o valor de aporte configurado. Se ambos têm aprovação suficiente: avança diretamente para Tela 03 sem exibir Tela 04. O stepper em Tela 03 retorna ao formato de 2 etapas ("Configurar → Confirmar"). Nenhuma mensagem de "passo ignorado" é necessária.
RN-28 — Aprovação insuficiente vs. ausente. Se o token tem aprovação mas o valor aprovado é menor que o valor de aporte atual: status exibido como "Aprovação insuficiente" (não "Pendente"). O botão "Autorizar" aprova exatamente o delta faltante (modo "Apenas para esta posição") ou o total (modo "Ilimitado" — com modal Tier 2 descrito em RN-31).
RN-29 — Sequencialidade de aprovações. Token A deve ser aprovado antes do botão de Token B ser habilitado. Isso previne a submissão paralela de duas transações de aprovação que competiriam por nonce na carteira, causando confusão sobre "qual popup estou confirmando". A sequência é fixada na UI independentemente do suporte técnico da rede a aprovações simultâneas — a simplicity protege o iniciante.
RN-30 — Permit2 / aprovação sem gas (EIP-2612). Para tokens que suportam EIP-2612: o chip "Autorizar via assinatura (sem gas)" é exibido com badge verde "Recomendado". O clique dispara apenas uma assinatura de mensagem na carteira (não uma transação on-chain). Após a assinatura: status muda para "Autorizado ✓" sem polling de blockchain. Para tokens sem suporte a EIP-2612: esse chip não aparece; apenas "Exata" e "Ilimitado" disponíveis.
RN-31 — Aprovação ilimitada: barreira de consciência Tier 2.
Ao selecionar o chip "Ilimitado" e clicar em "Autorizar [Token]": modal de consciência (não type-to-confirm — é Tier 2, não Tier 1, porque o usuário pode revogar e a perda não é imediata). Corpo do modal:
"Ao aprovar sem limite, você autoriza que o protocolo da Kotai movimente qualquer quantidade de [Token] da sua carteira em transações futuras, sem nova confirmação. Você pode revogar esta autorização a qualquer momento em Gerenciar aprovações."
CTA primário: "Usar valor exato desta posição" (azul — caminho mais seguro como ação padrão). CTA secundário: "Confirmar aprovação ilimitada" (laranja — cor de alerta; ação de risco não recebe cor primária). [pancake-final § Pilar 2 — CTAs em contexto de risco invertidos] + [uniswap-final § Fricção 7 — Affordances nivelados para ações de risco diferente]
RN-32 — Polling de confirmação de aprovação on-chain. Após assinatura na carteira (para aprovações que geram transação): polling a cada 2s. Status muda para "Autorizando..." com spinner. Após confirmação on-chain: status muda para "Autorizado ✓" e o próximo token (ou o CTA de avanço) é habilitado. Timeout de 60s sem confirmação: "A autorização está demorando mais que o esperado. [Verificar no explorador ▸] | [Tentar de novo]".
RN-33 — Persistência de aprovação parcial entre sessões. Se o usuário aprovar Token A e sair do fluxo antes de aprovar Token B: ao retornar via URL parametrizada, a tela reabre com Token A exibindo status "Autorizado ✓" (lido do contrato via RPC, não do localStorage). Token B permanece pendente. Não exige re-aprovação de Token A.
RN-34 — Propagação de estado para Tela 03. Após todos os tokens aprovados: o CTA "Continuar para revisão" avança para Tela 03, que carrega com o stepper na etapa "Confirmar" e sem o banner de "aprovação pendente" nos estados de erro.
Nenhuma aprovação necessária (ambos aprovados): Tela 04 pulada. O usuário vai diretamente de Tela 02 para Tela 03. Stepper em Tela 03 exibe 2 etapas, não 3.
Um token aprovado, outro pendente: Token A: chip verde "Autorizado ✓". Token B: chip cinza "Pendente", botão "Autorizar [Token B]" ativo. CTA "Continuar para revisão" desabilitado.
Aguardando popup da carteira (0–3s): Spinner no botão do token + "Aguardando sua carteira...". Após 3s sem popup: "Não viu o popup? [Reabrir popup] | [Cancelar]."
Aprovação submetida, aguardando blockchain (> 3s): Status do token: chip "Autorizando..." com spinner. Estimativa: "Geralmente leva menos de 1 minuto."
Usuário cancelou a aprovação na carteira: Chip volta para "Pendente". Mensagem inline: "Você cancelou a autorização. [Tentar de novo]"
Falha de rede na transação de aprovação: Chip: "Erro — tente novamente". Mensagem: causa específica se disponível:
Gas muito alto detectado: Warning não-bloqueante: "O gas da rede está alto agora (aprox. R$ X,XX por autorização). Você pode aguardar ou usar 'Autorizar via assinatura' quando disponível."
Permit2 disponível (aprovação sem gas): Chip "Autorizar via assinatura (sem gas)" em destaque no topo da lista de chips. Badge verde "Recomendado — sem custo de gas". Botão do chip: "Autorizar sem gas".
Rede trocada durante o fluxo: Banner: "Você trocou para [Rede X]. As autorizações são específicas da rede [Rede Y] onde está sua posição. Troque de volta para continuar."
Título e subtítulo:
Status do token:
Chips de tipo de aprovação:
Tooltips de tipo:
Gas estimado: "Custo desta autorização: aprox. R$ X,XX" Tooltip: "Gas de rede. Você paga mesmo que não crie a posição depois. Autorização via assinatura, quando disponível, não tem este custo."
Modal de aprovação ilimitada:
Estados de popup da carteira:
CTAs principais:
[pancake-final § Pilar 6 — CTA dinâmico + Default contextual] + [uniswap-final § 🟢 Estados como instrução acionável][pancake-final § 🟢 Cobertura proativa de estados não-triviais][pancake-final § Fricção 8 — Abandono em handoff] + [uniswap-final § Fricção 9 — Handoff sem rastro][uniswap-final § 🟢 Copy preventiva que declara o porquê][pancake-final § Pilar 6 — Default contextual em camadas][uniswap-final § Fricção 1 — Léxico de protocolo — uint256 max como aprovação infinita][uniswap-nova-posicao § Pontos isolados — aprovação aparece como erro em Tela 3] + [pancake-final § Fricção 12 — Estados intermediários sem padrão unificado][uniswap-final § Fricção 7 — Affordances nivelados para ações de risco diferente] + [pancake-final § Fricção 3 — Listas sem hierarquia de consequência][pancake-final § Fricção 2 — i18n parcial] + [uniswap-final § Fricção 8 — i18n parcial][uniswap-final § Pilar 6 — Smart wallet + abstração de fricção de protocolo] + [pancake-final § Pilar 7 — Mobile-first + eficiência de transação][pancake-final § Fricção 8 — Abandono em handoff] — a Kotai vai além do diagnóstico: mantém contexto ativo.Pulo automático quando todos aprovados: se o RPC falhar ao verificar o estado de aprovação, pode pular a tela erroneamente — resultando em falha de transação em Tela 03. Mitigação: Tela 03 re-verifica o estado de aprovação silenciosamente antes de habilitar o CTA final; se detectar falta de aprovação, redireciona para Tela 04 com estado preservado.
Sequencialidade de aprovações: pode ser percebida como lentidão por avançados que gerenciam nonces manualmente. Mitigação: nenhum opt-out — expor controle de nonce seria A2 (sobre-escopo). O custo de ~15s a mais para avançados é aceito para proteger iniciantes de popups simultâneos.
Stepper expandido para 3 passos: quando não há aprovações necessárias (estimativa: 60–70% dos retornos de usuários já aprovados), o stepper muda de 3 para 2 passos entre Tela 02 e Tela 03. Consistência: o stepper de Tela 01 e Tela 02 NÃO mostra o passo "Autorizar" — ele aparece apenas quando Tela 04 é exibida. Isso é intencional: não exibir passo que pode não existir evita ansiedade antecipada.
Modal de aprovação ilimitada (Tier 2): adiciona fricção que não existe em nenhum concorrente para aprovação ilimitada. Risco de A3 se o usuário legítimo que quer aprovação ilimitada (avançado que opera frequentemente com aquele token) for frustrado. Mitigação: o modal tem CTA de "Continuar com valor exato" como opção clara; avançados que leram o modal uma vez tendem a selecionar o chip certo na próxima vez (memória do seletor de tipo de aprovação pode ser persistida por token).
Estimativa de gas por aprovação: é uma estimativa pre-submission. Se o gas subir significativamente entre a estimativa e a submissão real, o usuário paga mais do que o exibido. Mitigação: badge "estimativa" no valor + tooltip "pode variar com congestionamento da rede". TTL do estimado: 30s (re-busca silenciosamente).
Permite que o usuário selecione e configure um hook (lógica customizada de terceiros) para sua posição V4, com curadoria visível, sinalização de risco proporcional à origem do hook, e barreira de consciência adequada antes de avançar. Foco: avançado (foco direto), intermediário que escolheu Modo Programável por curiosidade (precisa de orientação para não ativar hook por acidente ou por phishing).
Contexto narrativo: esta tela é a extensão explicitamente deferida da Tela 02, que descreve o Modo Programável como "compartilha o layout Concentrada com adição de uma seção de configuração de hook ao final (não detalhada nesta proposta — escopo de uma tela futura)." Aparece após a configuração de faixa e aporte (Tela 02 — Layout Programável) e antes da aprovação de tokens (Tela 04) / revisão (Tela 03).
2.1 Banner de contexto de modo avançado (persistente — não colapsável)
Background amarelo suave, ícone ⚠: "Você está configurando uma posição com lógica customizada (hook). Hooks são contratos de terceiros — a Kotai revisa alguns deles (badge ✓), mas isso não garante ausência de bugs ou perdas. Use apenas hooks de fontes em que você confia." Link: "O que é um hook? ▾" → expande painel educativo (ver microcopy seção 5).
2.2 Seletor de hook
Estado default: sem hook selecionado. Label da seção: "Adicionar lógica automática à sua posição (opcional)". Botão de expansão: "Escolher hook ▾".
Ao expandir, aparece painel de seleção com:
Campo de busca: "Buscar hook por nome, endereço ou protocolo"
Tabs de curadoria: "Verificados pela Kotai" (default, ativa) | "Populares" | "Todos". Transição para tabs não-verificadas exibe chip de aviso: "Saindo do espaço de hooks verificados."
Lista de hooks — cada card contém:
2.3 Card do hook selecionado (aparece após selecionar)
2.4 Banner de aviso de hook não-verificado (condicional — apenas para hooks sem badge "Verificado pela Kotai" ou "Auditado")
Background vermelho muito claro, texto vermelho escuro: "Este hook não foi auditado pela Kotai nem por uma firma de segurança reconhecida. Verifique o código-fonte antes de continuar." Link: "Ver contrato no explorador ↗" (obrigatório — link externo).
CTA de avanço permanece ativo, mas muda de label e cor (ver seção 2.5). Scroll sentinel: CTA só habilita após o usuário rolar até o final do banner.
2.5 CTA de avanço
Três estados conforme o hook selecionado:
2.6 Stepper — Segue o padrão de Tela 02; esta tela é parte do bloco "1 Configurar". 2.7 Breadcrumb — "Ganhar rendimento / Criar posição / Configurar hook"
RN-35 — Sem hook como default seguro. O estado default desta tela é "Nenhum hook selecionado". Posição V4 sem hook é tecnicamente válida (concentrated liquidity com fee tier dinâmica). O usuário que chegou ao Modo Programável por curiosidade pode avançar sem selecionar hook algum — o CTA "Continuar sem hook" está sempre disponível e em destaque.
RN-36 — Tab "Verificados pela Kotai" como default. A lista de hooks abre sempre na tab "Verificados pela Kotai". Para ver hooks da comunidade ou não-verificados, o usuário precisa clicar explicitamente em outra tab. O chip de aviso "Saindo do espaço de hooks verificados" aparece ao mudar de tab — informa, não bloqueia.
RN-37 — Busca por endereço de contrato. O campo de busca aceita endereço 0x... Se o endereço for válido e não estiver no catálogo: "Hook não encontrado no catálogo da Kotai. Você pode usar este endereço diretamente, mas ele não foi verificado." + banner vermelho de aviso imediatamente exibido. Parâmetros raw via ABI ficam disponíveis apenas quando o modo avançado global está ativado nas configurações.
RN-38 — Schema dinâmico de parâmetros. Cada hook expõe um schema de parâmetros via registro on-chain ou off-chain mantido pela Kotai. A UI renderiza os campos dinamicamente. Campos obrigatórios: validados antes de habilitar o CTA de avanço (parâmetros inválidos bloqueiam o CTA com label "Preencher os parâmetros obrigatórios"). Campos opcionais: têm default do hook e podem ser resetados.
RN-39 — Propagação para Tela 03. Hook selecionado + parâmetros configurados propagam para Tela 03, onde:
RN-40 — Remoção de hook: retorno ao modo V4 sem hook. Ao clicar em "Remover hook — usar posição V4 padrão": modal de confirmação simples (Tier 3 — ação reversível): "Tem certeza? Você perderá as configurações deste hook." CTAs: "Remover hook" (cinza) | "Manter hook" (primário). Após confirmação: painel volta ao estado sem hook; CTA de avanço fica "Continuar sem hook" (azul).
RN-41 — Type-to-confirm não se aplica nesta tela. A seleção de hook não é ação Tier 1 — o usuário ainda precisa confirmar a transação em Tela 03, onde o aviso de hook de terceiros é exibido novamente. Dobrar a barreira aqui seria A3 (solução mais restritiva que o risco justifica). A barreira de consciência proporcional ocorre em Tela 03 (banner Tier 2 + CTA com label diferente), não aqui.
RN-42 — Schema indisponível: fallback para modo básico. Se o schema de parâmetros de um hook não puder ser carregado: "Não foi possível carregar as configurações deste hook. [Tentar de novo] | [Escolher outro hook]". CTA de avanço bloqueado até o schema ser carregado ou o usuário selecionar outro hook.
Estado inicial — sem hook selecionado: Banner amarelo visível. Seletor de hook recolhido com botão "Escolher hook ▾". CTA: "Continuar sem hook" (azul primário).
Seletor de hook expandido: Lista de hooks na tab "Verificados pela Kotai" com campo de busca ativo. Skeletons enquanto o catálogo carrega.
Hook verificado selecionado: Card do hook visível com badge verde. Parâmetros configuráveis exibidos. Estimativa de gas. CTA: "Usar [nome do hook]" (azul primário).
Hook não-verificado selecionado: Banner vermelho claro com link obrigatório para explorador. Scroll sentinel ativo (CTA habilitado apenas após scroll até o banner). CTA: "Usar hook não-verificado — estou ciente do risco" (laranja).
Parâmetros obrigatórios inválidos: Campos com borda vermelha + mensagem inline. CTA: "Preencher os parâmetros obrigatórios" (disabled).
Loading do catálogo de hooks: Skeletons nos cards da lista. Timeout de 5s: "Não conseguimos carregar o catálogo. [Inserir endereço diretamente] | [Tentar de novo]"
Busca sem resultado:
Schema de parâmetros indisponível: "Não foi possível carregar as configurações deste hook. [Tentar de novo] | [Escolher outro hook]" CTA bloqueado.
Rede errada para o hook selecionado: "Este hook não está deployado na rede atual ([Rede X]). Troque para [Rede Y] ou escolha outro hook."
Banner de contexto: "Você está configurando uma posição com lógica customizada (hook). Hooks são contratos de terceiros — a Kotai revisa alguns deles (badge ✓), mas isso não garante ausência de bugs ou perdas. Use apenas hooks de fontes em que você confia." Link: "O que é um hook? ▾"
Painel educativo expandido (link "O que é um hook?"): "Um hook é um contrato externo que adiciona comportamento automático à sua posição de liquidez. Exemplos: rebalancear automaticamente quando o preço sai da faixa, coletar e reinvestir taxas sem ação manual, ou proteger a posição de tipos específicos de swap. Hooks são criados por terceiros — a Kotai verifica alguns deles, mas você é responsável por validar a origem de qualquer hook que usar."
Seletor de hook:
Badges de verificação:
Card de hook:
Banner de aviso (hook não-verificado): "Este hook não foi auditado pela Kotai nem por uma firma de segurança reconhecida. Verifique o código-fonte antes de continuar." Link: "Ver contrato no explorador ↗"
Remoção de hook:
CTAs:
[uniswap-pools § 🟢 Transparência radical na cauda longa — badge verificado][uniswap-final § Pilar 3 — Fenestração da curadoria silenciosa com critério clicável][pancake-final § Fricção 3 — "Turn On Expert Mode" verde — CTAs de risco em cor primária][pancake-final § Pilar 5 — Curadoria opinionada por default + Modo avançado opt-in][uniswap-nova-posicao § Tela 01 — card de aviso de pool novo] + [pancake-final § Pilar 2 — Defesa em camadas proporcional ao risco][uniswap-nova-posicao § 🟢 Stepper pedagógico e contextual][uniswap-nova-posicao § 🔴 Ponto isolado — "Adicionar um hook (Avançado) ⓘ" — jargão técnico invasivo][uniswap-final § Pilar 3 — Risk signaling sistêmico em listas] + [pancake-final § Pilar 3 — Risk signaling ausente em pontos de decisão][pancake-final § Fricção 7 — Aplicação inconsistente da defesa em camadas][pancake-final § Fricção 2 — i18n parcial][uniswap-final § Pilar 3 — Canonical mapping + risk signaling unificado][pancake-final § Pilar 1 — Naming system pelo benefício do usuário] + [pancake-adicionar-liquidez § 🟡 Oportunidade 2 — Filtros por consequência financeira][uniswap-final § Pilar 5 — Simulação ativa e assistência pré-commit]Catálogo curado de hooks: exige processo de curadoria contínuo (review de contratos, critérios de verificação, manutenção da lista). Risco legal: ao colocar badge "Verificado pela Kotai" em um hook com bug não detectado, a Kotai pode assumir responsabilidade implícita. Mitigação: disclaimer explícito e consistente "Verificado = revisado pela nossa equipe; não é garantia de ausência de bugs ou perdas". Custo de operação: médio-alto.
Schema dinâmico de parâmetros: custo de implementação alto para hooks com schemas complexos. Para MVP, alternativa pragmática: lista hardcoded dos 15–20 hooks mais populares com schemas específicos; "Inserir endereço personalizado" como escape hatch para avançados. A interface dinâmica completa pode ser iteração seguinte.
CTA laranja para hook não-verificado: pode parecer que a Kotai está desencorajando o V4 em geral. Risco de A3 (barreira excessiva para caso legítimo). Mitigação: o banner não é vermelho bloqueante mas laranja informativo; o CTA não é desabilitado mas muda de cor e label; avançados que sabem o que estão fazendo clicam sem fricção real além de 1 scroll.
Propagação de hook com parâmetros para Tela 03: o hook e seus parâmetros precisam ser serializados na URL parametrizada para preservação de estado. Hooks com parâmetros complexos (arrays, structs) podem gerar URLs longas. Mitigação: serializar parâmetros em hash de estado no localStorage com UUID referenciado na URL.
Scroll sentinel para hook não-verificado: mesmo padrão da Tela 01 (pool novo). Risco de inconsistência se a Tela 01 remover o scroll sentinel em iteração futura. Mitigação: o scroll sentinel é um padrão nomeado no design system da Kotai, não uma solução pontual — qualquer alteração deve ser aplicada globalmente.
Guiar o usuário que está criando o primeiro pool de um par pela definição do preço inicial — o único passo do fluxo com risco de perda financeira direta e imediata no momento da criação, derivada de arbitragem automática nos primeiros blocos. Foco: intermediário (principal — criar pool novo é um ato incomum que pressupõe alguma familiaridade), iniciante que chegou aqui por acidente (precisa de proteção máxima e pedagogia clara antes de avançar).
Contexto narrativo: esta tela foi mencionada em todas as três telas anteriores como um sub-fluxo especial, mas nunca recebeu design dedicado. A Tela 01 exibe um card expandido "Você será o primeiro provedor — você define o preço inicial". A Tela 02 inclui um campo inline de preço inicial no card de saúde do pool. A Tela 03 tem um checkbox de consciência e banner de pool novo. A Tela 06 é o design completo desse caso: uma tela dedicada com referência de oracle, gauge de desvio e estimativa de perda — porque a semântica e o risco de criar um pool novo são radicalmente diferentes de aportar em pool existente, e não cabem em estado inline de outra tela sem perder a densidade de proteção necessária.
Posicionamento no fluxo: aparece após a Tela 02 (configuração) e antes da Tela 04 (aprovação de tokens) / Tela 03 (revisão). É pulada completamente quando o pool já existe.
2.1 Banner de contexto de pool novo (sempre expandido, não colapsável nesta tela)
Background azul suave (informa, não alarma — o usuário não cometeu um erro, está tomando uma decisão): "Você será o primeiro a fornecer liquidez para [Token A]/[Token B]. O preço que você definir se torna o preço de câmbio inicial deste pool. Se estiver muito diferente do mercado, bots de arbitragem corrigem automaticamente nos primeiros segundos — e você perde parte do aporte." Link: "Como isso funciona? ▾" → painel educativo expandível (ver seção 5).
2.2 Painel de referência de preço de mercado
2.3 Campo de preço inicial (componente principal da tela)
2.4 Indicador de desvio do preço (aparece após o usuário digitar ou editar o preço)
Gauge horizontal com três zonas coloridas:
Label dinâmico abaixo do gauge:
5%: "⛔ Desvio de X% — estimativa de perda: até Y% do aporte na criação"
O valor Y da estimativa de perda é calculado com base na fórmula de AMM (x*y=k para V2 / CLMM para V3-V4) para o desvio informado. Tooltip do indicador: "Estimativa baseada na mecânica padrão de AMM. Resultado real depende do capital arbitrado nos primeiros blocos e das condições de liquidez."
Botão "Ajustar para o preço de mercado" aparece quando desvio > 5% — link de ação imediata acima do gauge.
2.5 Simulador de composição do aporte (aparece após o campo de preço ser preenchido)
"Com o preço que você definiu, sua posição ficaria assim:"
Nota: "Os valores de aporte estão fixos. O preço que você define aqui determina a taxa de câmbio inicial — não os valores depositados."
2.6 Confirmação de consciência (Tier 2)
Checkbox não marcado por default. Label: "Entendo que o preço que defini ([valor]) será o preço inicial deste pool. Se estiver muito diferente do mercado, parte do meu aporte pode ser tomada por arbitragem nos primeiros blocos." CTA de avanço fica disabled até o checkbox ser marcado.
2.7 CTA de avanço
Quatro estados sequenciais:
2.8 Stepper — Segue o padrão dos demais; esta tela é etapa intermediária antes de "Confirmar". 2.9 Breadcrumb — "Ganhar rendimento / Criar posição / Definir preço inicial"
RN-43 — Pré-preenchimento com oracle como default seguro. Quando oracle disponível: campo de preço pré-preenchido com o preço de mercado atual ao entrar na tela. O indicador de desvio começa em 0% (verde). O usuário pode ajustar, mas o default protege contra perda por arbitragem no caso mais comum (pool novo para par com liquidez em outra plataforma).
RN-44 — Tela 06 aparece SOMENTE para pool novo. Pool novo = par (Token A, Token B, fee tier) sem contrato deployado na rede ativa. Se existir pool — mesmo com TVL zero, mesmo inativo — esta tela é pulada e o fluxo segue para Tela 04 (aprovações) / Tela 03 (revisão). A verificação é feita na Tela 01 (card de saúde do pool); a Tela 06 recebe o estado como parâmetro de URL.
RN-45 — Bloqueio de desvio extremo (> 50%) com modal obrigatório. Ao clicar no CTA com desvio > 50%, antes de avançar: modal de consciência (não type-to-confirm — é Tier 2): "Você está definindo um preço [X]% [acima/abaixo] do preço de mercado atual ([valor oracle]). Pools criados com preço muito desviado são corrigidos por arbitragem no primeiro bloco. Se for intencional, clique em 'Criar mesmo assim'. Se não for, revise o preço." CTA primário do modal: "Revisar o preço" (azul — incentiva revisão). CTA secundário: "Criar mesmo assim — sei o que estou fazendo" (cinza). O CTA secundário avança para o próximo passo. (Copy do modal alinhado ao microcopy da seção 5.)
RN-46 — Oracle indisponível: modo de preço manual sem referência. Quando oracle indisponível: campo de preço fica em branco sem pré-preenchimento. O indicador de desvio fica oculto (sem referência para comparar). Banner amarelo: "Não temos o preço de mercado para este par. Verifique o preço em outras plataformas antes de definir o preço inicial." Links externos para fontes sugeridas. O usuário pode digitar o preço manualmente e avançar — a tela não bloqueia, apenas informa.
RN-47 — Campos de aporte independentes para pool novo. Como definido na Tela 02 (RN-11): os campos de aporte Token A e Token B são independentes em pool novo. O preço inicial define apenas a razão de câmbio inicial, não os valores depositados. Se o usuário modificar o preço inicial após ter preenchido os aportes na Tela 02: aviso inline "O preço inicial foi alterado. Revise os aportes se necessário." — não recalcula automaticamente (preservar o que o usuário digitou é mais seguro que recalcular silenciosamente).
RN-48 — Propagação para Tela 03. Preço inicial definido + checkbox marcado propagam para Tela 03. A Tela 03 exibe:
RN-49 — Race condition: pool criado por terceiro durante o fluxo. Se um bot criar o pool (front-run) entre a Tela 01 e a chegada à Tela 06: ao entrar na tela, o sistema re-verifica o estado do pool. Se o pool agora existe: exibe mensagem "Alguém acabou de criar este pool. Suas configurações foram preservadas — você pode continuar aportando ao pool recém-criado." e redireciona para Tela 02 com configuração de "pool existente" (aportes já digitados mantidos via URL).
RN-50 — Auto-flip de preço por magnitude. Quando ratio Token A/Token B < 0,001 na representação direta (ex: BTCB/USDT): o botão "↕ Mostrar invertido" fica ativo por default e o campo exibe "1 [Token B] = [valor] [Token A]" automaticamente. Badge discreto "(invertido)" abaixo do campo. Mesmo padrão da Tela 02 (RN-17).
Pool novo com oracle disponível (caso padrão): Campo pré-preenchido com valor do oracle. Indicador de desvio: "✓ Alinhado com o mercado (0%)". Checkbox desmarcado. CTA: "Confirmar entendimento para continuar" (disabled até marcar).
Pool novo sem oracle: Campo em branco. Banner amarelo "Preço de mercado indisponível". Indicador de desvio oculto. CTA: "Definir o preço inicial primeiro" (disabled) até o usuário digitar algo.
Desvio pequeno (1–5%): Gauge amarelo. Label: "⚠ Desvio de X%". CTA permanece azul padrão após checkbox marcado.
Desvio alto (> 5% e ≤ 30%): Gauge vermelho. Label: "⛔ Desvio de X% — estimativa de perda: até Y%". Botão "Ajustar para o preço de mercado" visível. CTA azul após checkbox.
Desvio muito alto (> 30%): Gauge vermelho. CTA laranja: "Criar pool com desvio de [X%] — estou ciente". Botão "Ajustar para o preço de mercado" proeminente.
Desvio extremo (> 50%): Modal obrigatório ao clicar no CTA — antes de avançar. CTA primário do modal: "Revisar o preço". CTA secundário: "Criar mesmo assim".
Oracle desatualizado (atualização falha): Badge inline "⚠ Preço pode estar desatualizado" ao lado do painel de referência. Botão "Atualizar ↻" com spinner. Após 3 tentativas: "Não conseguimos verificar o preço de mercado. Use fontes externas antes de continuar." + links para CoinGecko, CoinMarketCap.
Checkbox marcado + preço alinhado: CTA azul ativo: "Criar pool com este preço".
Pool criado por terceiro durante a sessão (race condition): Banner: "Este pool foi criado por outra pessoa enquanto você configurava. Suas configurações foram preservadas. Você pode continuar aportando ao pool agora." Botão: "Continuar para configuração de aporte". Tela redireciona para Tela 02 em modo "pool existente".
Banner de contexto: "Você será o primeiro a fornecer liquidez para [Token A]/[Token B]. O preço que você definir se torna o preço de câmbio inicial deste pool. Se estiver muito diferente do mercado, bots de arbitragem corrigem automaticamente nos primeiros segundos — e você perde parte do aporte." Link: "Como isso funciona? ▾"
Painel educativo expandido: "Imagine que você está abrindo uma loja de câmbio e colocando o primeiro preço na vitrine. Se você cobrar R$ 5,00 por 1 dólar quando o mercado pratica R$ 5,50, os primeiros clientes compram todos os seus dólares a R$ 5,00 imediatamente — e você perde a diferença. Em DeFi isso acontece em segundos, automaticamente, via programas chamados bots de arbitragem. Eles monitoram novos pools e corrigem qualquer preço desviado antes que você possa reagir."
Painel de referência:
Campo de preço:
Indicador de desvio:
5%: "⛔ Desvio de X% — estimativa de perda: até Y% do aporte na criação"
Nota abaixo do simulador: "Os valores de aporte estão fixos (configurados na etapa anterior). O preço que você define aqui determina a taxa de câmbio inicial — não os valores depositados."
Checkbox de consciência: "Entendo que o preço que defini ([valor]) será o preço inicial deste pool. Se estiver muito diferente do mercado, parte do meu aporte pode ser tomada por arbitragem nos primeiros blocos."
CTAs:
Modal de desvio extremo (> 50%):
[uniswap-final § 🟢 Defaults agregados que respeitam o modelo mental do usuário] + [pancake-final § 🟢 Defaults pró-iniciante sem pedir permissão][uniswap-final § 🟢 Copy preventiva que declara o porquê / o que NÃO acontece][uniswap-final § 🟢 Múltiplas representações do mesmo dado + bidirecionalidade][pancake-final § Pilar 7 — Mobile-first + BR/LatAm — auto-flip de preço por magnitude][pancake-final § Pilar 2 — Defesa em camadas universal + hierarquia de consequência][uniswap-nova-posicao § Observações adicionais — Caso "pool ainda não existe" — risco de arbitragem imediata][uniswap-nova-posicao § Observações adicionais — "pool ainda não existe" — semântica e risco radicalmente diferentes do aporte em pool existente][uniswap-nova-posicao § 🔴 Estrutural — Ausência de estado do pool destino na janela de decisão][uniswap-final § Pilar 5 — Pré-visualização rica antes de input][pancake-final § Fricção 2 — i18n parcial] + [uniswap-final § Fricção 8][uniswap-final § Pilar 5 — Simulação ativa e assistência pré-commit — "Mensagem de erro com saída" e cálculo de impacto][pancake-final § Pilar 4 — Educação contextual sistêmica + transparência financeira ativa] + [pancake-final § 🟢 Pedagogia embutida no ponto de decisão][pancake-final § Pilar 2 — Defesa em camadas proporcional ao risco][uniswap-final § 🟢 Estados como instrução acionável]Oracle como fonte de referência de preço: depende de oracle externo confiável (Chainlink, Pyth, ou TWAP de outro pool). Se o oracle estiver desatualizado ou indisponível, o campo fica em branco e o indicador de desvio fica inacessível. Mitigação: timestamp "Atualizado às HH:MM" sempre visível; botão de atualização manual; links para fontes externas quando oracle falha. Custo de engenharia: integração com oracle — médio.
Estimativa de perda por arbitragem: o cálculo depende de modelo matemático simplificado (x*y=k ou CLMM). Para pares com lógica de curva customizada (hooks V4, StableSwap), o modelo pode subestimar ou superestimar a perda. Mitigação: disclaimer sempre visível "estimativa baseada na mecânica padrão de AMM; varia com hooks ou lógica customizada". Risco de ganhar desconfiança se a estimativa for consistentemente imprecisa — aceitável se o disclaimer for honesto.
Quatro estados do CTA por desvio: o CTA muda de label e cor em tempo real conforme o usuário digita o preço. Cada estado precisa de lógica de debounce (evitar re-render a cada caractere). O delay de debounce deve ser < 300ms para parecer responsivo em mobile — custo de UX se muito lento.
Race condition: pool criado durante o fluxo: baixa probabilidade para pares obscuros; mais provável para pares de alta demanda. A detecção exige uma verificação on-chain ao iniciar a transação (já feita em Tela 03). A mensagem de race condition é informativa, não um erro — o usuário pode continuar com as configurações já definidas.
Redundância com campo inline da Tela 02: a Tela 02 já mostra um campo de preço inicial no card de saúde do pool para pools novos. A Tela 06 expande esse campo com oracle, gauge e estimativa. Há sobreposição: o usuário digita o preço duas vezes (uma vez em Tela 02, uma vez em Tela 06). Mitigação: o valor digitado na Tela 02 é propagado como pré-preenchimento para o campo da Tela 06; o usuário pode confirmar ou ajustar. A Tela 02 remove seu campo inline de preço inicial em favor de um banner "Você definirá o preço inicial na próxima etapa ▸" — simplifica a Tela 02 e centraliza a configuração de preço na Tela 06.
"Don't show this again" não é aplicável: a confirmação de consciência desta tela não pode ser ignorada em sessões futuras — criar um pool novo é sempre um ato novo com risco real. Alinhado com o princípio de que "'Don't show this again' é proibido em warnings Tier 1" do Pilar 2 (pancake-final). Neste caso, o risco não é Tier 1 puro (o capital não é perdido totalmente — pode ser parcialmente arbitrado), mas a frequência baixa da ação e o risco real de perda parcial justificam manter a barreira de consciência sempre ativa.
É a porta de entrada do fluxo para o usuário que ainda não conectou — ou não tem — uma carteira. Resolve o problema de "não sei por onde começar a usar DeFi" para o iniciante absoluto, e o problema de "quero conectar minha wallet" para o intermediário. Foco duplo: iniciante BR sem wallet prévia (público prioritário) + intermediário que quer acessar suas posições existentes.
2.1 Header global
Negociar · Explorar · Ganhar rendimento ✓ · PortfólioEntrar (texto neutro; abre o painel de entrada — ver §2.2)2.2 Painel central de entrada (componente principal da tela) Estrutura em duas faixas verticais:
Faixa A — Título e contexto
Suas posiçõesFaixa B — Dois caminhos de entrada (estrutural; define o paradigma) Apresentados como dois blocos distintos com divisória visual entre eles — não dois botões planos paralelos.
Bloco 1 — "Primeira vez aqui?" (expandido, maior hierarquia)
Criar conta gratuitaCriar conta com e-mail (botão cheio, cor de ação)Continuar com Google (botão com ícone Google, outline)Bloco 2 — "Já tem carteira?"
Conectar carteira existenteConectar carteira (botão outline, hierarquia visual menor que o Bloco 1)Link de escape para exploradores (abaixo dos dois blocos)
2.3 Cards educacionais (dois, abaixo do painel de entrada) Visíveis enquanto usuário lê e decide — empty state como espaço editorial (não placeholder mudo).
Card A — Iniciante (hierarquia visual maior)
Primeira vez provendo liquidez?Como funciona → (link, abre guia ou modal educacional)Card B — Intermediário (hierarquia visual menor)
Fornecer liquidez em diferentes redesExplorar → (link)2.4 Sidebar de discovery (coluna direita — desktop)
Maiores pools por rendimentoAPR de fees (30d): 4,89% (não APR isolado)Explorar todos os pools →Saiba mais sobre liquidez (links educacionais — Card A e Card B replicados como links)Hierarquia dos caminhos de entrada
Embedded wallet (Bloco 1)
Criar conta com e-mail → flow de onboarding de smart wallet (Privy / Dynamic / similar): e-mail → OTP → passkey → wallet criada; chave privada nunca passa pelo servidor Kotai.Continuar com Google → OAuth → mesmo flow de smart wallet com social recovery.Conectar carteira existente (Bloco 2)
Link de escape
Veja pools sem conectar → navega para o hub de discovery de pools (Explorar → seção Pools) sem exigir identidade. Sidebar de "Maiores pools" na própria tela já serve parte desse papel.Cards educacionais
Sidebar
Vazio — sem dados de pools para a sidebar
Loading — carregando sidebar
Erro — falha no flow de criação de conta (Bloco 1)
Reenviar código.Erro — falha na conexão de carteira (Bloco 2)
Sucesso — conta criada (Bloco 1)
Sucesso — carteira conectada (Bloco 2)
Estado parcial — conexão EVM ok, Solana falhou
Rede errada após conexão
Título da tela
Suas posiçõesSubtítulo
Bloco 1 — Criar conta
Primeira vez aqui?Criar conta com e-mailContinuar com GoogleBloco 2 — Conectar existente
Já tem carteira?Conectar carteiraLink de escape
Card A — Iniciante
Primeira vez provendo liquidez?Como funciona →Card B — Intermediário
Fornecer liquidez em diferentes redesExplorar →APR na sidebar
APR de fees (30d)Erros de criação de conta
Reenviar códigoTentar novamente[uniswap suas-posicoes-05 § Insight 1][uniswap suas-posicoes-05 § Insight 2] [uniswap consolidado suas-posicoes § Separação visual entre gestão pessoal e discovery pública]Veja pools sem conectar → permite que usuário exploratório não se bloqueie. [uniswap suas-posicoes-05 § Insight 3][uniswap consolidado suas-posicoes § Separação visual]Nova posição (outline) + Conectar carteira (branco) com peso visual similar, causando paralisia de escolha para o iniciante. A separação em Bloco 1 (criar conta) + Bloco 2 (conectar existente) com hierarquia visual distinta resolve. [uniswap suas-posicoes-05 § Fricção 1 — 2 CTAs sem hierarquia clara]Fornecer liquidez em protocolos diferentes e Hooks no v4, ambos com framing de power user na exata tela onde público é 100% iniciante. [uniswap suas-posicoes-05 § Fricção 2 — cards com framing de power user] [uniswap consolidado suas-posicoes § Fricção 3 — conteúdo editorial voltado a power user][uniswap suas-posicoes-05 § Fricção 3 — microcopy pressupõe wallet pré-existente][uniswap suas-posicoes-06 § Fricção 2 — APR sem caveat] [pancake-relatorio-final § Fricção 5 — risk signaling ausente]Criar conta com e-mail cria smart wallet self-custody via Privy/Dynamic; on-ramp integrado permite aporte fiat (PIX) direto após criação. Usuário não-cripto vira usuário DeFi sem sair do produto, em menos de 5 min. [uniswap consolidado suas-posicoes § Oportunidade — embedded wallet nativa] [uniswap suas-posicoes-05 § Oportunidade — DEX com onboarding integrado] [pancake-relatorio-final § Insight — Defaults pró-iniciante]Conectar rapidamente independente de hierarquia visual. Risco: intermediário pode sentir que o produto "não é para ele". Mitigação: Bloco 2 sempre visível e acessível; não há conteúdo blocante. Evidência a coletar: proporção de cliques em Bloco 1 vs. Bloco 2.Embedded wallet (Bloco 1) adiciona um provedor de infraestrutura externo (Privy, Dynamic ou equivalente) com custo ~$0,05/MAU e SLA próprio. Falha no provider bloqueia criação de conta por e-mail — fallback obrigatório: se Bloco 1 falhar, Bloco 2 (conectar wallet existente) ainda funciona. Kotai assume responsabilidade de UX de recuperação de conta (passkeys, social recovery) — é um compromisso de produto de longo prazo, não apenas de lançamento.
Cards educacionais estáticos (sem personalização) mantêm implementação simples mas servem o mesmo conteúdo para todos os visitantes desta tela. Se a base de usuários crescer, cards poderão ser personalizados por contexto (ex.: locale, referrer, parâmetro de campanha). Escopo inicial: estáticos.
Sidebar com APR badge de caveat exige threshold editorial (quando APR > 50% mostra caveat). Manutenção: se o mercado sistematicamente produzir APRs altos (período de bull market), o caveat aparecer em toda a lista perde força. Aceitar como custo — o iniciante BR/LatAm é o perfil que mais precisa desse sinal.
i18n: Bloco 1 com Criar conta com e-mail e microcopy de custódia têm copy PT-BR específico que precisa de equivalente em ES para LatAm fora do Brasil. Escopo inicial: PT-BR; adicionar ES como segunda iteração.
Conflito de pilar resolvido: Pilar 1 (verbo de intenção) vs. Pilar 3 (defesa em camadas). O Bloco 1 usa linguagem de ação ("Criar conta") em vez de vocabulário técnico ("Smart wallet"), mas introduz um novo fluxo de autenticação não-Web3-convencional. Prioridade: Pilar 1 — usuário entende o que vai fazer ("criar conta") antes de entender o mecanismo técnico por trás. A custódia é explicada no subtexto, não no CTA.
É o hub principal de gestão de posições no estado em que o usuário conectou a carteira mas ainda não tem nenhuma posição de liquidez ativa — a primeira impressão da seção para quem acabou de conectar. Resolve o problema de "o que faço agora?" para o iniciante que chegou aqui sem saber por onde começar, e o problema de "onde estão minhas posições?" para quem tem histórico mas está vendo lista vazia por filtro ou por posições v2 legadas.
2.1 Header global
Negociar · Explorar · Ganhar rendimento ✓ · Portfólio0xd09B…618a) + menu de ações no canto superior direito2.2 Bloco de boas-vindas / rewards (condicional — componente central)
Este bloco substitui o padrão da indústria de exibir 0 UNI Rewards / Recolher recompensas (disabled) que ocupa 30% do espaço útil comunicando "você não interagiu ainda" para o iniciante.
Estado A — count(posições) == 0 (este estado):
Bem-vindo ao hub de posiçõesExplorar pools recomendadas → (link, não botão cheio — não compete com o CTA primário abaixo)Estado B — count(posições) > 0 (referência para implementação):
Recolher recompensas (habilitado ou disabled conforme saldo)2.3 Banner de detecção de posições v2 legadas (condicional) Renderizado apenas se a query on-chain detectar NFT v2 na carteira conectada. Posição no layout: imediatamente acima da toolbar de filtros (máxima visibilidade).
! (atenção)Importar posições agora (botão outline; ação de importação)× (dismissível, com estado persistido por carteira para não reaparecer)2.4 Toolbar de filtros
+ Nova posição (split button com chevron — dropdown de tipo de posição)Posição simples (full range) · Posição com range (concentrada) · Posição com hooks (avançado) — rótulos por outcome, não por versão técnicaRecomendado na opção de range concentradoStatus v · Protocolo v · Rede v (filtros com badge numérico quando diferente do default)2.5 Empty state prescritivo (componente principal — estrutural) Este é o coração da tela e o ponto de maior diferenciação.
Sub-estado A — count(posições, ignorando filtros) == 0 e saldos da wallet conhecidos:
Card central com leitura de saldo:
Sugestão para sua primeira posiçãoAPR de fees (30d): 4,89% + chip Verifique risco de IL (link para educação sobre Impermanent Loss)Rede recomendada: Base — gas ~R$ 0,05Criar com essa configuração (botão cheio) — pré-configura par + fee tier + range conservador (±20%) no fluxo de criação de posiçãoPersonalizar configuração (link) — vai para o fluxo de criação de posição sem pré-configuraçãoSub-estado B — count(posições, ignorando filtros) == 0 e saldos indisponíveis ou zero:
Card central genérico (fallback):
Adicione sua primeira posição de liquidezExplorar poolsCriar posição manualmenteSub-estado C — count(posições, com filtros) == 0 mas count(posições, ignorando filtros) > 0:
Mensagem condicional (substitui os cards acima):
Nenhuma posição corresponde aos filtrosMostrar todas as posições (desfaz filtros e mostra tudo)2.6 Sidebar de discovery (coluna direita — desktop)
Maiores pools por liquidezAPR de fees (30d) · Rede · chip de risco quando APR > 50%APR de fees (30d): X%; pools com APR > 50% acompanham chip discreto Rendimento alto — verifique ILExplorar todos os pools →Saiba mais sobre liquidez — cards educacionais por nível (mesmos cards da Tela 05)Detecção de posições v2
count(NFT v2) > 0: renderiza Banner 2.3. Se count(NFT v2) == 0: Banner 2.3 ausente, link de rodapé Importar v2 ausente.(carteira, dispositivo) em localStorage — não reaparece mesmo após reconexão, a menos que novas posições v2 sejam detectadas após o dismiss.Empty state prescritivo — leitura de saldos
liquidez(par) > $1M + fee tier dominante (>50% do volume).saldo de apenas 1 token ou tokens sem pool na Kotai): cai para Sub-estado B.i ao lado do card: "Sugerimos este pool por ter alta liquidez, fee tier com maior volume e ser adequado para posição conservadora. [Ver como escolhemos →]"Filtros e empty state condicional
count(com filtros) == 0 e count(sem filtros) > 0 → Sub-estado C.count(sem filtros) == 0 → Sub-estado A ou B (conforme saldos).Dropdown de nova posição
Posição simples (full range) → redireciona para criação com full range selecionado (v2/equivalente)Posição com range (concentrada) → range manual (v3/equivalente); badge RecomendadoPosição com hooks (avançado) → modo avançado; badge Avançado + microcopy "Requer familiaridade com hooks."+ Nova posição (sem chevron) → abre Posição com range diretamente. Conflito de pilar documentado: Pilar 2 (default contextual — herança consciente do split button Uniswap onde v3 é o default) vs. target iniciante-first. Resolução: em Sub-estado A, o iniciante usa o CTA prescritivo Criar com essa configuração, não o split button. O split button é acionado por quem já decidiu criar manualmente e tem intenção explícita; nesse contexto, "range concentrado" + badge Recomendado é o produto adequado. O iniciante que nunca clicou no split button não é penalizado. [uniswap consolidado suas-posicoes § Insight — Defaults sensatos que servem todos os perfis]Bloco de boas-vindas (Estado A)
count(posições) == 0 E session.isFirstVisit == true (ou sempre no Estado A, independente de first visit — decisão de produto: mostra sempre em zero posições para servir como guia mesmo em retornos)0 Recompensas ganhas + Recolher (disabled) — esse bloco só aparece quando há histórico de posições (Estado B)Vazio — zero posições, saldos desconhecidos (wallet sem saldo on-chain)
Vazio — zero posições, saldos conhecidos
Vazio — zero posições por filtro (posições existem mas foram filtradas)
Mostrar todas.Loading — carregando posições
Loading — leitura de saldos para prescrição
Erro — falha ao carregar posições
Tentar novamenteErro — falha na query de posições v2
Parcial — conexão EVM ok, outra rede (ex.: Solana) falhou
Rede errada (wallet em rede sem suporte)
Sucesso — importação de posições v2 concluída
Sucesso — posição criada (retorno do fluxo de criação)
Bloco de boas-vindas (Estado A)
Bem-vindo ao hub de posiçõesExplorar pools recomendadas →Empty state Sub-estado A (prescritivo)
Sugestão para sua primeira posiçãoAPR de fees (30d): X%Verifique risco de IL (link)Rede recomendada: [Nome] — gas ~R$ XCriar com essa configuraçãoPersonalizar configuraçãoi na sugestão: "Sugerimos este pool por ter alta liquidez e fee tier dominante. [Ver como escolhemos →]"Empty state Sub-estado B (genérico)
Adicione sua primeira posição de liquidezExplorar poolsCriar posição manualmenteEmpty state Sub-estado C (filtro escondeu posições)
Nenhuma posição corresponde aos filtrosMostrar todas as posiçõesBanner de posições v2
Importar posições agoraDropdown "Nova posição"
Posição simples (full range) — "Deposita em toda a faixa de preço. Simples, sem necessidade de acompanhamento."Posição com range (concentrada) + badge Recomendado — "Concentra liquidez em um range. Maior potencial de fees, exige acompanhamento."Posição com hooks (avançado) + badge Avançado — "Adiciona lógica customizada. Requer familiaridade com hooks."APR na sidebar
APR de fees (30d): X%Rendimento alto — verifique ILEstado parcial (conexão parcial)
Reconectar [Y]Rede errada
Sucesso importação v2
[uniswap suas-posicoes-06 § Insight 1][uniswap suas-posicoes-06 § Insight 2][uniswap suas-posicoes-06 § Insight 3][uniswap suas-posicoes-06 § Insight 4]Todas as redes e Todos os protocolos como default; complexidade técnica como filtro, não portão. [uniswap-relatorio-final § Defaults agregados]+ Nova posição: clique direto → default recomendado; chevron → dropdown com opções — iniciante nunca precisa ver o dropdown para agir; avançado tem acesso sem fragmentar UI. Padrão validado no Uniswap. [uniswap consolidado suas-posicoes § Insight — Defaults sensatos que servem todos os perfis]Nenhuma posição encontrada para ambos os casos; usuário com posições fechadas filtradas pode achar que perdeu posições. Sub-estado C com contagem de posições ocultas + CTA Mostrar todas resolve ambiguidade. [uniswap suas-posicoes-06 § Fricção 1] [uniswap consolidado suas-posicoes § Fricção 2 — empty state ambíguo]87,74% APR sem (30d) e sem caveat de Impermanent Loss; gatilho de FOMO para iniciante. Label APR de fees (30d) + chip Rendimento alto — verifique IL endereçam. [uniswap suas-posicoes-06 § Fricção 2] [uniswap-relatorio-final § Fricção 6 — métricas DeFi sem decomposição]Importar posições v2 a microcopy em rodapé; usuário com NFT v2 via empty state e podia achar que perdeu posição. Detecção on-chain + banner amarelo no topo resolve. [uniswap suas-posicoes-06 § Fricção 3 — importar v2 escondido]0 UNI Rewards / Recolher (disabled) — header de rewards zerado em wallet sem histórico comunica "produto projetado para quem já tem histórico". Substituição por bloco de onboarding quando count(posições) == 0. [uniswap consolidado suas-posicoes § Fricção 4 — header rewards zerado] [uniswap suas-posicoes-06 § Observação — 5ª aparição do header inadequado]Posição simples / com range / com hooks) em vez de versão técnica (v2/v3/v4) no dropdown de nova posição — léxico de protocolo exposto como primeira decisão sem tradução. [uniswap consolidado suas-posicoes § Fricção 1 — versionamento exposto] [pancake-relatorio-final § Fricção 1 — léxico de protocolo] [uniswap-relatorio-final § Fricção 1]Crie uma posição para começar). Hipótese de diferenciação Kotai: ler saldos on-chain da wallet ao conectar e exibir "Você tem R$ X em USDC e R$ Y em ETH — pool sugerida: USDC/ETH 0,05%, range conservador" com CTA de criação pré-configurada. Converte empty state de placeholder em assistente de onboarding. [uniswap consolidado suas-posicoes § Oportunidade — empty state prescritivo] [uniswap suas-posicoes-06 § Oportunidade — "primeira posição sugerida"] [pancake-relatorio-final § Insight 1 — defaults pró-iniciante]Recomendado — todos os concorrentes expõem versão técnica no dropdown de criação (v2/v3/v4). Hipótese: rótulo por outcome (Posição com range) é compreensível sem conhecimento prévio de versão de protocolo; badge Recomendado resolve a decisão para 90% dos iniciantes. [uniswap consolidado suas-posicoes § Oportunidade — versionamento → outcome]count(posições) == 0 (não só na primeira visita) — sem origem direta. Justificativa: usuário que conectou uma nova carteira vazia em sessão posterior não deve ver 0 UNI Rewards como se fosse retorno ao produto; o bloco de onboarding comunica o estado correto independente de histórico de sessão. Risco: pode parecer repetitivo para usuário que visita com frequência sem criar posições. Mitigação: o bloco é curto (título + 1 frase + link); não bloqueia acesso à toolbar/filtros. Evidência a coletar: % de usuários que clicam no link do bloco de boas-vindas vs. CTAs do empty state.Empty state prescritivo com leitura de saldo exige: query on-chain de balanceOf por token + algoritmo editorial de seleção de par + atualização de sugestão quando saldo muda. Componente tem 3 sub-estados + fallback. Custo de implementação é médio; custo de manutenção editorial (critérios de sugestão) é contínuo e precisa de dono de produto. Ganho: converte o estado de maior abandono em assistente de primeira posição.
Detecção de posições v2 exige query ao contrato NFT v2 ao conectar — custo de latência ~200–500ms na primeira conexão. Se o produto não suportar protocolo v2, este componente é irrelevante e deve ser removido. Implementar condicionalmente por protocolo suportado.
Empty state condicional (Sub-estado C) exige duas queries: lista com filtros ativos + count sem filtros. Segunda query pode ser cacheada da request original (paginação sem filtros já acontece ao carregar a tela). Overhead mínimo se a arquitetura de dados separar "count total" de "count filtrado" na mesma response.
Bloco de boas-vindas condicional exige lógica de renderização baseada em count(posições). Sincronizado com a query da lista — se a lista retornar count == 0, bloco renderiza; se retornar count > 0, bloco some. Risco: flash de conteúdo (bloco aparece antes da lista carregar e some depois). Mitigação: skeleton da lista carrega junto com bloco para evitar layout shift.
i18n: Sub-estado A tem template de string com interpolação de valores monetários — _"Você tem [valor token A] e [valor token B]."_ — exige pluralização e formatação numérica por locale. Formato numérico: R$ 1.250,00 para PT-BR; USD 1,250.00 para EN. Implementar com biblioteca de i18n que suporte interpolação segura (sem concatenação de string manual).
Conflito de pilar resolvido (Pilar 2 vs. Pilar 4): Pilar 2 (CTA dinâmico + defaults contextual) pede que o empty state seja personalizado com base no contexto do usuário (saldo). Pilar 4 (educação contextual + transparência) pede que a sugestão seja acompanhada de contexto pedagógico (explicar IL, explicar range, explicar fee tier). A tensão é entre tornar o CTA prescritivo (Criar com essa configuração) e ser pedagógico o suficiente para que o usuário compreenda o que está confirmando. Resolução: CTA prescritivo permanece, mas acompanhado de bullets de contexto (APR de fees (30d): X% + Verifique risco de IL + tooltip de critérios de seleção). Pilar 2 ganha o CTA; Pilar 4 ganha o contexto inline. Nenhum modal adicional obrigatório antes do CTA (A3 — solução pior que o problema).
Converte o visitante sem carteira que chega ao hub de liquidez pela primeira vez — eliminando o pré-requisito de wallet pré-existente e servindo conteúdo educacional calibrado para o iniciante absoluto, não para power user. Perfil-foco: iniciante absoluto (sem wallet prévia); secundariamente, explorador anônimo que ainda não decidiu se conecta.
Estrutural — define o paradigma da tela:
Cosmético — polish para segunda fase:
| Estado | Comportamento |
|---|---|
| Padrão (sem wallet) | Bloco bifurcado + cards educacionais + sidebar |
| Loading email | Botão muda para "Criando sua conta..." com spinner; layout preservado; sem redirecionamento prematuro |
| Loading wallet | Painel master/detail abre como overlay; tela fica visível atrás |
| Erro de criação email | Mensagem inline abaixo do CTA primário: "Não foi possível criar sua conta. Tente novamente ou conecte uma carteira existente." |
| Erro de conexão wallet | Tratado dentro do componente de Conectar Carteira (fora do escopo desta tela) |
| Sidebar em erro | Pools em cache com badge "Dados podem estar desatualizados" no rodapé; layout não quebra |
| Mobile | CTA primário e secundário empilhados verticalmente; link explorador abaixo; sidebar colapsa para carrossel horizontal de cards de pool abaixo dos cards educacionais |
| Wallet detectada | Badge "Detectamos [Wallet]" no CTA secundário — não altera hierarquia de CTAs |
| Elemento | Texto PT-BR |
|---|---|
| H1 | "Suas posições de liquidez" |
| Subtítulo | "Visualize e gerencie onde seu dinheiro trabalha por você." |
| CTA primário | "Entrar com email ou Google" |
| Microcopy custódia | "Sem frase secreta. Seus fundos, sob seu controle." |
| CTA secundário | "Conectar carteira existente" |
| Badge carteira detectada | "Detectamos [Wallet] no seu navegador" |
| Link explorador | "Ainda explorando? Continue sem conectar →" |
| Card A título | "Primeira vez? Como funciona ganhar com liquidez" |
| Card A subtítulo | "Leitura de 3 min — sem jargão técnico" |
| Card A tag | "Para começar" |
| Card B título | "Como funcionam pools de liquidez concentrada" |
| Card B tag | "Para quem já usa DeFi" |
| Sidebar título | "Pools em destaque" |
| Sidebar APR | "~X% ao ano, estimativa (30d, sem IL) ⓘ" |
| Tooltip APR | "Estimativa baseada nas tarifas coletadas pelos provedores desta pool nos últimos 30 dias. Não inclui Impermanent Loss — seu retorno real pode ser maior ou menor." |
| Sidebar rodapé | "Selecionadas por volume 7d [ver critérios]" |
| Sidebar CTA | "Explorar todos os pools →" |
| Loading CTA primário | "Criando sua conta..." |
| Erro criação email | "Não foi possível criar sua conta. Tente novamente ou conecte uma carteira existente." |
[uniswap suas-posicoes § Separação visual entre gestão pessoal e discovery pública — telas 5 e 6][uniswap suas-posicoes § Empty state como espaço editorial — telas 1, 5 e 6][pancake-final § Painel master/detail preservando contexto + progressive disclosure][uniswap suas-posicoes-05 — convenção de "Conectar carteira" como CTA de entrada][uniswap-final § Copy preventiva que declara o porquê / o que NÃO acontece][uniswap suas-posicoes § Fricção pontual — tela 5: microcopy pressupõe pré-requisito de wallet][uniswap suas-posicoes § Fricção estrutural: conteúdo editorial voltado a power user — telas 5 e 6][uniswap suas-posicoes § Oportunidade: onboarding sem pré-requisito de wallet — tela 5][uniswap suas-posicoes § Oportunidade: onboarding sem pré-requisito de wallet — tela 5] — passa nas 4 perguntas-teste: (1) ✓ nenhum DEX incorpora criação de wallet; (2) ✓ afeta iniciante absoluto, target principal; (3) ✓ tecnicamente factível via Privy/Dynamic; (4) ✓ ganho imediatamente perceptível. Hipótese concreta: CTA "Entrar com email ou Google" como primário aumenta conversão de visitante sem wallet em usuário ativo. Evidência a coletar: taxa de criação via email vs conexão EOA nas primeiras 4 semanas.[uniswap suas-posicoes § Fricção estrutural: conteúdo editorial voltado a power user — alternativa concreta] — a alternativa concreta do consolidado propõe exatamente "dois cards por nível de familiaridade". A Kotai implementa. Hipótese: Card A ("3 min, sem jargão") converte leitura em primeira ação; Card B serve intermediário sem excluir o iniciante. Evidência a coletar: CTR por card segmentado por perfil de usuário (sem wallet / EOA nova / EOA com histórico).Serve como hub central de gestão das posições de liquidez da wallet — lista todas as posições com status visual imediato, destaca o que precisa de ação, e expõe controles de filtragem em linguagem de outcome (não de versão de protocolo). Perfil-foco: iniciante e intermediário com ao menos uma posição ativa; é a tela de maior frequência de retorno do produto.
Estrutural — define o paradigma da tela:
Cada card contém:
Para posições Concentradas, elemento cosmético adicional:
Cosmético:
Condicionalidade desta tela: renderizada quando count(posições da wallet) > 0. Se após aplicar filtro count cair a zero, exibir empty state condicional (não redirecionar para T03 — a wallet tem posições, estão só filtradas).
Chip de urgência: visível quando count(posições com critério ativo) > 0. Calculado client-side com dados de posição já carregados; não requer nova query on-chain. Ao clicar, aplica filtro implícito de urgência sobre os filtros já ativos (interseção, não substituição).
Badge de filtro ativo: cada botão exibe "(N)" onde N = count de opções selecionadas. Quando N = total das opções (default), sem badge — filtro que não filtra nada não anuncia que está "filtrando".
Empty state condicional (filtro oculta posições): se count(posições, sem filtros) > 0 E count(posições, com filtros) == 0 → exibir "Nenhuma posição corresponde aos filtros. Você tem X posições [Fechadas] ocultas. [Mostrar todas]". O label entre colchetes indica o filtro ativo responsável pelo ocultamento. Se count(posições, sem filtros) == 0 → redirecionar para T03.
CTA "Recolher rendimentos": bloqueado (disabled com microcopy de causa) quando fees acumuladas totais < custo estimado de gas × 1,5. Microcopy inline: "Gas estimado: R$ X,XX — aguarde acumular mais antes de recolher para compensar o custo." Quando desbloqueado → abre modal de confirmação de recolhimento (fora do escopo desta tela).
Split button "Adicionar posição": clique direto pré-seleciona Modo Concentrado porque é o modo com maior eficiência de capital para a maioria dos pares com liquidez ativa. Inicia criar-pool com par em branco. O chevron para Avançado (Programável) exibe badge "Avançado" — não deve ser apresentado como equivalente às outras opções.
APR exibido: APR da pool inteira (não da posição individual, que depende do range específico). Label sempre inclui a nota "(estimativa 30d, sem IL)". Tooltip explica a diferença entre APR da pool e retorno efetivo da posição.
Gap fees/gas inline: calculado client-side. Custo de gas estimado com base na rede da posição + preço de gas atual da rede. Se custo de gas indisponível (RPC com falha), a linha de gap é ocultada (não exibe "R$ 0,00").
Posição Concentrada fora do range: chip de urgência inline torna-se vermelho (não laranja) quando fora do range há >72h — escalada de urgência visual progressiva.
| Estado | Comportamento |
|---|---|
| Populado (N posições, 0 urgentes) | Hub completo: header rendimentos + toolbar + lista + sidebar |
| Com urgências (N posições, M urgentes) | Chip "⚠ Precisa de ação (M)" aparece antes da toolbar; M cards têm chip inline |
| Loading inicial | Skeleton de cards preservando estrutura completa (toolbar, lista, sidebar — todos em skeleton proporcionalmente correto) |
| Loading ao aplicar filtro | Lista em skeleton durante filtro; toolbar preserva estado visual; sidebar não recarrega |
| Filtro ocultando posições | Empty state condicional: "Nenhuma posição corresponde aos filtros. Você tem X posições [Fechadas] ocultas. [Mostrar todas]" |
| Rede errada | Banner sticky no topo (não sobrepõe o header): "Suas posições em [Ethereum] ficam indisponíveis nesta rede. [Trocar para Ethereum]" |
| Carteira desconectada | Redirect imediato para T01 |
| Erro de carregamento de posições | Mensagem inline no lugar da lista: "Não conseguimos carregar suas posições. [Tentar novamente]" — toolbar e sidebar carregam independentemente |
| Após fechar a última posição | Redirect para T03 com toast: "Posição fechada com sucesso." |
| Mobile | Sidebar colapsa para seção inferior após a lista; chip de urgência vira banner full-width; filtros viram bottom sheet acionado por botão "Filtrar" fixo; FAB "+" substituindo split button; barra de posição relativa oculta (sem espaço) |
| Elemento | Texto PT-BR |
|---|---|
| Header rendimentos | "Rendimentos acumulados" |
| Header período | "Desde [data] |
| Tooltip período | "Total de tarifas geradas pelas suas posições ainda não resgatadas. Não inclui posições já fechadas ou tarifas já recolhidas." |
| CTA recolher | "Recolher rendimentos" |
| CTA recolher (bloqueado) | "Recolher rendimentos" (disabled) |
| Tooltip recolher bloqueado | "Gas estimado: R$ X,XX. Aguarde acumular mais tarifas antes de recolher para compensar o custo." |
| Chip urgência | "⚠ Precisa de ação (N)" |
| Tooltip urgência | "Posições com: tarifas acumuladas maiores que 5× o gas para recolher, fora do range por mais de 24h, ou concentração em um único token acima de 80%. [Ver critérios]" |
| Filtro tipo | "Tipo de provisão ▾" |
| Tipo: simples | "Simples (full range)" |
| Tipo: concentrada | "Concentrada (range manual)" |
| Tipo: programável | "Programável (hooks)" |
| Tooltip badge tipo | "Simples: full range, sem gestão ativa (v2) |
| Filtro status | "Status ▾" |
| Status em range | "● Em range" |
| Status fora do range | "● Fora do range" |
| Status fechada | "● Fechada" |
| Filtro rede | "Rede ▾" |
| APR label | "~X% ao ano ⓘ" |
| Tooltip APR | "Estimativa baseada nas tarifas coletadas pelos provedores desta pool nos últimos 30 dias. Não inclui Impermanent Loss — seu retorno real pode ser maior ou menor." |
| Tarifas | "Tarifas: R$ X,XX" |
| Gap gas | "Recolher agora custa ~R$ Y,YY em gas" |
| Chip urgência — fora range | "⚠ Fora do range há X dias — verifique" |
| Chip urgência — fees/gas | "⚠ Tarifas > gas — considere recolher" |
| Chip urgência — unilateral | "⚠ Concentrado em [Token A] — verifique exposição" |
| CTA card | "Ver detalhes →" |
| CTA adicionar posição | "Adicionar posição" |
| Dropdown: simples | "Posição simples (full range)" |
| Dropdown: concentrada | "Posição concentrada (range manual) — Recomendado" |
| Dropdown: programável | "Posição programável (hooks) — Avançado" |
| Empty state filtrado | "Nenhuma posição corresponde aos filtros. Você tem X posições [Fechadas] ocultas. [Mostrar todas]" |
| Erro de carregamento | "Não conseguimos carregar suas posições. [Tentar novamente]" |
| Banner rede errada | "Suas posições em [Ethereum] ficam indisponíveis nesta rede. [Trocar para Ethereum]" |
| Busca placeholder | "Buscar par..." |
| Toast pós-fechamento | "Posição fechada com sucesso." |
[uniswap suas-posicoes § Defaults sensatos — telas 1, 2, 3, 4][uniswap suas-posicoes § Pontos isolados, tela 2][uniswap suas-posicoes § Pontos isolados, tela 2][uniswap suas-posicoes § Defaults sensatos — split button insight, tela 1][uniswap suas-posicoes § Separação visual entre gestão e discovery — telas 5, 6][uniswap-final § Múltiplas representações do mesmo dado + bidirecionalidade][uniswap suas-posicoes § Fricção cosmética: filtros sem indicador de estado ativo — telas 2 e 4][uniswap suas-posicoes § Fricção estrutural: versionamento de protocolo exposto como primeira decisão — telas 1 e 3] + [pancake-final § Fricção 1 — Léxico de protocolo][uniswap suas-posicoes § Fricção estrutural: empty state ambíguo — telas 2 e 6][uniswap suas-posicoes § Pontos isolados, tela 6 — APR sem caveat] + [uniswap-final § Fricção 6: métricas DeFi sem decomposição][uniswap suas-posicoes § Fricção cosmética: filtros sem indicador de estado ativo — tela 4][uniswap suas-posicoes § Oportunidade: filtro de ação recomendada por urgência — tela 2] — passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes filtram por estado geométrico, não urgência; (2) ✓ afeta iniciante e intermediário; (3) ✓ modelo de urgência = investimento de produto; (4) ✓ usuário abre hub e imediatamente vê "3 posições precisam de ação". Hipótese concreta: converte painel de gestão passivo em assistente ativo — taxa de ação em posições urgentes aumenta vs baseline atual em concorrentes. Evidência a coletar: % de cliques no chip vs ação direta no card de posição urgente.[uniswap suas-posicoes § Oportunidade: versionamento de protocolo → outcome na UI — tela 3 + família sistêmica] — hipótese: iniciante lê "Concentrada" e entende que é diferente de "Simples" sem precisar decorar v2/v3/v4; conhecimento transfere para outros DEXs que usam os mesmos conceitos. Trade-off: vocabulário paralelo ao da indústria; mitigado por badge no tooltip com nome técnico "Concentrada (v3)".Porta de entrada da seção de yield da Kotai. Atende dois usuários simultaneamente — o recorrente que vem ver "como estão minhas posições" e o iniciante que vem perguntar "onde posso ganhar rendimento provendo liquidez?". A tela precisa servir os dois sem subordinar um ao outro, com curadoria opinionada para o iniciante e atalho direto para o recorrente.
Foco principal: iniciante BR/LatAm chegando pela primeira vez ao conceito de LP, com intermediário recorrente como segundo público.
Hero contextual com verbo de intenção
Segmento primário por mecânica de produto (controle único, peso forte)
Sub-tab de visão dentro do segmento ativo
Bloco "Recomendados" — pool finder por perfil de risco
Catálogo (sub-tab "Catálogo")
Filtros (barra acima da tabela, altura equivalente entre todos)
Minhas posições (sub-tab)
| Estado | Comportamento |
|---|---|
| Vazio — sem wallet conectada (sub-tab "Minhas posições") | "Conecte sua carteira para ver suas posições." + CTA "Conectar carteira" inline. Cartões "Recomendados" continuam acessíveis na sub-tab vizinha. |
| Vazio — wallet conectada, sem posições | Jornada estruturada com 3 caminhos hierarquizados: (1) "Ver pools recomendados para iniciantes" → vai para sub-tab Recomendados; (2) "Procurar um par específico" → foca o input de busca; (3) "Criar um novo pool" → secundário. |
| Vazio — rede errada selecionada | "Esta rede não tem pools suportados pela Kotai. Mude para uma rede compatível." + lista de redes sugeridas. |
| Loading — buscando posições | Skeleton com label ("Buscando suas posições em |
| Loading — catálogo carregando | Skeleton com label ("Carregando pools de |
| Erro — falha de RPC / subgraph | Banner não bloqueante no topo da tabela: "Dados desatualizados há X minutos. Tentando reconectar…" + CTA "Tentar agora". Tabela mostra última versão em cache com timestamp visível. |
| Parcial — multi-chain com uma rede falhando | Tabela mostra pools das redes que responderam + banner discreto: "Não foi possível carregar pools de |
| Saldo insuficiente para gas na rede da posição | Não bloqueia visualização; sinaliza no CTA "Gerenciar" da posição específica: "Sem saldo para taxa de rede". |
| Sucesso — usuário criou primeira posição | Após retorno do fluxo de criação, "Minhas posições" vira sub-tab default automaticamente e a nova posição entra destacada por 5s. |
| Elemento | Texto |
|---|---|
| Título hero | Ganhar rendimento |
| Sub-hero | Provea liquidez em pares de tokens e receba parte das taxas de cada troca feita no pool. |
| Link pedagógico | Como funciona o rendimento? |
| Segmento primário | Pares de liquidez | Stake de token único |
| Sub-tabs | Recomendados | Catálogo | Minhas posições (3) |
| Cartão Conservador (justificativa) | Stablecoins têm IL próximo de zero. Bom ponto de partida para entender LP. |
| Cartão Moderado (justificativa) | Pares blue-chip + stable têm rendimento médio com IL administrável. |
| Cartão Agressivo (justificativa) | Pares voláteis podem ter IL maior que o rendimento se o preço se mover muito. |
| CTA do cartão | Ver detalhes |
| Link de metodologia | Como classificamos os pools? |
| Coluna rendimento | Rendimento estimado (7d, sem IL) ⓘ |
| Tooltip de rendimento | Cálculo baseado nas taxas observadas nos últimos 7 dias. Não inclui perda impermanente (IL) — o resultado real depende da variação de preço dos dois tokens. |
| Coluna eficiência | Vol/TVL (7d) ⓘ |
| Tooltip Vol/TVL | Volume real dividido pelo capital travado. Mostra o quanto o pool efetivamente trabalha. Diferente do rendimento estimado, esta métrica é observada, não projetada. |
| Coluna atividade | Atividade 24h |
| Label de sort ativo | Ordenado por atividade |
| Badge ⚠ Vol/TVL alto | Volume excepcionalmente alto pode indicar negociação artificial ou incentivo temporário. Verifique a trajetória antes de aportar. |
| Badge ⚠ APR extremo | Rendimentos acima de 100% raramente se sustentam. Veja a janela de cálculo antes de aportar. |
| Badge ⚠ Token não verificado | Pelo menos um dos tokens deste pool não passou nos critérios de verificação. Verificado não é recomendação de aporte. |
| Empty "Minhas posições" sem wallet | Conecte sua carteira para ver suas posições. |
| CTA inline | Conectar carteira |
| Empty "Minhas posições" wallet conectada | Você ainda não tem posições. Por onde quer começar? |
| Caminhos do empty | Ver pools recomendados para iniciantes | Procurar um par específico | Criar um novo pool |
| Loading com contexto | Buscando suas posições em |
| Banner de dados desatualizados | Dados desatualizados há |
| CTA de retry | Tentar agora |
pancake-final § Fricção 1 — Léxico de protocolo] e [pancake/pools/pools-01.md § Fricção 1] — segmento de produto sempre acima do segmento de visão, hierarquia visual explícita.pancake/pools/pools-01.md § Insight] — "Escolhas Pancake" funciona como anti-paradoxo da escolha; Kotai herda e amplia (3 perfis em vez de 1 banner rotativo).uniswap-final § Insight — Vol/TVL como verdade observada] e [uniswap/_consolidado/pools.md § Insight] — quando duas métricas competem, priorizar observada sobre projetada.pancake-final § Insight — Cobertura proativa de estados não-triviais] e consolidado carteira-conectada — Kotai replica o padrão em "Minhas posições" vazio.pancake-final § Insight — Transparência proativa antes do CTA] — "Sem saldo para taxa de rede" em vez de botão cinza mudo.pancake-final § Fricção 1]pancake-final § Fricção 2]uniswap/_consolidado/pools.md § Sort default por TVL]uniswap/_consolidado/pools.md § Fragmentação de pares]uniswap/_consolidado/pools.md § Outliers sem sinalização]uniswap/_consolidado/pools.md § Cauda longa sem fenestração]pancake/pools/pools-01.md § Fricção 2]pancake/pools/pools-01.md § Fricção 3]uniswap/_consolidado/pools.md § Ponto isolado tela 3 — fricção 2 e fricção 3]pancake-final § Pilar 1]pancake-final § Pilar 2]pancake-final § Pilar 4] e [uniswap/_consolidado/pools.md § Sistema pedagógico de métricas DeFi]pancake-final § Pilar 6] e [uniswap/_consolidado/pools.md § Verificação por token em pool]pancake-final § Pilar 7] e [pancake/pools/pools-01.md § Oportunidade]uniswap/_consolidado/pools.md § Par canônico cross-chain]uniswap/_consolidado/pools.md § Sort por atividade]Permitir que o usuário iniciante/intermediário avalie a saúde de um pool específico em até 10 segundos e decida com segurança se quer operar (trocar tokens ou adicionar liquidez), sem precisar de contexto externo — foco explícito em iniciante mobile BR/LatAm.
A. Cabeçalho de identidade do pool — sticky durante todo o scroll
Ganhar rendimento › USDC/ETHUSDC / ETHMostrando USDC/ETH ↕ — o ↕ é a setinha de inversão; o prefixo "Mostrando" deixa explícito que há uma orientação controlada pelo usuário, não que ele navegou para outro pool. Breadcrumb sempre mantém ordem canônica (maior liquidez primeiro) independentemente da inversão ativa.v3 · Tarifa 0,05% (nome técnico Uniswap V3 apenas em tooltip ou secondary label)0x8ad5...6b4e [copiar] [ver no explorador]B. KPI chip-strip de saúde — imediatamente abaixo do cabeçalho, antes do chart
Três chips inline num único carrossel horizontal:
APR 15,8%TVL R$135MVol ↑12%Coloração contextual por threshold: verde (ativo), âmbar (baixa atividade), strip inteiro âmbar + badge ⚠ Pool com pouca atividade · Slippage pode ser maior quando Vol 24h < 0,1% do TVL.
Tap em qualquer chip → bottom sheet com dado completo (mini-chart 7d) + caption narrativa contextual gerada por regras.
Este strip é o substituto da sidebar de saúde desktop que sumia do viewport mobile nos concorrentes — resolve a fricção de APR/TVL/Volume fora do fold antes do CTA de liquidez.
C. Chart de atividade — área central
Volume | Liquidez | TVL como chips1D | 1S | 1M | 1AD. Sticky CTA bar inferior — independente do scroll, sempre acessível
Fazer swap / Adicionar liquidez)Dados às 14:28 · atualiza a cada 30s — rodapé discreto; todos os KPIs da tela derivam do mesmo snapshot, eliminando divergência intra-telaVer estatísticas detalhadas ↓ — scroll suave para Tela 02⚠ Pool com pouca atividade dispara quando Vol 24h / TVL < 0,001 (0,1%). O threshold é exposto como critério clicável — não é uma black-box editorial.APR = 0,00% é exibido em âmbar no chip, nunca em vermelho (não é erro — é dado real). Não exibe número em fonte gigante sem caption.Vazio (pool sem dados históricos)
Chart: área cinza com "Sem atividade registrada nos últimos 30 dias". KPI chips: -- no lugar do número. Headline de narrativa: "Este pool não teve atividade recente registrada." CTA bar permanece ativa (swap pode ser tentado mesmo em pool sem histórico — não bloquear).
Loading (entrada inicial) Skeletons: chip-strip (3 pills skeleton), área do chart (retângulo gradiente), sticky CTA bar já renderizada (os botões existem antes dos dados). Breadcrumb de identidade carrega antes dos dados numéricos — usuário sabe em qual pool está mesmo durante o carregamento.
Erro de RPC / subgraph
Chart exibe área cinza + tooltip Dados temporariamente indisponíveis (não some silenciosamente). Chips exibem ? com tooltip Erro ao carregar · toque para tentar novamente. Timestamp muda para Última atualização: 14:28 (há 3 min) em cor âmbar.
Rede errada / Wallet em rede diferente da pool
Banner contextual abaixo do cabeçalho (não bloqueia a tela): Sua carteira está em Ethereum · Esta pool é BNB Chain · Trocar rede para operar. CTA bar fica visível; ao tocar, abre modal de troca de rede — não o swap direto.
Carteira desconectada Tela carrega normalmente. CTAs ativos. Ao tocar em qualquer CTA, abre o drawer de conexão preservando o contexto da pool (par e versão não são perdidos).
Pool deslistada / arquivada
Banner no topo: Esta pool está inativa e não aceita novos aportes · Ver pools similares. CTA Fazer swap continua habilitado (swap em pool V2/V3 legada ainda funciona). CTA Adicionar liquidez fica desabilitado com label Aportes encerrados.
Sucesso (retorno do widget após swap)
Toast no rodapé da tela: Swap enviado · ver transação por 5 segundos. Chip-strip atualiza com os dados mais recentes ao retornar.
| Elemento | Texto |
|---|---|
| Breadcrumb | Ganhar rendimento › USDC/ETH |
| Label de orientação | Mostrando USDC/ETH ↕ |
| Badge de versão | v3 · Tarifa 0,05% |
| Badge pool inativa | ⚠ Pool com pouca atividade · Slippage pode ser maior |
| Headline narrativa (pool ativa) | "Atividade estável: 127 operações ontem, maioria entre 09h–14h." |
| Headline narrativa (pool morta) | "Volume baixo nos últimos 7 dias. Operações neste pool podem ter slippage elevado." |
| Headline narrativa (pico isolado) | "Atividade concentrada em 1 transação às 06h — 67% do volume." |
| Tooltip threshold de atividade | Pool com pouca atividade: volume < 0,1% do TVL nas últimas 24h. Isso pode aumentar o slippage das suas operações. |
| CTA primário | Fazer swap |
| CTA secundário | Adicionar liquidez |
| CTA desabilitado (pool arquivada) | Aportes encerrados |
| Banner rede errada | Sua carteira está em [rede A] · Esta pool é [rede B] |
| CTA banner rede errada | Trocar rede para operar |
| Banner pool arquivada | Esta pool está inativa e não aceita novos aportes |
| CTA banner pool arquivada | Ver pools similares |
| Erro de dados | Dados temporariamente indisponíveis |
| Timestamp | Dados às 14:28 · atualiza a cada 30s |
| Link âncora | Ver estatísticas detalhadas ↓ |
| Toast sucesso (retorno) | Swap enviado · ver transação |
[uniswap visualizar-pool.md § Insight: Contexto herdado na ação]. Usuário em pool detail pensa em saúde de infraestrutura, não em trajetória do ativo. Replicação consciente.Pools › PAR em mobile — [uniswap visualizar-pool.md § Insight: Sticky de identidade + CTAs em mobile]. Identidade da pool nunca desaparece durante o scroll.[uniswap visualizar-pool.md § Insight: Sticky de identidade + CTAs em mobile]. Acesso à ação não depende de scroll-up.[uniswap-final § Ação imediata sem commit nem onboarding]. Usuário não é bloqueado antes de avaliar o produto.[uniswap visualizar-pool.md § Presets chips em qualquer decisão financeira] (chips como padrão de âncora rápida para decisões numéricas); aplicado aqui ao eixo temporal do chart. Replicação consciente.[pancake-final § Pilar 5 — Mobile-first interaction]. Mobile não tem hover; interação de gráfico precisa funcionar por toque.[uniswap visualizar-pool.md § Fricção estrutural: Paridade informacional desktop↔mobile quebrada]. APR/TVL/Volume sumiam do fold mobile antes do CTA de liquidez; o chip-strip garante que nenhuma decisão de execução acontece sem os três sinais de saúde visíveis.[uniswap visualizar-pool.md § Fricção estrutural: Inversão de par sem âncora canônica]. A setinha de inversão existia mas a mudança de ordem visual era interpretada como navegação para outro pool pelo iniciante.[uniswap visualizar-pool.md § Fricção estrutural: APR 0,00% mudo em fonte gigante] (conexão indireta) e [uniswap-final § Fricção 6 — Métricas DeFi sem decomposição]. Dado cru sem narrativa não instrui o iniciante.[uniswap visualizar-pool.md § Fricção estrutural: Truncamentos PT-BR sistêmicos]. + Adicionar liqu… truncado na sticky bar é o caso mais crítico identificado.[uniswap visualizar-pool.md § Fricção estrutural: Métricas vivas sem âncora de snapshot]. Sem timestamp, KPIs divergem entre capturas e usuário atribui inconsistência ao produto.[uniswap visualizar-pool.md § Oportunidade 1: Contexto persistente no ato de operar]. Padrão atual da indústria: todos os concorrentes perdem os KPIs de saúde quando o widget de ação abre. O chip-strip é o ponto de entrada para o drawer narrativo e o precursor do strip que vai aparecer no bottom sheet da Tela 03. Hipótese: nenhum DEX principal oferece "sinal de saúde sempre visível + tap-to-explain" antes de qualquer decisão de execução.[uniswap visualizar-pool.md § Oportunidade 3: Narrativa automática dos dados]. Todos os concorrentes deixam chart sem headline — dado existe, narrativa não. Uma frase muda o tipo de pergunta que o iniciante faz antes de agir.⚠ Pool com pouca atividade com threshold exposto — captura [uniswap visualizar-pool.md § Oportunidade 2: Pré-visualização rica do swap + sinalização de pool inativa]. Todos os concorrentes: widget vazio visualmente idêntico em pool ativa ou morta.Vol 24h / TVL < 0,001): a porcentagem exata de threshold não tem origem direta nos relatórios — é decisão de produto nova. Justificativa: o risco de threshold mal calibrado (falso positivo assusta usuário; falso negativo deixa pool morta sem aviso) só pode ser mitigado com critério público e ajustável. Evidência a coletar: testes A/B com 3–5 valores de threshold em período de 30 dias, medindo abandono na CTA vs reclamação de slippage inesperado.Cognitive load: o chip-strip adiciona ~36 px acima do chart. Risco de parecer excessivo em pool saudável onde os três números são positivos. Mitigação: coloração verde discreta em pool ativa (o strip desaparece visualmente no positivo; aparece em âmbar quando importa).
Implementação da headline narrativa: requer 4–5 templates conservadores bem definidos e regras de classificação por bucket. Uma caption gerada com dado stale ou com bucket errado é pior que silêncio — exige QA específico de narrativa por tipo de pool (pool nova, pool morta, pool com pico isolado, pool estável).
i18n: cada template de headline precisa de tradução e auditoria de breakpoint em PT-BR — não é só string estática. Processo de release precisa incluir checklist "todas as headlines foram testadas em PT-BR em todos os breakpoints".
Snapshot architecture: garantir coerência intra-tela via snapshot único é decisão arquitetural backend — requer um endpoint de "pool snapshot" que retorna todos os KPIs atomicamente, não chamadas individuais por métrica. Custo de implementação médio; ganho: elimina a classe de bugs de "TVL e Volume divergem porque vieram de chamadas com 3s de diferença".
Threshold de atividade: qualquer threshold fixo será criticado por LPs de pools legítimas de nicho. A exposição do critério (clicável) é a mitigação editorial — não elimina o problema mas dá ao usuário a ferramenta para discordar conscientemente.
Permitir que o usuário iniciante/intermediário entenda em profundidade a saúde financeira do pool — APR contextualizado com narrativa, composição visual de saldos, histórico de transações on-chain auditável — tudo sem sair do produto para um explorador externo; foco explícito em iniciante que precisa de mediação para interpretar métricas DeFi.
A. Card de APR narrativo — elemento de maior peso visual; define o paradigma de pedagogia inline da tela
15,84%Taxas orgânicas: 15,84% · Incentivos: — · Faixa 7d: 14–19%Como o APR é calculado ›O card de APR nunca exibe apenas o número em fonte gigante sem a decomposição e caption. O número grita; a narrativa contextualiza.
B. Cards de métricas secundárias (TVL, Volume 24h, Taxas coletadas 24h)
Capital total depositado (secondary: TVL) — R$135M + ↑1,27%Operações em 24h (secondary: Volume 24h) — R$2,4M + ▼81,84%Taxas coletadas em 24h (secondary: Fees 24h) — R$12,60 + ↓93%≈ US$27M▼81,84% em âmbar com tooltip Queda acentuada em relação à média de 7 dias)C. Barra de composição de saldos — mobile-first; substitui o dado de saldo que era descartado em mobile nos concorrentes
52% USDC | 48% ETHR$12,4M USDC (≈ US$2,5M)R$11,5M ETH (≈ US$2,3M)⚠ Pool desbalanceada · pode afetar slippageD. Tabela de transações on-chain — dados auditáveis sem sair do produto
Colunas mobile: Tipo | Valor (R$) | Quando
↑ verde (compra) / ↓ vermelho (venda) — sem texto de símbolo truncado (substitui coluna "Vender WIS…" / "Comprar W…" dos concorrentes que truncava o símbolo)› discreto na borda direita de cada linha → row-expand via bottom sheet 60%via roteador (se contrato em base canônica da Kotai), link Ver no explorador →via roteador limitado a contratos verificados (1inch Universal Router, 0x Protocol, Uniswap Universal Router) — não faz inferência "bot vs humano"; só rotula fato verificável143 transações em 24h · 89 vendas, 54 compras · 63% do volume em 3 operações1–20 de 143 · Carregar mais — ao carregar mais, snapshot da primeira página não muda (coerência com timestamp da sessão)E. Seção de contratos on-chain (Links)
POOL / TOKENUSDC — Circle USD Coin nativo✓ Verificado pela Kotai ou Não verificado — com tooltip de critério expostoDados às 14:28 · atualiza a cada 30s — rodapé discretoDesempenho do pool (não "Statistics" em inglês, não "Estatísticas" como label técnico)-- com badge Dados indisponíveis · atualiza em 30s; caption de narrativa não é exibida em estado de erro (evitar narrativa gerada com dado stale).≈ US$X. Nunca misturar formato (sem $3,38K — Fricção 2 do consolidado Pancake). Abreviação de magnitude: R$135M, R$2,4M, R$12,60 — sem K misturado com vírgula decimal PT-BR.Composição de múltiplos tokens com link para o explorador.via roteador só aparece para endereços em base canônica mantida pela Kotai. A base deve ser versionada e auditável — é dado fático, não inferência.POOL para o contrato do pool; eyebrow TOKEN para cada token do par. Em pool com mais de 2 tokens: todos recebem eyebrow TOKEN.✓ Verificado pela Kotai exposto em tooltip: liquidez mínima [threshold], contrato auditado, sem nome similar a token canônico conhecido. O critério é estático por versão de release — não muda silenciosamente.Loading Skeletons do card APR (número + linhas de decomposição + caption), cards de métricas (3 pills), barra de composição (gradiente cinza), tabela (8 linhas skeleton), seção de contratos (2 entradas skeleton).
Erro de dados para APR
Card APR: -- + badge âmbar Dados indisponíveis · atualiza em 30s. Caption narrativa não exibida. Cards de métricas secundárias tentam carregar independentemente (falha parcial não colapsa a seção inteira).
Pool sem transações (vazio)
Tabela: empty state Nenhuma transação encontrada nas últimas 24h. Subtitle de contexto some. Barra de composição e cards de métricas podem ainda exibir dados históricos (TVL, composição persistem mesmo sem atividade recente).
Dados parciais (ex: TVL disponível, Volume não)
Cards com dado disponível exibem normalmente. Cards sem dado exibem Indisponível sem colapsar o layout da seção — evitar "zero" falso no lugar de "dado ausente".
Desequilíbrio extremo de composição (>80/20)
Barra com coloração âmbar (lado menor em âmbar). Badge: ⚠ Pool desbalanceada · pode afetar slippage. Tap → drawer: "Quando um pool tem muito mais de um token que do outro, a relação de preço se afasta do mercado geral. Operações grandes podem ter slippage elevado."
Contrato não verificado
Eyebrow mantido (TOKEN ou POOL). Badge Não verificado em cor neutro-âmbar. Tooltip: Este contrato ainda não foi verificado pelos critérios da Kotai. Use com cautela. Não bloqueia a visualização — sinaliza, não censura.
Scroll além da sticky CTA bar (mobile) Padding invisível de rodapé igual à altura da sticky bar: última linha da tabela sempre visível acima dos CTAs. Estado cosmético-estrutural sem implementação difícil, mas crítico para não ocultar dados.
| Elemento | Texto |
|---|---|
| Header de seção | Desempenho do pool |
| Card APR: caption pool ativa | "Calculado sobre as taxas coletadas nos últimos 30 dias. Volume estável neste período." |
| Card APR: caption APR 0% | "Volume baixo nas últimas 24h. Taxas insuficientes para gerar rendimento anual perceptível." |
| Card APR: caption com incentivos | "Inclui R$X/dia em incentivos válidos até DD/MM. Sem incentivos, APR seria Z%." |
| Card APR: CTA drawer | Como o APR é calculado › |
| Card APR: dado indisponível | Dados indisponíveis · atualiza em 30s |
| Card TVL: label primário | Capital total depositado |
| Card TVL: label secondary | TVL |
| Card Volume: label primário | Operações em 24h |
| Card Volume: label secondary | Volume 24h |
| Card Taxas: label primário | Taxas coletadas em 24h |
| Card Taxas: label secondary | Fees 24h |
| Barra de composição: header | Composição atual do pool |
| Badge desequilíbrio | ⚠ Pool desbalanceada · pode afetar slippage |
| Drawer desequilíbrio | "Quando um pool tem muito mais de um token que do outro, a relação de preço se afasta do mercado geral. Operações grandes podem ter slippage elevado." |
| Tabela: subtitle | 143 transações em 24h · 89 vendas, 54 compras · 63% do volume em 3 operações |
| Tabela: empty state | Nenhuma transação encontrada nas últimas 24h |
| Tabela: paginação | 1–20 de 143 transações · Carregar mais |
| Row-expand: header | Detalhes da transação |
| Row-expand: campo carteira (roteador) | Via 1inch · 0xe16A...B4cF |
| Row-expand: link externo | Ver no explorador → |
| Seção contratos: header | Contratos on-chain |
| Eyebrow pool | POOL |
| Eyebrow token | TOKEN |
| Badge verificado | ✓ Verificado pela Kotai |
| Badge não verificado | Não verificado |
| Tooltip verificação | Critério: liquidez mínima [threshold], contrato auditado, sem nome similar a token canônico conhecido |
| Tooltip não verificado | Este contrato ainda não foi verificado pelos critérios da Kotai. Use com cautela. |
| Timestamp | Dados às 14:28 · atualiza a cada 30s |
[uniswap visualizar-pool.md § Insight: Dados on-chain inline]. A tabela de transações completa pertence dentro da entidade, não atrás de link externo. Trust signal por exposição direta.[uniswap-final § Progressive disclosure como padrão arquitetural]. Feature complexa não precisa de tab dedicada — precisa de camada de disclosure sob demanda. O Uniswap aplica esse princípio com consistência em múltiplos fluxos (stepper, tabs, fee tier expansível). Nota: a implementação específica de "tap → mini-chart 7d + caption narrativa" NÃO é padrão herdado — é 🟡 Diferenciador capturado em Oportunidade 3 do consolidado (já registrado abaixo).[uniswap-final § Múltiplas representações do mesmo dado + bidirecionalidade]. Número cru sem contexto de valor fiat é fricção de leitura para iniciante BR.[uniswap visualizar-pool.md § Presets chips em qualquer decisão financeira]. Convenção válida de mercado.[uniswap visualizar-pool.md § Fricção estrutural: APR 0,00% mudo em fonte gigante]. APR 0% em fonte gigante sem mediação: iniciante fecha a página com conclusão errada. A caption contextualiza a causa sem precisar de tooltip que o iniciante ignoraria.[uniswap visualizar-pool.md § Fricção estrutural: Paridade informacional desktop↔mobile quebrada]. A barra de saldos proporcionais era descartada em mobile e substituída por dois pares número+token sem relação visual entre eles — iniciante mobile perdia o sinal mais pedagógico do card.[uniswap visualizar-pool.md § Fricção estrutural: APR 0,00% mudo] (conexão com a classe de fricção "dado sem narrativa") e [uniswap-final § Fricção 6 — Métricas DeFi sem decomposição, janela ou comparativo].[uniswap visualizar-pool.md § Fricção cosmético-estrutural: Coluna Tipo truncada na tabela]. "Vender WIS…" e "Comprar W…" são truncamentos garantidos por construção; ícone semântico com cor elimina o problema estruturalmente.[pancake-final § Fricção 1 — Léxico de protocolo como vocabulário primário] e [pancake-final § Fricção 2 — i18n parcial]. "TVL", "Fees 24h" como labels primárias são léxico de protocolo, não linguagem do usuário.[uniswap visualizar-pool.md § Fricção estrutural: Truncamentos PT-BR sistêmicos na section Links]. Labels P…, Wise…, Wrapp… truncados a 3–5 caracteres — eyebrow de 4–5 caracteres em uppercase entrega contexto sem precisar de nome longo.via roteador no row-expand — corrige (classe de) [uniswap visualizar-pool.md § Fricção estrutural: Desacoplamento de contexto]. Sem rotulagem, histórico de transações parece "1 bot fazendo 7 dos 9 swaps" quando na verdade são usuários diferentes via agregador.[uniswap visualizar-pool.md § Fricção cosmética: sticky bar sem padding de scroll]. Última linha da tabela oculta atrás da sticky bar. Correção trivial com impacto direto na usabilidade.[uniswap visualizar-pool.md § Oportunidade 3: Narrativa automática dos dados em 3 níveis]. Todos os concorrentes deixam chart, transações e KPIs sem narrativa. A diferenciação é: uma frase de contexto muda o tipo de pergunta que o iniciante faz antes de agir. Hipótese: usuário iniciante que lê "Volume baixo nas últimas 24h" antes de tocar em Adicionar liquidez tem taxa de abandono de "má decisão" menor que usuário que viu apenas APR 0,00% em fonte grande.via roteador — captura [uniswap visualizar-pool.md § Oportunidade 5: Rotulagem semântica em listas on-chain]. Todos os concorrentes listam contratos sem eyebrow de tipo e histórico de transações sem distinção de roteadores. Hipótese: "Via 1inch" lido em 1 segundo muda o modelo mental sobre atividade do pool.[uniswap visualizar-pool.md § Oportunidade 6: Tabela mobile expansível por linha]. Todos os concorrentes descartam colunas em mobile sem affordance de recuperação. Hipótese: paridade informacional completa com desktop, sem sair do produto — intermediário que audita trades deixa de migrar para Etherscan para tarefas básicas.[pancake-final § Pilar 4 — Educação contextual sistêmica + transparência financeira ativa]. "Padrão de tooltip de 3 camadas: sintoma + causa + custo concreto" aplicado ao card APR. Diferenciação: Kotai como "DEX que ensina enquanto mostra dados".⚠ Pool desbalanceada com threshold 80/20: o threshold específico não tem origem nos relatórios. Justificativa: 80/20 é o limiar convencional onde slippage começa a ser perceptível em AMMs de produto constante (XY=K). Evidência a validar: testar com 70/30 e 85/15 medindo reclamações de slippage inesperado em pools com desequilíbrio próximo ao threshold.Custo de copywriting de captions narrativas: 5 templates × número de idiomas × revisão por release. A caption precisa ser assinada por alguém que entende DeFi e escreve em PT-BR para iniciante — não pode ser tradução automática de EN. Processo: designer de conteúdo valida cada template com 3 usuários representativos antes de entrar em produção.
Risco de caption com dado stale: se o snapshot de APR for antigo (>5 min), a caption pode descrever uma situação que não é mais a realidade. Mitigação: em estado de dado stale, exibir -- no número e omitir a caption — nunca exibir narrativa sobre dado não confiável.
Complexidade da base canônica de roteadores: a base precisa ser mantida por release, versionada e pública (para transparência do critério de via roteador). Se não for mantida, o badge passa a ser misleading ao longo do tempo. Custo de manutenção: 1h/mês de revisão + CI que valida endereços conhecidos.
Row-expand vs coluna extra em desktop: em desktop, onde o viewport permite 6+ colunas, o chevron de row-expand é redundante com dados já visíveis. Proposta: row-expand ativo apenas em mobile; desktop exibe colunas completas sem chevron. Evita adicionar interação desnecessária onde o dado já está acessível de um olhar.
i18n: cada caption narrativa, cada label de card e cada eyebrow semântico são strings em PT-BR que precisam de i18n se o produto expandir para outros idiomas. A estrutura "label primário verbo de benefício + secondary label técnico" duplica o número de strings por elemento, mas permite que usuários avançados filtrem pelo label técnico se quiserem. Custo aceito: é o trade-off de servir target iniciante com naming adequado.
Permitir que o usuário execute um swap diretamente do contexto do pool, com os sinais de saúde da pool preservados e visíveis durante todo o preenchimento — eliminando o risco de operar em pool inativa sem perceber e garantindo que nenhuma decisão de execução acontece sem contexto; foco explícito em iniciante mobile que depende dos sinais do produto para filtrar pools inadequadas.
A. Grab handle + mini-chip de identidade — persistente, nunca removido
USDC/ETH · v3 · Tarifa 0,05%B. Strip de saúde contextual — imediatamente abaixo do mini-chip, antes de qualquer campo de input
APR 15,8% · TVL R$135M · Vol ↑12%⚠ Pool com pouca atividade · Slippage pode ser maiorC. Tabs de ação
Trocar | Ordem Limite (2 tabs)Trocar é curto o suficiente para qualquer breakpoint; Ordem Limite foi auditado em PT-BR em 320 px antes de entrar em produçãoD. Campo "Você vende" — input primário
≈ R$0 abaixo do valor; atualiza ao digitar (debounce 300ms)25% | 50% | 75% | Máx.Conecte sua carteira para usar atalhos de porcentagemDisponível: R$12.450,00 USDCE. Seta de inversão de par — entre os dois campos
F. Campo "Você recebe (estimado)" — output
≈ R$0 abaixo do valor (o delta entre o eyebrow R$ do campo Vender e o eyebrow R$ deste campo é o slippage visível sem cálculo adicional do usuário)(estimado) em texto menor ao lado do label principalG. Painel de detalhes — colapsado por default, expansível com tap
Tolerância ao slippage: Auto · 0,5% + chip Avançado › para override (modo avançado opt-in — não exposto no fluxo padrão)Impacto no preço: <0,01% com cor contextual (verde < 1% / âmbar 1–3% / vermelho > 3%)Custo estimado de gas: ~R$0,60 (estimativa baseada em gas atual × tamanho médio; copy estimado é parte do label, não footnote)Custo total desta operação: R$X — linha-soma fechada incluindo fee de pool + gas estimado + câmbio quando aplicável; nunca esconde uma das parcelasUSDC → ETH via 0x4...)Ver detalhes ↓ / Ocultar ↑H. CTA dinâmico — reflete exatamente o estado atual do preenchimento
| Estado | Label do CTA |
|---|---|
| Sem wallet | Conectar carteira |
| Wallet conectada, campo vazio | Inserir valor |
| Digitando, aguardando cotação | Calculando... (desabilitado temporariamente) |
| Campos válidos, pool saudável | Fazer swap |
| Campos válidos, pool inativa | Fazer swap mesmo assim |
| Impacto de preço > 3% | Fazer swap mesmo assim |
| Impacto de preço > 10% | Fazer swap (risco elevado) |
| Saldo insuficiente | Saldo insuficiente · Comprar USDC |
| Rede errada | Trocar para [rede] para continuar |
| Erro de cotação | Aguardando cotação (desabilitado + retry inline) |
O CTA nunca fica disabled silencioso — sempre comunica o próximo passo ou o obstáculo. "Saldo insuficiente · Comprar USDC" é ao mesmo tempo diagnóstico e saída: tap abre on-ramp contextualizado para o token correto.
I. Aviso contextual de risco inline (não-modal, não-popup)
impacto no preço > 3%⚠ Impacto de preço elevado · Esta operação pode receber menos do que o esperado⚠ Impacto de preço muito alto · Verifique se este pool tem liquidez suficiente antes de confirmar1 USDC = 0,000278 ETH · ≈ R$1,001 ETH = 3.597 USDC em vez de 1 USDC = 0,000278 ETH — legibilidade para iniciante sem precisar de notação científica (Pilar 5)Auto em verde discreto ao lado do valor calculadoAtualizando... e recarrega em background.0,5%) para auditoria — mas a opção de override manual (Avançado ›) está colapsada por default. Usuário avançado toca Avançado › para override; sem override, Auto é sempre o valor ativo.1 token A = X token B com X < 0,001, exibir automaticamente a cotação invertida 1 token B = Y token A. Threshold de flip configurável no design system; default 0,001.Impacto de preço acima de 3% indica que esta operação move o preço do pool. Quanto maior, mais você perde por slippage.~R$X (+ gas estimado) — nunca omitir a parcela nem exibir R$0 como se não houvesse custo.Vazio (sheet aberto, campos vazios, wallet conectada)
Preset chips habilitados. Cotação base exibida. CTA: Inserir valor. Strip de saúde e mini-chip visíveis. Painel de detalhes colapsado com linha-soma: --.
Loading de cotação (após input, aguardando estimativa)
Campo Receber: spinner inline no valor; label (calculando). CTA: Calculando... desabilitado temporariamente. Campo Vender permanece editável — debounce de 300ms antes de nova chamada de cotação.
Erro de cotação
Campo Receber: Cotação indisponível · toque para tentar novamente. CTA: Aguardando cotação (desabilitado) + ícone de retry ao lado do campo Receber. O campo Vender permanece com o valor digitado.
Saldo insuficiente
Campo Vender: borda âmbar + label de saldo: Disponível: R$0,00 USDC. CTA: Saldo insuficiente · Comprar USDC. Tap → on-ramp contextualizado para USDC na rede atual (não abre on-ramp genérico). O token do campo Vender é passado como parâmetro para o on-ramp.
Carteira desconectada
Sheet abre normalmente (try-before-connect). Campos exibem cotação base. Chips em outline. CTA: Conectar carteira. Tap → drawer de conexão; ao conectar, o sheet retorna ao estado exato em que estava (campos preservados).
Pool com pouca atividade
Strip de saúde em âmbar com badge ⚠ Pool com pouca atividade · Slippage pode ser maior. Slippage Auto ajusta para valor mais alto (ex: 2% em vez de 0,5%) + tooltip explica o ajuste: Ajustado para pool com baixo volume — evita falha de transação. CTA mantém cor primária — o aviso é informativo, o usuário decide.
Impacto de preço alto (3–10%)
Aviso âmbar inline: ⚠ Impacto de preço elevado. CTA: Fazer swap mesmo assim (label muda, cor primária mantida). Painel de detalhes exibe Impacto no preço: X% em âmbar com tooltip explicativo.
Impacto de preço muito alto (>10%)
Aviso vermelho inline: ⚠ Impacto de preço muito alto. CTA: Fazer swap (risco elevado) em cor diferente do verde primário (ex: âmbar ou cor de alerta — nunca vermelho de erro; vermelho de alerta). Não bloqueia — informa e contextualiza.
Rede errada
Strip de saúde mantido. Campo Vender exibe badge de rede errada. CTA: Trocar para [rede] para continuar. Tap → modal de troca de rede (mesmo comportamento da Tela 01).
Sucesso (transação enviada)
Sheet fecha suavemente. Toast no rodapé da Tela 01: Swap enviado · ver transação por 5 segundos. Chip-strip da Tela 01 atualiza com novos dados assim que o snapshot expira.
Erro de transação (rejeição na wallet / timeout)
Sheet permanece aberto. Toast inline no rodapé do sheet: Swap não enviado · tentar novamente. CTA volta ao estado Fazer swap. Campos preservados.
| Elemento | Texto |
|---|---|
| Mini-chip de identidade | USDC/ETH · v3 · Tarifa 0,05% |
| Strip saúde (pool ativa) | APR 15,8% · TVL R$135M · Vol ↑12% |
| Strip saúde (pool inativa) | ⚠ Pool com pouca atividade · APR 0% · TVL R$12M · Vol ↓89% |
| Tap no strip | Ver estatísticas completas › |
| Tab Trocar | Trocar |
| Tab Ordem Limite | Ordem Limite |
| Campo Vender label | Você vende |
| Campo Receber label | Você recebe (estimado) |
| Saldo disponível | Disponível: R$12.450,00 USDC |
| Chips de preset | `25% |
| Tap em chip outline | Conecte sua carteira para usar atalhos de porcentagem |
| Cotação inline | 1 USDC = 0,000278 ETH · ≈ R$1,00 |
| Cotação auto-flip | 1 ETH = 3.597 USDC · ≈ R$18.000 |
| CTA: sem wallet | Conectar carteira |
| CTA: campo vazio | Inserir valor |
| CTA: calculando | Calculando... |
| CTA: pronto | Fazer swap |
| CTA: pool inativa | Fazer swap mesmo assim |
| CTA: impacto alto | Fazer swap mesmo assim |
| CTA: impacto muito alto | Fazer swap (risco elevado) |
| CTA: saldo insuficiente | Saldo insuficiente · Comprar USDC |
| CTA: rede errada | Trocar para BNB Chain para continuar |
| CTA: aguardando cotação | Aguardando cotação |
| Slippage label | Tolerância ao slippage |
| Slippage secondary | slippage |
| Slippage Auto tooltip | Calculado pela profundidade do pool e volatilidade nas últimas 24h. Pode variar com o tamanho da sua operação. |
| Slippage ajustado (pool inativa) | Ajustado para pool com baixo volume — evita falha de transação |
| Impacto de preço label | Impacto no preço |
| Impacto de preço tooltip (> 3%) | Impacto de preço acima de 3% indica que esta operação move o preço do pool. Quanto maior, mais você perde por slippage. |
| Gas label | Custo estimado de gas |
| Linha-soma label | Custo total desta operação |
| Linha-soma com gas pendente | ~R$X (+ gas estimado) |
| Painel expandir | Ver detalhes ↓ |
| Painel recolher | Ocultar ↑ |
| Aviso impacto alto (âmbar) | ⚠ Impacto de preço elevado · Esta operação pode receber menos do que o esperado |
| Aviso impacto muito alto (vermelho) | ⚠ Impacto de preço muito alto · Verifique se este pool tem liquidez suficiente antes de confirmar |
| Erro de cotação | Cotação indisponível · toque para tentar novamente |
| Toast sucesso | Swap enviado · ver transação |
| Toast erro | Swap não enviado · tentar novamente |
| Avançado override label | Avançado › |
[uniswap visualizar-pool.md § Insight: Contexto herdado na ação]. O widget de swap abre com USDC→ETH pré-selecionados porque o par já estava em contexto. Elimina cliques e o risco de operar no par errado.[uniswap visualizar-pool.md § Insight: Presets chips em qualquer decisão financeira]. Toda decisão financeira com âncora numérica recebe chips de preset. Em mobile, onde digitar é caro, o ganho é maior.[uniswap visualizar-pool.md § Insight: Sinalização de risco/variação in-place sem friction transacional]. Aviso de pool inativa ou impacto alto fica visível durante todo o preenchimento, não após o CTA.[pancake-final § Pilar 6 — CTA dinâmico + Default contextual em camadas]. CTA nunca disabled silencioso — comunica o próximo passo: "Inserir valor" → "Calcular" → "Fazer swap".[uniswap-final § Ação imediata sem commit nem onboarding]. Usuário vê cotação e campos antes de conectar carteira.[uniswap-final § Múltiplas representações do mesmo dado + bidirecionalidade]. Todo token amount exibe equivalente em moeda local nos momentos críticos.[pancake-final § Insight: Defaults pró-iniciante sem pedir permissão]. Slippage Auto calculado e visível; override manual colapsado para modo avançado.[uniswap visualizar-pool.md § Fricção estrutural: Desacoplamento widget↔contexto da pool no ato de decidir]. Esta é a fricção mais crítica do fluxo inteiro: modal/sheet de execução sobrepõe o chart e os KPIs exatamente no momento de decisão. O mini-chip + strip garantem que nenhum ato de decisão acontece sem contexto — custo: ~60 px no topo do sheet.[uniswap visualizar-pool.md § Fricção estrutural: Affordance sem estado honesto]. Nos concorrentes: chips com aparência habilitada com saldo = 0 — tap em Máx. preenche 0 sem feedback. Na Kotai: chips outline + tap dispara prompt de conexão.[uniswap visualizar-pool.md § Fricção estrutural: Unidade técnica não traduzida para intuitiva]. Nos concorrentes: cotação USD no campo Comprar, ausente no campo Vender — assimetria que esconde o slippage real. O delta entre os dois eyebrows R$ é o slippage visível sem cálculo.[pancake-final § Fricção 10 — CTA disabled silencioso sem comunicar o gap]. "Criar Ordem Limite" / "Fazer swap" disabled em múltiplos estados sem indicar o que falta.[uniswap visualizar-pool.md § Fricção estrutural: Desacoplamento widget↔contexto]. Na transição para Ordem Limite, o header sticky do pool desaparecia — usuário perdia até a âncora de "qual pool estou operando".[uniswap visualizar-pool.md § Oportunidade 1: Contexto persistente no ato de operar]. Todos os concorrentes (Uniswap, PancakeSwap, 1inch, Curve): quando o widget abre, métricas de saúde ficam atrás do overlay. Hipótese de diferenciação: nenhuma decisão de execução acontece sem contexto em qualquer sheet de ação da Kotai — o padrão se torna parte do design system, não solução pontual.[uniswap visualizar-pool.md § Oportunidade 4: Tradução técnica→intuitiva em campos de unidade não-fiat]. Todos os concorrentes mantêm unidade técnica como nominal (0,0000550306 ETH). Hipótese: ≈ R$0,21 muda a decisão de executar de forma visceral — usuário decide no referencial que entende.[pancake-final § Pilar 6 — CTA dinâmico] + [uniswap-final § Pilar 1 — Localização BR/LatAm como infraestrutura]. Todos os concorrentes: saldo insuficiente → disabled ou mensagem isolada sem saída. Hipótese: CTA como diagnóstico + ação embutida reduz abandono no ponto de primeira barreira real.[pancake-final § Pilar 4 — Transparência financeira ativa]. Todos os concorrentes: fee de pool ou gas, nunca soma. Hipótese: Custo total desta operação: R$X constrói confiança antes do commit — usuário sabe exatamente o que está pagando.[uniswap-final § Pilar 5 — Simulação ativa e assistência pré-commit]. Todos os concorrentes: slippage Auto com valor fixo sem adaptação ao estado da pool. Hipótese: slippage que se ajusta à saúde do pool evita falha de transação sem o usuário precisar entender o mecanismo.0,001): o conceito de auto-flip de preço por magnitude tem origem em [pancake-final § Pilar 7 — Mobile-first interaction + Localização BR/LatAm como infraestrutura] ("Auto-flip de preço por magnitude — detectar quando ratio nominal < 0,01 e inverter automaticamente") e é capturado como 🟡 Diferenciador acima via Oportunidade 4 do consolidado. O que é ⚪ Novo é exclusivamente o valor do threshold (0,001) que define o ponto de ativação — esse valor específico não tem origem nos relatórios. Justificativa: 0,001 é o limiar abaixo do qual 4+ casas decimais antes do ponto tornam o número ilegível para iniciante sem notação científica. Evidência a coletar: sessões de usability com 5 iniciantes testando pares com magnitude extrema (ex: SHIB/ETH) — observar se o número "virado" confunde ou esclarece, e ajustar threshold se necessário.Os 60 px do mini-chip + strip de saúde são inegociáveis em termos de segurança, mas têm custo visual: em pool muito saudável (APR alto, TVL alto, Volume alto), o strip é informação positiva que compete com o campo de input. Mitigação: coloração discreta (verde quase neutro) em pool saudável; o strip "desaparece" visualmente quando não há alarme, e "aparece" em âmbar quando importa.
Dois estilos do mesmo componente chip (fill vs outline): o estado outline dos preset chips requer dois estados de estilo para o mesmo componente no design system. Custo: mais QA visual; ganho: affordance honesta elimina uma das principais causas de confusão de iniciante em primeiro uso de DEX (tap em botão que parece habilitado mas não faz nada).
CTA com múltiplos labels aumenta superfície de tradução: cada estado do CTA é uma string PT-BR. 8 estados = 8 strings × N idiomas. Mitigável com template system ({ação} · {motivo}) que reduz a variação para combinações parametrizadas, não strings completamente independentes.
Oracle de USD para eyebrow nos campos: o eyebrow ≈ R$X requer feed de preço fresco (< 30s de staleness). Com dado stale: mudar a cor do eyebrow para cinza claro + tooltip Cotação pode estar desatualizada. Nunca remover o eyebrow quando stale — o usuário precisa ver o dado mesmo que impreciso; o sinal de imprecisão é o suficiente.
Slippage Auto adaptativo por pool: calcular slippage pelo estado da pool requer: (1) dados de profundidade de liquidez em tempo real, (2) modelo de impacto de preço por tamanho de swap, (3) volatilidade histórica 24h. Complexidade de implementação alta. Fallback aceitável: Auto fixo por tier de pool (pool morta = 2%; pool ativa com TVL > $1M = 0,5%; pool nova = 1%) — heurística pior mas segura. O tooltip deve declarar qual critério está ativo.
Conflito Pilar 3 vs Pilar 4 (Risk signaling vs Transparência financeira): o strip de saúde em âmbar pode ser lido como aviso de risco de segurança (Pilar 3) quando na verdade é aviso de eficiência de execução (Pilar 4 — slippage). Resolução: copy do strip é sempre sobre execução (Slippage pode ser maior), nunca sobre segurança do contrato — não misturar os dois sinais. Segurança de contrato (token suspeito, pool não auditada) usa badge de risco diferente, com ícone de escudo e não de alerta operacional.
Permite ao usuário iniciar um swap de um dos tokens do par diretamente do contexto da pool — sem perder os sinais de saúde do pool no momento em que preenche os campos. Foco: iniciante (principal) + intermediário em decisão rápida.
Chip-strip de saúde (~36 px, sticky no topo do sheet, abaixo do grab handle — antes de qualquer campo)
APR X% · TVL R$ XXX M · Vol ↑/↓ XX%Vol24h / TVL < 0,001 OU Vol24h < R$ 5.000Mini-chip de identidade (1 linha discreta integrada ao topo do sheet)
WISE/ETH v2 0,3% — âncora de "em qual pool estou operando"Tabs do widget: Trocar | Limite ▾
Vẽd cortado)Limite ▾ abre Tela 05 como novo contexto de sheet — não expande esta telaCampo "Você paga" (input principal)
≈ R$ XXX (atualiza em tempo real a partir do FX rate)25% · 50% · 75% · TudoCampo "Você recebe" (calculado)
≈ R$ XXX abaixo do valor — o delta entre os dois eyebrows é o slippage visível sem cálculo⚠ Você vai receber menos que o estimado — liquidez limitada⚠ Pool com pouca atividade · Slippage pode ser maiorBloco de transparência (colapsado por default)
Custo estimado: ~R$ XX · Slippage: 0,5% em cinza secundárioTaxa de rede / Impacto de preço / Rota via [protocolo]Estimativa de gas no estado vazio (cosmético-estrutural)
Custo estimado de rede: ~R$ XX (para swap típico nesta pool)CTA dinâmico (fullwidth, sticky no rodapé do sheet)
Inserir valor — campo vazioConectar carteira — sem walletConfirmar swap — preenchido, pool ativaConfirmar mesmo assim — pool inativa (cor laranja, não verde)Confirmar com slippage alto — impacto > 2% (cor laranja)Saldo insuficiente de [TOKEN] — sem saldo (disabled + link Comprar [TOKEN] que redireciona para T06)Par pré-selecionado: herda do contexto da pool. Token A (ex: WISE) = "Você paga"; Token B (ex: ETH) = "Você recebe". Herança ocorre automaticamente — usuário não seleciona manualmente.
Inversão de par: ao tocar no ↕, os dois campos invertem (valores e tokens); âncora de orientação no mini-chip atualiza de WISE/ETH ↕ para ETH/WISE ↕. Inversão persiste enquanto o sheet estiver aberto; fecha o sheet → próxima abertura volta à orientação canônica (A/B conforme listagem da pool).
Threshold de pool inativa: Vol24h / TVL < 0,001 OU Vol24h < R$ 5.000. Ambos os critérios precisam ser atendidos para disparar badge âmbar E CTA laranja. Somente um critério ativo → só badge, CTA permanece verde.
CTA laranja + delay de 2s: quando pool inativa, o toque no CTA Confirmar mesmo assim espera 2 segundos antes de habilitar o envio. O delay é visível (progress ring no botão) — implementa fricção intencionada para ação com risco elevado, análogo ao type-to-confirm do Expert Mode.
Prioridade de estados do CTA (do mais para o menos prioritário): rede errada > sem wallet > saldo insuficiente > campo vazio > slippage alto > pool inativa > pronto.
Snapshot compartilhado: chip-strip de saúde usa o mesmo snapshot de KPIs que T01 carregou (timestamp idêntico) — garante que APR/TVL/Vol no strip batem com os valores que o usuário viu antes de abrir o sheet. Atualiza quando T01 refresca (polling 30s).
Eyebrow BRL: fonte = oracle FX BRL/USD atualizado a cada 30s. Quando dado envelhece > 30s → eyebrow exibe em cinza claro com (valor aproximado) ao lado para sinalizar staleness sem alarme.
| Estado | Feedback visual | Recuperação |
|---|---|---|
| Vazio | Campos em branco; presets visíveis (outline sem wallet); estimativa de gas heurística; CTA Inserir valor disabled |
— |
| Loading de cotação | Spinner no campo "Você recebe" + Calculando... |
Campo "Você paga" permanece editável durante loading |
| Pool inativa | Chip-strip âmbar + badge âmbar no campo "Você recebe" + CTA laranja Confirmar mesmo assim + drawer de saúde disponível |
Tap no chip-strip → contexto narrativo de por que a pool está inativa |
| Saldo insuficiente | CTA Saldo insuficiente de WISE disabled + link inline Comprar WISE |
Link redireciona para T06 (on-ramp) com token pré-selecionado |
| Slippage alto (> 2%) | Badge âmbar no campo "Você recebe" + bloco de transparência abre automaticamente + CTA laranja Confirmar com slippage alto |
Usuário pode ajustar valor ou continuar com consciência |
| Sem wallet | Chips de presets em outline 60%; CTA Conectar carteira |
Tap no CTA abre fluxo de conexão sem fechar o sheet |
| Gas alto | Estimativa de gas atualizada no bloco de transparência em âmbar + Rede congestionada — custo pode ser maior |
Usuário pode aguardar ou continuar |
| Confirmando on-chain | CTA em spinner + Aguarde — enviando para a rede + campos bloqueados |
— |
| Sucesso | Sheet fecha; toast flutuante: Swap confirmado · WISE → ETH · ver transação (link para hash) |
— |
| Erro de transação | Sheet mantém preenchimento; mensagem de causa específica (ex: Slippage excedido. Aumente a tolerância ou reduza o valor.) + CTA Tentar novamente |
Preenchimento mantido para não forçar redigitação |
| Rede errada | Banner sticky no topo do sheet Mude para [Rede] para usar esta pool; todos os CTAs desabilitados |
Tap no banner → orientação de como trocar a rede |
| Eyebrow BRL stale (> 30s) | Eyebrow em cinza claro com (valor aproximado) |
Atualiza automaticamente quando oracle responde |
CTAs dinâmicos
Inserir valorConectar carteiraConfirmar swapConfirmar mesmo assim — pool inativaConfirmar com slippage alto — impacto > 2%Saldo insuficiente de [TOKEN]Comprar [TOKEN] — link inline ao lado do CTA de saldo insuficienteTooltips e avisos inline
Pool com pouca atividade nas últimas 24h. Slippage pode ser maior que o habitual.⚠ Você vai receber menos que o estimado — liquidez limitada⚠ Pool com pouca atividade · Slippage pode ser maiorCusto estimado de rede: ~R$ XX (para swap típico nesta pool)Conecte sua carteira para usar atalhos de porcentagem (toast ao tap)WISE/ETH ↕ / ETH/WISE ↕Rede congestionada — custo pode ser maior(valor aproximado)Mensagens de erro
Slippage excedido. Aumente a tolerância ou reduza o valor.Transação recusada. [causa específica]. Tente novamente.Mude para [Rede] para usar esta poolSem liquidez disponível para este par no momento.Toast de sucesso
Swap confirmado · WISE → ETH · ver transação[uniswap-consolidado visualizar-pool § Insight 1 — Contexto herdado na ação]25% / 50% / 75% / Tudo no campo de saldo — elimina cálculo de proporção: [uniswap-consolidado visualizar-pool § Insight 2 — Presets chips em qualquer decisão financeira][uniswap-consolidado visualizar-pool § Insight 3 — Sinalização de risco inline sem friction transacional][pancake-final § Insight 5 — Transparência proativa antes do CTA][pancake-final § Insight 1 — Defaults pró-iniciante][uniswap-consolidado visualizar-pool § Fricção estrutural 1 — Desacoplamento widget↔contexto da pool][uniswap-consolidado visualizar-pool § Fricção estrutural 8 — Affordance sem estado honesto][uniswap-consolidado visualizar-pool § Fricção estrutural 7 — Unidade técnica não traduzida para intuitiva]Vẽd ao invés de "Vender") — corrigido por redução para 2 tabs fullwidth: [uniswap-consolidado visualizar-pool § Fricção estrutural 2 — Truncamentos PT-BR sistêmicos][pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência][uniswap-consolidado visualizar-pool § Oportunidade 1 — Contexto persistente no ato de operar][uniswap-consolidado visualizar-pool § Oportunidade 2 — Pré-visualização rica do swap antes de input][uniswap-consolidado visualizar-pool § Oportunidade 4 — Tradução técnica→intuitiva][uniswap-consolidado visualizar-pool § Oportunidade 7 — Quick-amount chips trazidos para desktop][pancake-final § Insight 2 — Defesa em camadas] sem exigir digitação de texto. Threshold precisa ser conservador: validar com dados reais de pools com baixa atividade legítima (ex: pools de stablecoins pouco usadas mas saudáveis) para evitar falsos positivos que irritam o intermediário. Validação futura: A/B de abandono vs execução com/sem CTA laranja + delay.Chip-strip de saúde (+36 px universais): custo de layout em todo bottom sheet do produto que herde o padrão. Aceitar — o padrão "nenhuma ação acontece sem contexto de saúde" vale o custo de espaço.
Estimativa de gas heurística: requer pipeline tamanho médio de swap nos últimos 30 dias por pool — infra não-trivial. Alternativa degradada: estimativa por pool-type genérica (v2 vs v3) sem histórico da pool específica — menos precisa mas viável no MVP.
Eyebrow BRL em campos de swap: requer oracle FX BRL/USD com SLA de 30s + tratamento de staleness. Dado stale > 30s mostrando valor desatualizado é pior que silêncio — o tratamento de cor diferente ao envelhecer é obrigatório.
2 tabs vs 4 tabs: comprime o fluxo de ordem-limite para T05 — custo de navegação (1 tap a mais para abrir ordem-limite). Ganho: nenhum label primário truncado; strip de identidade mais limpo.
CTA com 5+ estados: prioridade de estados precisa ser codificada explicitamente (rede errada > sem wallet > sem saldo > campo vazio > slippage alto > pool inativa > pronto) — complexidade de estado no componente, não opcional.
i18n: todo microcopy tem custo de tradução para ES e outros locales LatAm. Eyebrow BRL vira eyebrow em moeda local por locale — custo crescente com expansão geográfica.
Permite ao usuário criar uma ordem-limite no par da pool — com preço-alvo, quantidade e expiração — sem progressive disclosure tardio de campo crítico (Expiração), com tradução de unidade técnica para fiat, e sem perder a âncora de identidade da pool mesmo quando o sheet expande para full-screen. Foco: intermediário (principal), com guardrails ativos para iniciante.
Chip-strip de saúde + mini-chip de identidade (≡ Tela 04)
WISE/ETH v2 0,3% persiste no header fixo superior — nunca colapsa, nunca someCampo "Você vende"
≈ R$ XXX abaixo do valor25% / 50% / 75% / Tudo com mesma regra de affordance honesta de T04 (outline sem wallet; toast explicativo ao tap)Campo "Quando 1 [WISE] valer" (preço-alvo — componente central da tela)
Preço-alvoQuando 1 WISE valer (prosa contextual substitui jargão técnico)≈ R$ X,XX abaixo — precisão técnica preservada, âncora intuitiva anotadaMercado: 0,0000550306 ETH (≈ R$ 0,21); tap → preenche com preço atual+1% mais caro / +5% mais caro / +10% mais caro−1% mais barato / −5% mais barato / −10% mais barato= 0,0000578 ETH (≈ R$ 0,22) — valor resultante antes do tap⚠ Pode não executar — mercado precisa atingir esse preço + link Saber mais que abre drawer educacional (não modal bloqueante)Campo "Você recebe" (calculado automaticamente)
≈ R$ XXX— (travessão) — sem placeholder que simula dadoSeção de Expiração — sempre visível, estado vazio incluído
1 semana1 dia · 1 semana · 1 mês · 1 ano1 ano: eyebrow ⚠ acima do chip + microcopy condicional inline abaixo dos chips quando selecionado: Ordens longas mantêm aprovação do contrato ativa por 1 ano. Você pode cancelar antes disso.Bloco de transparência (colapsado por default)
Taxa de criação: ~R$ XX · Expira em 1 semanaTaxa de rede / Taxa da plataforma (X%) / Expiração / Contrato de ordem-limiteSaber mais sobre ordens-limite → drawer educacional de 60% da viewport (não modal bloqueante)CTA dinâmico (fullwidth, sticky no rodapé)
Inserir valor — campos vaziosDefinir preço-alvo — só "Você vende" preenchidoConfirmar ordem — tudo preenchido, pool ativaConfirmar swap imediato — preço-alvo < preço de mercado (cor laranja, badge âmbar)Conectar carteira — sem walletSaldo insuficiente de [TOKEN] — sem saldoⓘ ao lado de "Expiração" abre o mesmo drawer educacional que o link do campo de preço-alvoPar e direção herdados do contexto da pool: quando o usuário chega a T05 vindo do chip Limite ▾ de T04, o par e a direção são os mesmos da sessão de T04 naquele momento (incluindo eventual inversão de par).
Chips de markup invertem automaticamente ao trocar direção: se o usuário tocar na setinha de inversão de par, os chips +X% mais caro viram −X% mais barato e os valores resultantes são recalculados. A inversão é instantânea, sem recarregamento.
Expiração sempre visível: o campo de Expiração não está sob nenhuma condição de progressive disclosure. Mesmo com todos os campos de input vazios, os chips de expiração estão visíveis e o default 1 semana já está selecionado. Isso é comportamento obrigatório — não opcional.
Aviso de allowance longa (chip 1 ano): ao selecionar 1 ano, microcopy aparece inline diretamente abaixo da linha de chips — sem modal, sem bloqueio. É Tier 2 (risco moderado e reversível: o usuário pode cancelar a ordem antes do vencimento). Não aplica type-to-confirm para este caso.
Preço-alvo abaixo do mercado = execução imediata: quando o valor do campo "Quando 1 WISE valer" for menor que o preço de mercado atual no momento de confirmar (para venda), badge âmbar inline aparece: Preço abaixo do mercado — vai executar como swap imediato. CTA muda para Confirmar swap imediato (laranja). Esse caso é Tier 2 — não bloqueia, mas exige ciência explícita da mudança de modalidade.
Preço-alvo muito distante (> 50% acima do mercado): aviso adicional inline: Preço muito distante do mercado — ordem pode expirar sem executar. Não bloqueia a criação, mas permanece visível durante todo o preenchimento.
Mini-chip de identidade em full-screen: quando o sheet expande para ocupar mais da viewport (ex: teclado aberto + scroll longo), o header do sheet com WISE/ETH v2 0,3% permanece fixo no topo. O chip-strip de saúde acompanha colapsado em 1 linha (APR X% · Vol ↓XX% abreviado).
Prioridade de estados do CTA (do mais para o menos prioritário): rede errada > sem wallet > saldo insuficiente > campos vazios > parcial (só "Você vende") > preço < mercado > tudo preenchido.
| Estado | Feedback visual | Recuperação |
|---|---|---|
| Vazio | Todos os campos em branco; Expiração visível com 1 semana pré-selecionada; CTA Inserir valor disabled |
— |
| Parcial (só "Você vende" preenchido) | Campo "Você recebe" mostra —; CTA Definir preço-alvo |
Foco no campo de preço-alvo ao tocar no CTA |
| Loading de preço de mercado | Chip "Mercado" em spinner até preço ser carregado | Campos de markup desabilitados até o preço de mercado chegar |
| Preço-alvo < mercado | Badge âmbar inline: Preço abaixo do mercado — vai executar como swap imediato; CTA laranja Confirmar swap imediato |
Usuário pode ajustar o preço ou confirmar ciente da mudança |
| Preço-alvo muito distante (> 50%) | Aviso inline abaixo do campo: Preço muito distante do mercado — ordem pode expirar sem executar |
Persiste durante todo o preenchimento; não bloqueia |
| Expiração 1 ano selecionada | Microcopy inline condicional: Ordens longas mantêm aprovação do contrato ativa por 1 ano. Você pode cancelar antes disso. |
Não bloqueia; informação ativa o usuário sem friction adicional |
| Sem wallet | Chips de presets em outline 60%; CTA Conectar carteira |
Abre fluxo de conexão sem fechar o sheet |
| Saldo insuficiente | CTA Saldo insuficiente de [TOKEN] disabled + link Comprar [TOKEN] → T06 |
Redireciona com token pré-selecionado |
| Rede errada | Banner sticky Mude para [Rede] para criar ordens nesta pool; CTAs desabilitados |
Orientação de troca de rede |
| Confirmando on-chain | CTA em spinner + Aguarde — criando a ordem; campos bloqueados |
— |
| Sucesso | Sheet fecha; toast: Ordem criada · WISE → ETH quando 1 WISE = R$ X,XX · ver ordem |
— |
| Erro | Mensagem de causa específica; preenchimento mantido; CTA Tentar novamente |
— |
| Oracle de mercado indisponível | Chip "Mercado" em estado — com tooltip Preço de mercado indisponível. Insira manualmente. |
Campos de markup também em —; input manual habilitado |
CTAs dinâmicos
Inserir valorDefinir preço-alvoConfirmar ordemConfirmar swap imediato (preço < mercado)Conectar carteiraSaldo insuficiente de [TOKEN]Comprar [TOKEN] (link inline)Tentar novamenteLabels dinâmicos
Preço-alvoQuando 1 WISE valerMercado: 0,0000550306 ETH (≈ R$ 0,21)+1% mais caro / +5% mais caro / +10% mais caro−1% mais barato / −5% mais barato / −10% mais barato= 0,0000578 ETH (≈ R$ 0,22)Avisos inline
⚠ Pode não executar — mercado precisa atingir esse preçoPreço abaixo do mercado — vai executar como swap imediatoPreço muito distante do mercado — ordem pode expirar sem executarOrdens longas mantêm aprovação do contrato ativa por 1 ano. Você pode cancelar antes disso.Preço de mercado indisponível. Insira manualmente.Mensagens de erro e confirmação
Mude para [Rede] para criar ordens nesta poolOrdem criada · WISE → ETH quando 1 WISE = R$ X,XX · ver ordemWISE/ETH v2 0,3%[uniswap-consolidado visualizar-pool § Insight 2 — Presets chips em qualquer decisão financeira][uniswap-consolidado visualizar-pool § Insight 3 — Sinalização de risco inline sem friction transacional][pancake-final § Insight 5 — Transparência proativa antes do CTA][uniswap-consolidado visualizar-pool § Insight 5 — Sticky de identidade em mobile][uniswap-consolidado visualizar-pool § Fricção estrutural 1 — Desacoplamento widget↔contexto, manifestação full-screen Tela 09]+5% — em relação a qual lado?) — corrigido por chips semânticos com direção explícita (+5% mais caro) + inversão automática ao trocar direção: [uniswap-consolidado visualizar-pool § Ponto isolado — Fricção Tela 09 — direção de markup ambígua]1 semana pré-selecionado: [uniswap-consolidado visualizar-pool § Fricção estrutural 8 — Affordance sem estado honesto, manifestação Tela 10]1 ano sem aviso de allowance longa — corrigido por microcopy inline condicional ao selecionar o chip: [uniswap-consolidado visualizar-pool § Ponto isolado — Fricção Tela 10 — chip 1 ano sem aviso de risco][uniswap-consolidado visualizar-pool § Fricção estrutural 7 — Unidade técnica não traduzida para intuitiva][uniswap-consolidado visualizar-pool § Ponto isolado — Tela 10, copy dinâmico herdável]≈ R$ 0,21 transforma 0,0000550306 ETH de jargão em referência de valor acionável: [uniswap-consolidado visualizar-pool § Oportunidade 4 — Tradução técnica→intuitiva em campos de unidade não-fiat][uniswap-consolidado visualizar-pool § Oportunidade 1 — Contexto persistente no ato de operar][pancake-final § Pilar 4 — Educação contextual + transparência financeira; "Feedback dinâmico de probabilidade de execução em ordens-limite"] + [uniswap-final § Pilar 5 — Simulação ativa e assistência pré-commit; "substitui disclaimer estático por indicador atualizado em tempo real"]. O threshold específico de 50% é ⚪ (ver ⚪ abaixo).Chips de markup com preço resultante em segunda linha — sem precedente nos relatórios. Os chips de todos os concorrentes são "cégos" (+5% sem âncora de valor). Duas linhas por chip entregam delta relativo + valor absoluto no mesmo atalho, eliminando a ambiguidade de magnitude. Custo: +12 px por chip × 3 chips = +36 px na seção. Validação futura: medir conversão de fill do campo preço-alvo com vs sem segunda linha (hipótese: a âncora de valor no chip reduz abandono nesse campo).
Badge + CTA Confirmar swap imediato quando preço-alvo < mercado — sem precedente nos relatórios. Justificativa: evita que o usuário pague taxa de criação de ordem-limite por uma operação que vai executar imediatamente como swap (perdendo a semântica de "ordem-limite" e pagando fee extra). O erro acontece em DEXs com order-limit quando o usuário define o preço sem verificar o mercado atual. Validação futura: medir % de ordens com preço < mercado vs taxa de execução imediata com e sem o badge.
Threshold de 50% para classificar preço como "muito distante": o padrão de aviso dinâmico de execução improvável é 🟡 (ver acima), mas o critério exato de 50% não tem precedente direto nos relatórios. Justificativa: threshold conservador o suficiente para não gerar falsos positivos em mercados voláteis (desvios de 20–30% são comuns em altcoins de baixa liquidez); inequívoco o suficiente para que a hipótese central valha (ordem 50% acima do mercado tem probabilidade próxima de zero de executar em 1 semana). Validação futura: medir % de ordens criadas com desvio > 50% vs taxa de execução observada; calibrar conforme o percentil real de "nunca executa em 1 mês".
Mini-chip de identidade em full-screen: adiciona ~24 px ao header em modo full-screen. Custo mínimo; ganho crítico: usuário que opera em pool WISE/ETH v2 0,3% nunca confunde com WISE/ETH v3 0,05% ao retornar o olhar ao topo da tela.
Expiração sempre visível: +50 px no estado vazio do sheet (seção sempre presente). Aceitar — a alternativa (progressive disclosure até preenchimento de preço-alvo) levou o Uniswap a ter ordens com expiração aplicada silenciosamente sem ciência do usuário. Em produto financeiro, campo crítico nunca pode ser hidden-default.
Chips de markup com duas linhas por chip: +36 px na seção de chips + custo de cálculo em tempo real do valor resultante para cada chip (3 valores computados a cada atualização do oracle). Custo de infra baixo (3 multiplicações simples); custo de layout médio.
Copy dinâmico de label: requer um estado de componente para o label do campo de preço-alvo. Implementação trivial (CSS + condição booleana), mas precisa de spec explícita para que não seja "otimizado" para label estático durante desenvolvimento.
i18n dos chips de markup: +5% mais caro em PT-BR precisa de equivalente em ES para outros locales LatAm. Template: +5% [token A] más caro; a estrutura do chip (percentual + texto + valor resultante) é internacionalizável sem redesign.
Aviso de allowance longa (1 ano): Tier 2 (não Tier 1) — escolha deliberada. Reversível (usuário pode cancelar a ordem), não é perda financeira irreversível. Se o produto evoluir para ordens não-canceláveis por design, reavaliar para Tier 1.
Permite que o usuário compre cripto diretamente do contexto da pool — com moeda nominal = moeda de pagamento detectada por locale (BRL para Brasil), presets em valores típicos da moeda local, e orientação clara quando o token do par não é suportado diretamente pelo on-ramp. Foco: iniciante (principal) — quem chega aqui sem saldo suficiente para operar e precisa comprar antes.
Chip-strip de saúde + mini-chip de identidade (≡ T04 e T05)
Comprar [TOKEN] (link de T04) deve saber que está comprando para operar nesta pool específica, não perdendo o contexto de por que está comprandoSeletor de token (herda do contexto da pool)
On-ramp disponível para ETH. Para WISE, compre ETH e use Fazer swap.Comprar [TOKEN] provavelmente é iniciante; tooltip exige descoberta.Campo de valor (moeda nominal = moeda do locale)
Quanto você quer pagar?R$ 0,00 (locale BR)R$ 100 · R$ 300 · R$ 1.000 · R$ 3.000$50 · $150 · $500 · $1.500 USD convertidos pelo FX rate atual + arredondamento para múltiplo de R$ 50Outro ao final dos presets → abre input numérico livre com teclado numérico nativo≈ US$ XX · Taxa de câmbio: R$ X,XX/US$ · atualizado às HH:MM(valor pode ter variado)Comparativo de provedores (3 provedores default, expandível para mais)
Você recebe · Taxa · TempoVocê recebe: valor em token cripto (ex: 0,0287 ETH) + eyebrow em BRL (≈ R$ 945) — output em cripto como unidade central (usuário vai operar com ETH, não com BRL)Melhor cotação — o que dá mais ETH para o valor inserido✓ Verificado pela Kotai / Não verificado — curadoria declarada com fonteProvedor com maior quantidade de ETH recebida para R$ XXXTaxas do provedor: R$ X,XX · Taxa de câmbio aplicada · Taxas de rede KotaiBloco de método de pagamento (abaixo do comparativo)
PIX como método pré-selecionado (on-ramp local-first)~5 minutos via PIXTaxa de câmbio travada por 15 minutos após confirmarCTA dinâmico (fullwidth, sticky no rodapé)
Inserir valor — campo vazioContinuar para pagamento via PIX — valor preenchido, provider selecionadoContinuar para pagamento via Cartão — quando cartão é método ativoVer mais provedores abaixo dos 3 provedores listados (scroll para mais)Detecção de locale: IP + configuração de idioma do dispositivo → determina moeda nominal e método de pagamento padrão. Não é configuração do produto — é inferência de infra. Fallback: se locale desconhecido → USD + dropdown de seleção de moeda visível no topo do campo.
Presets dinâmicos: calculados em tempo de carregamento da tela a partir de equivalentes USD × FX rate atual + arredondamento. Fórmula: round(USD_equivalente × FX_rate / 50) × 50. Presets atualizam quando o FX rate muda além de ±3% em relação ao último cálculo (evita presets piscando a cada 30s).
Token pré-selecionado: lógica de seleção — (1) se o token B do par está na lista de suporte do on-ramp → pré-seleciona token B; (2) se não, tenta token A; (3) se nenhum → estado de "sem cobertura". A nota contextual segue a mesma lógica: só aparece quando há discrepância entre token do par e token suportado.
Aviso CEX: quando o token do par tem atributo listed_on_cex = true (ex: WISE, CAKE) mas não é suportado diretamente pelo on-ramp → a nota contextual inclui a orientação. O aviso não é exibido quando o usuário selecionou manualmente um token suportado (ETH, USDC) — evita aviso irrelevante no contexto ativo.
Provider selecionado persiste por sessão (não entre sessões): preferência aplicada enquanto o sheet estiver aberto. Ao fechar e reabrir, volta ao Melhor cotação. Justificativa: condições de mercado mudam entre sessões; a melhor cotação de 2h atrás pode não ser a melhor agora.
Taxa de câmbio travada por 15 min: conta regressiva começa ao tocar em Continuar para pagamento. Se o usuário retornar ao Kotai dentro de 15 min sem completar, a taxa pode ou não ter mudado — ao reabrir, fetch novo do FX rate e recalculo.
Eyebrow USD stale (> 60s): timestamp em âmbar + (valor pode ter variado). Dado não é removido — é sinalizado como possivelmente desatualizado. Aceitar a degradação com honestidade em vez de esconder o dado.
| Estado | Feedback visual | Recuperação |
|---|---|---|
| Vazio (campo) | Presets em BRL visíveis; provider "Melhor cotação" pré-selecionado sem valor; CTA Inserir valor disabled |
— |
| Loading de cotações | Spinner em cada linha de provider + Buscando melhores taxas... |
Presets de valor já visíveis para digitação antecipada enquanto cotações carregam |
| Token do par não suportado | Nota contextual visível: On-ramp disponível para ETH. Para WISE, compre ETH e use Fazer swap.; seletor mostra ETH pré-selecionado |
Usuário pode mudar o token manualmente no seletor |
| Nenhum token do par suportado | Estado de sem-cobertura: No momento o on-ramp não cobre os tokens deste par. Veja provedores alternativos. + link para CEX recomendado |
Link para CEX BR (ex: Mercado Bitcoin, Coinbase BR) como fallback — problema de ecossistema, não de UI |
| FX rate stale (> 60s) | Timestamp do eyebrow em âmbar + (valor pode ter variado) |
Atualiza automaticamente quando oracle responde; o campo de valor mantém o que o usuário digitou |
| Sem provider disponível | No momento não há provedores disponíveis. Tente novamente mais tarde. + botão Atualizar |
Não fecha o sheet; mantém o valor digitado |
| Locale desconhecido / fallback | USD como nominal + dropdown Selecione sua moeda: visível abaixo do campo |
Dropdown seleciona moeda → presets recalculam na moeda escolhida |
| Retorno do provider (sucesso) | Sheet fecha; toast: Compra confirmada · +X ETH chegará em ~5 min · ver transação |
T01 do fluxo recarrega para refletir novo saldo |
| Retorno do provider (falha/abandono) | Toast: Pagamento não concluído. Tente novamente.; sheet reabre no estado anterior |
Valor digitado e provider selecionado preservados |
| Rede errada | Banner sticky Mude para [Rede] para usar esta pool; CTAs desabilitados |
Orientação de troca de rede |
| Timeout da taxa travada (> 15 min) | Nota inline: Taxa de câmbio expirou. Atualizando... + refetch automático |
Novo valor exibido com timestamp atualizado antes de liberar o CTA |
CTAs dinâmicos
Inserir valorContinuar para pagamento via PIXContinuar para pagamento via CartãoAtualizar (botão de retry no estado sem provider)Notas e avisos contextuais
On-ramp disponível para ETH. Para WISE, compre ETH e use Fazer swap.No momento o on-ramp não cobre os tokens deste par. Veja provedores alternativos.Provedor com maior quantidade de ETH recebida para R$ XXX✓ Verificado pela KotaiNão verificadoLabels e eyebrows
Quanto você quer pagar?Taxa de câmbio: R$ X,XX/US$ · atualizado às HH:MMTaxa de câmbio: R$ X,XX/US$ · atualizado às HH:MM (valor pode ter variado)Taxa de câmbio travada por 15 minutos após confirmar~5 minutos via PIXMensagens de erro e estado
No momento não há provedores disponíveis. Tente novamente mais tarde.Mostrando em dólar. Selecione sua moeda:Taxa de câmbio expirou. Atualizando...Mude para [Rede] para usar esta poolToasts
Compra confirmada · +X ETH chegará em ~5 min · ver transaçãoPagamento não concluído. Tente novamente.[pancake-final § Insight 5 — Transparência proativa antes do CTA; breakdown "Provider Fees / Pancake Fees"][pancake-final § Insight 1 — Defaults pró-iniciante sem pedir permissão; "Melhor cotação" pré-selecionado com critério explícito"][pancake-final § Insight 5 — Transparência proativa; "breakdown sem esconder taxa da plataforma no spread"][pancake-final § Pilar 7 — Mobile-first interaction + Localização BR/LatAm como infraestrutura][uniswap-consolidado visualizar-pool § Oportunidade 8 — Localização sistêmica do on-ramp; "usuário brasileiro vê US$ no input e paga R$ no PIX sem transparência"][uniswap-consolidado visualizar-pool § Ponto isolado — Fricção Tela 11 — "token default ETH ignora herança de contexto"]listed_on_cex = true E não é suportado diretamente: [uniswap-consolidado visualizar-pool § Ponto isolado — Fricção Tela 11 — "aviso CEX persiste em contexto incorreto"][uniswap-consolidado visualizar-pool § Oportunidade 8 — Localização sistêmica do on-ramp]Presets dinâmicos baseados em equivalente USD (não valores fixos em BRL): os relatórios descrevem a localização de moeda nominal mas não o mecanismo de ajuste de presets. Justificativa: presets fixos em BRL (R$ 100 / R$ 300 / R$ 1.000) perdem relevância de poder de compra quando o real desvaloriza significativamente — R$ 100 em 2021 era ~US$ 20; em 2024, ~US$ 18. Presets baseados em equivalentes USD ($50 · $150 · $500 · $1.500) com arredondamento garantem que os presets sempre reflitam valores típicos de aporte em DeFi. Custo: cálculo dinâmico + critério de atualização dos presets (só quando FX muda ± 3% para evitar presets piscando). Validação futura: medir taxa de seleção de preset vs input livre; se input livre dominar, presets foram mal calibrados.
Travamento de taxa de câmbio por 15 minutos após Continuar: sem precedente nos relatórios analisados. Justificativa: usuário que vê R$ 502 e recebe cobrança de R$ 527 pela variação do FX durante o fluxo do provider externo perde confiança e reclama (esse padrão é bem documentado em produtos de exchange fiat). 15 minutos é convenção de exchanges fiat (B2C) — não DEX, mas importável. Custo: coordenação com o provider externo para honrar a taxa travada; se o provider não suportar rate-lock, exibir o aviso como "taxa estimada" com disclaimer de variação. Validação: reclamações de discrepância de valor pós-confirmação nos primeiros 3 meses de operação.
FX rate feed por locale: custo de infra para BRL/USD, MXN/USD, COP/USD, ARS/USD etc. + SLA de atualização (60s com sinalização de staleness). Começar apenas com BRL no MVP; MXN e outros locales no segundo release.
Presets dinâmicos: cálculo de FX em tempo real a cada carregamento + critério de re-cálculo (± 3% de variação). Stale de 3% pode criar preset que arredonda para R$ 100 enquanto o correto seria R$ 110 — aceitar a margem de arredondamento como UX aceitável (não promete exatidão).
Lista de tokens suportados por on-ramp: curadoria manual + atualização frequente (providers adicionam/removem suporte de tokens sem prévio aviso). Custo operacional contínuo — requer processo de sync com providers parceiros no mínimo semanal.
Nota contextual de token não suportado: orienta o caminho correto (ETH → swap) mas não elimina a fricção de 2 passos. É um problema de ecossistema (A6 — on-ramp ainda não suporta todos os tokens de DEX) — não tentar resolver inline além da orientação. O caminho de 2 passos precisa ser fluido: ao concluir a compra de ETH, toast de sucesso oferece Usar ETH para fazer swap para WISE → como CTA acessório.
Retorno do provider externo: fluxo de on-ramp abre o provider em contexto externo (webview ou browser). Retorno pode falhar (usuário fecha o app, perde a internet) — o estado de "retorno com falha" deve ser detectável via polling da carteira por novos créditos por até 30 min após o início do fluxo. Se detectar o crédito mesmo sem retorno explícito do provider, exibir toast de sucesso.
i18n: presets, método de pagamento e microcopy de tempo estimado (~5 minutos via PIX) precisam de variantes por locale. Template: ~[N] minutos via [MÉTODO] — internacionalizável. Maior custo: mapeamento de métodos por país (PIX → BR, SPEI → MX, PSE → CO, etc.) e tempos estimados distintos por método.
Tela de entrada do fluxo "Adicionar Liquidez" para o usuário sem pool pré-selecionado: converte a intenção vaga de "quero ganhar rendimento" em seleção de par e modo de provisão, com o sistema recomendando o protocolo adequado ao par — invertendo a ordem imposta por Uniswap e PancakeSwap, que exigem protocolo antes do par. Foco: iniciante BR/LatAm sem experiência prévia em LP.
a) Stepper horizontal de progresso Três passos visíveis desde a entrada: "Par e modo" (ativo) | "Configurar" | "Confirmar". Label do passo "Configurar" muda conforme modo escolhido: "Configurar faixa" (Concentrada) ou "Definir valores" (Simples). Entrega contrato visual: este processo tem etapas conhecidas.
b) Seletor de par — dois campos de token em sequência Campo Token A aparece primeiro; Token B só ativa após Token A selecionado. Busca por símbolo, nome ou endereço de contrato. Chips de sugestão em três camadas: recentes do usuário → trending na rede ativa → populares global. Sem seletor de protocolo visível neste passo — protocolo é consequência, não pré-requisito.
c) Card de saúde do pool (aparece após ambos os tokens definidos) Exibe: TVL + Volume 24h + APR estimado + badge de atividade (● Ativo / ⚠ Baixa atividade / ● Inativo). Estado colapsado ("Ver detalhes ▾") em pool saudável; expandido forçado quando Vol/TVL < 0,001. Se o par tem múltiplos pools (V3 0,05% + V3 0,3%): card agrega métricas cross-fee com sub-item "Ver N pools disponíveis ▾".
d) Cards de modo de provisão (aparecem após par definido) Máximo três modos relevantes ao par, renderizados como cards verticais side-by-side. Cada card: label primário em benefício do usuário + label secondary com nome técnico discreto + 1 frase de diferencial. Card recomendado pelo sistema exibe badge "Recomendado para este par". Até 3 modos disponíveis:
| Label primário | Secondary técnico | Diferencial |
|---|---|---|
| Simples e passiva | Liquidez V2 | Depositar e não gerenciar — rendimento automático |
| Concentrada em um intervalo | Liquidez V3/V4 | Mais eficiente: exige ajuste da faixa quando o preço mudar |
| Par correlacionado | StableSwap | Para pares como USDC/USDT: menos perda por variação de preço |
e) Aviso inline de par incompatível com modo (condicional) Aparece quando usuário seleciona manualmente modo Correlacionado para par volátil. Banner amarelo abaixo dos cards, não modal. Dois CTAs de saída: "→ Usar Concentrada" (primário) e "Continuar assim mesmo (risco entendido)" (laranja).
f) CTA principal Label dinâmico refletindo o próximo obstáculo específico. Disabled até par válido + modo selecionado.
g) Seção de discovery — "Populares agora" (cosmético funcional) 3–5 cards de pools com indicadores rápidos: par + APR estimado + badge de atividade. Em desktop: coluna lateral. Em mobile: carrossel horizontal abaixo dos seletores. Visível antes de o usuário selecionar tokens — scaffolding de intenção para quem chegou sem par em mente.
Seleção de par: Token A ≠ Token B. Import por endereço de contrato dispara preview obrigatório on-chain (nome resolvido + supply + idade do contrato + holders) e banner de token não verificado. Resolução on-chain obrigatória antes de exibir o token importado.
Recomendação de modo por heurística de par:
Validação de compatibilidade modo↔par: Se usuário seleciona modo Correlacionado para par volátil (detectado por heurística): banner amarelo inline com ação explícita requerida antes de avançar. Não bloqueia silenciosamente.
Routing condicional ao avançar:
adicionar-liquidez-02adicionar-liquidez-03criar-pool/criar-pool-01 (não continua este fluxo)CTA dinâmico: Sequência de label obrigatória: "Selecionar tokens" (estado vazio) → "Selecionar modo" (par definido, modo pendente) → "Configurar aporte" (pronto para avançar).
Discovery section: Carregamento lazy — não bloqueia render principal dos seletores. TTL de cache: 5 min. Falha silenciosa (section não renderiza se API demorar > 3s).
Vazio (entry sem contexto): Par não definido. Seletores com placeholder "Escolha um token". Cards de modo e pool health não visíveis. Discovery section ativa. CTA "Selecionar tokens" disabled.
Loading de dados do pool: Após seleção de Token B: skeleton animation no card de saúde. Se > 5s sem resposta: mensagem "Buscando dados do pool... pode levar alguns segundos." Fallback parcial com dado cached se disponível.
Pool não existe para o par:
Card de saúde exibe estado especial: badge âmbar "Pool ainda não existe para este par". Mensagem: "Você seria o primeiro provedor de liquidez — e definiria o preço inicial de troca." Aviso: "Criar um pool é uma operação avançada." Cards de modo ocultados. CTA muda para "Criar pool →" (secundário, não verde). Clique redireciona para criar-pool-01 preservando o par selecionado como parâmetro.
Par com token não verificado: Banner amarelo após import por endereço: "⚠ Token não verificado — qualquer pessoa pode criar um token com qualquer nome. Verifique o endereço com cuidado antes de continuar." Preview: nome resolvido + supply total + data de deploy. CTA "Adicionar assim mesmo" (laranja) + "Cancelar" (primário de escape).
Pool inativa (Vol/TVL < 0,001): Card de saúde expandido forçado com badge vermelho "Pool inativa". Mensagem: "Este pool tem pouca atividade — o rendimento de taxas pode ser próximo de zero. Considere explorar outros pares." CTA avança mas com label "Adicionar mesmo assim" (laranja, não verde).
Modo incompatível selecionado manualmente: Banner amarelo inline abaixo dos cards. Não modal. Dois CTAs: "→ Usar modo Concentrada" (primário) e "Continuar com risco entendido" (laranja). O banner não desaparece automaticamente — requer ação explícita do usuário.
Erro de rede / RPC lento: Card de saúde exibe "Não foi possível carregar dados do pool. [Tentar novamente]". Seleção de par permanece intacta. Avançar com dados não carregados: desabilitado até retry com sucesso ou timeout de 10s (neste caso exibe dado parcial com nota "Dados podem estar desatualizados").
Título da tela: "Fornecer liquidez"
Sub-headline abaixo do título: "Adicione tokens a um pool e ganhe rendimento em cada negociação realizada neste par."
Placeholder campo token: "Escolha um token"
Label modo Simples:
Simples e passiva Liquidez V2 · Depositar e não gerenciar "Ideal para quem quer ganhar rendimento sem precisar acompanhar o mercado."
Label modo Concentrada:
Concentrada em um intervalo Liquidez V3/V4 · Exige gestão da faixa de preço "Mais eficiente: o mesmo capital rende mais — mas você precisa ajustar a faixa quando o preço mudar."
Label modo Correlacionado:
Par correlacionado StableSwap · Otimizado para ativos de preço próximo "Para pares como USDC/USDT ou stETH/ETH: menos Impermanent Loss, mais eficiência."
Badge recomendação: "Recomendado para este par ✓"
Warning par incompatível (banner inline):
"⚠ [Token A] e [Token B] não são ativos correlacionados — este modo é otimizado para pares como USDC/USDT. Continuar pode resultar em perdas maiores por variação de preço." [→ Usar modo Concentrada] [Continuar com risco entendido]
Card pool não existe:
"Pool ainda não existe para [Token A]/[Token B] nesta rede." "Você seria o primeiro provedor de liquidez e definiria o preço inicial." [Criar pool →]
Card pool inativa:
"⚠ Pool com pouca atividade · Vol/TVL < 0,1% · O rendimento de taxas pode ser próximo de zero"
Token não verificado:
"⚠ Token não verificado — qualquer pessoa pode criar um token com qualquer nome. Verifique o endereço com cuidado antes de continuar." [Adicionar assim mesmo] [Cancelar]
CTA sequência: "Selecionar tokens" → "Selecionar modo" → "Configurar aporte"
Header da seção discovery: "Populares agora em [rede ativa]"
Nota na seção discovery: "Pools com maior atividade nas últimas 24h."
[uniswap-final § Fricção 4 — Defaults ignoram contexto que o sistema já tem] (o oposto: aqui aplicamos o padrão correto de defaults contextuais)[uniswap-nova-posicao.md § Oportunidade 2 — Card de pré-visualização do pool destino antes do depósito]; padrão de comportamento colapsado/expandido herdado de criar-pool-01 (design system Kotai)[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico e contextual][pancake-final § Insight — Transparência proativa antes do CTA][uniswap-final § Insight — Progressive disclosure como padrão arquitetural, não recurso pontual][uniswap-final § herdável — Múltiplas representações do mesmo dado][pancake-final § Fricção 1 — Léxico de protocolo como vocabulário primário de UI] (universal — 9 fluxos) e [uniswap-nova-posicao.md § Fricção 1 — Versão como caixa-preta técnica sem pedagogia][pancake-adicionar-liquidez.md § Fricção Estrutural 1 — Seleção de protocolo como caixa-preta técnica sem pedagogia][pancake-adicionar-liquidez.md § Ponto isolado, tela 4 — form aceita BNB+CAKE em StableSwap sem validação][pancake-final § Fricção 5 — Risk signaling ausente em pontos de decisão][pancake-adicionar-liquidez.md § Fricção Sistêmica — Localização incompleta: inglês técnico dentro de UI PT-BR][uniswap-nova-posicao.md § Observações adicionais — Caso 'pool ainda não existe' sem UX dedicada][pancake-adicionar-liquidez.md § Oportunidade 1 — Entrada por intenção: protocolo recomendado por par, não escolhido como pré-requisito] + [uniswap-nova-posicao.md § Oportunidade 1 — Pedagogia de versão: do dropdown técnico à assistência baseada em perfil]. Path B adotado: recomendação contextual com override explícito, não imposição. Hipótese: iniciante que recebe "Recomendado para BNB/USDT: Concentrada" tem menor taxa de modo incompatível vs. iniciante que escolhe protocolo às cegas.[uniswap-nova-posicao.md § Oportunidade 2 — Card de pré-visualização do pool destino antes do depósito]. Hipótese: usuário que vê "APR 0,00% · Vol/TVL <0,1%" antes de confirmar não aporta em pool morto.criar-pool-01.Heurística de par↔modo: Se a classificação estiver errada (ex: tratar ETH/WBTC como "não correlacionado" em ciclos onde eles se movem juntos), o badge "Recomendado" amplifica o erro em vez de mitigá-lo. Mitigação: threshold conservador de correlação; "Continuar assim mesmo" sempre disponível; heurística revisada por release após dados de aceitação. Custo de manutenção contínuo.
Discovery section: Aumenta payload da tela. Em mobile com conexão lenta, o carrossel pode aparecer depois dos controles principais — prioridade de render: seletor de par > pool health card > discovery. Falha silenciosa da section não quebra o fluxo principal.
State "pool não existe" dentro de Adicionar Liquidez: Cria bifurcação de produto (Adicionar Liquidez vs. Criar Pool) que pode confundir usuário que não entende a diferença. Mitigação: copy claro "Você seria o primeiro provedor" + routing explícito para Criar Pool (não um redirect silencioso). O handoff de parâmetros (par selecionado) entre os dois fluxos é obrigatório para não forçar o usuário a re-selecionar tokens no Criar Pool.
Cognitive load do T01: Stepper + par + health card + mode cards + discovery = mais superfície que o seletor de token padrão. Risco: parecer denso para o iniciante. Mitigação: disclosure progressivo rigoroso — health card e mode cards só aparecem após par definido; discovery é menor prioridade visual; texto é escasso nas cards de modo (1 frase cada).
i18n: 3 modos × 3 strings cada (label, secondary, descrição) = 9 strings adicionais por idioma. Custo de manutenção real quando novos modos/protocolos forem adicionados. Mitigação: componente de card de modo com props de conteúdo (não hardcoded por tela).
Tela de configuração para adição de liquidez no modo Concentrada (V3/V4) em um pool existente: o usuário define a faixa de preço e os valores de aporte, com contexto do pool sempre visível e presets probabilísticos calibrados ao histórico do par. Foco: intermediário que aceita gerir sua faixa em troca de maior eficiência de capital; iniciante protegido pelos presets e pelo card de saúde forçadamente expandido quando o pool está problemático.
a) Mini-card de identidade do pool (sticky no topo) Par + fee tier + badge de atividade + Vol 24h compact + APR compact. Em mobile: chip de identidade colapsável por tap com drawer de saúde completo. Nunca removido durante a configuração — garante que o usuário sabe onde está aportando em todo momento. Se pool inativo: mini-card expandido forçado com banner vermelho (sem colapso disponível).
b) Stepper horizontal "Par e modo" (✓ completo) | "Configurar" (ativo, passo atual) | "Confirmar". Clique em "Par e modo" retorna para T01 preservando dados de configuração (não destrói o formulário). Clique em "Confirmar" desabilitado até formulário válido.
c) Seletor de fee tier (segmented control) Exibe os pools reais existentes para este par, com fee tier e percentual de volume de cada um. Exemplo: "0,05% · 72% do volume" | "0,3% · 25% do volume" | "1% · 3% do volume". A opção com maior % de volume recebe badge "Mais usado". Para par com fee tier único: componente colapsado com nota "(Apenas um pool disponível para este par — fee XX%)" sem forçar interação onde não há decisão real.
d) Configurador de faixa de preço Três presets horizontais calibrados ao histórico deste pool específico + opção "Personalizado":
Mini-chart de distribuição de liquidez inline: mostra onde a liquidez atual está concentrada no pool, com banda destacada para a faixa configurada. Campos "Mín" e "Máx" editáveis. Auto-flip de cotação quando preço do par < 0,001 (ex: SHIB/USDC: exibe USDC/SHIB automaticamente com indicador "Mostrando [Token B]/[Token A] ↕ Trocar").
e) Campos de aporte com acoplamento bidirecional Ao inserir Token A: Token B calcula-se automaticamente pela proporção da faixa vs. preço atual. Se faixa 100% acima ou abaixo do preço: apenas 1 campo ativo, o outro exibe "—" com tooltip explicativo. Preset chips de saldo (25% / 50% / 75% / Tudo) com affordance honesta: outline quando saldo = 0, tap abre prompt de compra contextual. Equivalente em R$ abaixo de cada campo (Pilar 5 — locale BR).
f) Card de custo agregado (aparece após ambos os campos preenchidos)
Total a depositar: R$ X.XXX,XX
Gas estimado: ~R$ XX,XX
──────────────────────────────────
Você paga agora: R$ X.XXX,XX
Sub-label: "O total depositado permanece seu na posição — o gas é o custo para registrar na rede."
g) Slippage adaptativo Chip "Auto (X%)" com valor calculado visível. Não é "Auto" opaco — exibe o percentual atual para auditoria. Tooltip expandindo critério: "Calculado com base na profundidade deste pool e na volatilidade recente do par. Para este par: X%." Aviso inline quando Auto > 2%: "⚠ Slippage acima de 2% — pool com liquidez baixa ou alta volatilidade recente. Verifique antes de continuar." Botão "Configurar →" para override manual.
h) CTA principal Label dinâmico. Disabled até faixa válida + ambos os valores preenchidos + saldo suficiente.
Faixa de preço:
Acoplamento dos campos de aporte: Ao inserir Token A: Token B = valor de A × razão de token B pela posição na faixa definida. Se posição 100% single token (faixa fora do preço): campo do token ausente bloqueado e exibe "—" com tooltip "Nenhuma quantidade de [Token B] é necessária nesta faixa de preço."
Saldo insuficiente: CTA vira "Saldo insuficiente em [Token A] · Comprar [Token A] →" (laranja). Não bloqueia silenciosamente — nomeia o token específico em falta + link direto para on-ramp/compra contextual.
Aprovações de token:
Se aprovação necessária para um ou ambos os tokens: sub-label no CTA "(Aprovação necessária)". Ao avançar: aprovação tratada como passo proativo do fluxo (seguindo padrão de criar-pool-04 estabelecido no design system) — não como erro de recuperação.
Fee tier único: Componente de seletor colapsado, não forçando interação. Segue o princípio do consolidado Pancake: filtro de 1 item não exerce função de filtro — não forçar o custo cognitivo sem entregar escolha real.
Dados históricos insuficientes para presets: Pools com < 30 dias de histórico ou dados de oráculo insuficientes: presets substituídos por nota "Dados históricos insuficientes para este pool. Defina a faixa manualmente ou use ±10% como ponto de partida." Presets de probabilidade ocultados neste caso.
Pool inativa detectada ao entrar nesta tela: Mini-card expande forçado com banner vermelho. CTA disponível mas com label "Adicionar mesmo assim" (laranja) com delay de 1,5s antes de habilitar (sinal de ação consciente, sem ser type-to-confirm completo — calibrado pela severidade da situação).
Vazio (chegou da T01 sem valores preenchidos): Preset "Equilibrado" pré-selecionado (default do caso 90%). Campos de aporte com placeholder. CTA "Inserir valores" disabled. Slippage "Auto (calculando...)" com skeleton até dado do pool carregado.
Loading de dados do pool: Skeleton no mini-card, no seletor de fee tier e nos presets de probabilidade histórica. Timeout de 3s: mensagem "Buscando dados do pool... pode levar alguns segundos."
Dados de preço stale (oráculo lento ou offline): Badge âmbar no timestamp: "Dados de 5+ min atrás — o preço pode ter mudado. [Atualizar]". Slippage automático aumenta como proteção (valor aumentado com nota "Aumentado por precaução — dados do pool estão desatualizados").
Pool inativa: Mini-card expandido forçado, banner vermelho "Pool inativa". CTA "Adicionar mesmo assim" (laranja, delay 1,5s). Preset "Equilibrado" mantido, mas com nota "Atenção: pool com baixa atividade."
Faixa fora do preço atual: Banner amarelo inline abaixo do configurador: "Faixa [acima/abaixo] do preço atual — você aportará 100% em [Token]. Isso é válido; você ganhará taxas quando o preço entrar nesta faixa." Campo do token ausente: bloqueado, exibe "—".
Saldo insuficiente: CTA laranja com label específico: "Saldo insuficiente em [Token A] · Comprar [Token A] →". Sub-label abaixo: "Você tem R$ XX,XX · Necessário: R$ YY,YY."
Presets indisponíveis (pool nova ou dados insuficientes): Área de presets substituída por texto e sugestão de ponto de partida manual (±10%). Design da área preservado para consistência visual.
Sucesso / avanço: Stepper marca T02 como ✓. Transição para tela de revisão e confirmação (próxima etapa do fluxo, não neste lote). Toast de contexto na tela de confirmação: "Posição Concentrada configurada · [Token A]/[Token B] · Faixa: R$ XX – R$ YY."
Mini-card de identidade:
"Você está adicionando em: [USDC/ETH] · 0,05% · ● Ativo"
Seletor de fee tier — label:
"Pools disponíveis para este par"
Fee tier com badge:
"0,05% · 72% do volume · Mais usado ✓" "0,3% · 25% do volume" "1% · 3% do volume"
Pool fee tier único:
"(Apenas um pool disponível para este par — fee 0,3%)"
Configurador de faixa — label:
"Faixa de preço" "Você ganha taxas quando o preço do par estiver dentro desta faixa."
Presets:
"Conservador · ~85% do tempo in-range" "Equilibrado · ~70% do tempo in-range" "Agressivo · ~45% do tempo in-range" "Personalizado"
Warning faixa acima do preço:
"⚠ Faixa acima do preço atual — você aportará 100% em [Token A]. Você ganhará taxas quando o preço subir até esta faixa."
Warning faixa abaixo do preço:
"⚠ Faixa abaixo do preço atual — você aportará 100% em [Token B]. Você ganhará taxas quando o preço cair até esta faixa."
Card de custo:
"Total a depositar: R$ X.XXX,XX" "Gas estimado: ~R$ XX,XX" "Você paga agora: R$ X.XXX,XX" "O total depositado permanece seu na posição — o gas é o custo para registrar na rede."
Slippage chip:
"Auto (1,2%)"
Tooltip slippage:
"Calculado com base na profundidade deste pool e na volatilidade recente do par. Para este par: 1,2%. Para ajustar: [Configurar →]"
Warning slippage alto:
"⚠ Slippage automático acima de 2% — este pool tem liquidez baixa ou alta volatilidade recente. Verifique antes de continuar."
Auto-flip indicador:
"Mostrando [Token B]/[Token A] ↕ Trocar"
CTA sequência:
"Inserir valores" → "Definir faixa" → "Revisar aporte"
Saldo insuficiente:
"Saldo insuficiente em [Token A] · Comprar [Token A] →"
Pool inativa — CTA:
"Adicionar mesmo assim"
Indicador de participação:
"Seu aporte representa ~X% da liquidez total do pool"
[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico e contextual]visualizar-pool-04 e visualizar-posicao-02 no design system Kotai; princípio base: [uniswap-final § Insight — Progressive disclosure como padrão arquitetural]visualizar-pool-03 do design system Kotai[uniswap-final § Insight — Múltiplas representações do mesmo dado + bidirecionalidade][pancake-final § Insight — Transparência proativa antes do CTA]; padrão de CTA com label de obstáculo estabelecido em visualizar-pool-03 do design system Kotaicriar-pool-03 do design system Kotai[uniswap-nova-posicao.md § Ponto isolado — "Auto = 2,5%" sem critério exposto] — o problema identificado é que o valor existe mas o critério não é exposto; corrigimos expondo ambos[pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência] + princípio de CTAs destrutivos nunca como primário verde (Pilar 3 Kotai)[pancake-adicionar-liquidez.md § Fricção 2 — Componente de filtro de pool: vocabulário intraduzível] (CLAMM/LBAMM como labels sem consequência) + [uniswap-nova-posicao.md § Fricção 3 — Affordance e semântica ambígua em campos de decisão financeira][pancake-adicionar-liquidez.md § Fricção 2 — StableSwap filtro com item único "Classic" força interação sem choice real][uniswap-nova-posicao.md § Oportunidade 3 / Ponto isolado — "Auto = 2,5%" sem critério; "Auto" semântico (sugere adaptação) vs. "Auto" estático (constante interna)][uniswap-nova-posicao.md § Fricção 2 — Ausência de estado do pool destino na janela de decisão de aporte][pancake-final § Fricção 2 — i18n parcial e inconsistente] (confusão de denominação de preço em valores muito pequenos)[uniswap-nova-posicao.md § Fricção 1 — v4 como default expõe range concentrado sem ferramenta pedagógica para iniciante][uniswap-nova-posicao.md § Oportunidade 3 — Slippage adaptativo ao par/pool]. Hipótese: transações falham menos (slippage insuficiente em pool raso) e usuário não perde em pool saudável por slippage excessivo genérico.[uniswap-nova-posicao.md § Oportunidade 1 — Pedagogia de versão] (mesma filosofia de guiar o iniciante na decisão arquitetural mais importante). Hipótese: iniciante que escolhe preset "Equilibrado · ~70% do tempo in-range" tem posição in-range por mais tempo na primeira experiência, melhorando NPS de LP.[uniswap-pools.md § Fricção 2 — Fragmentação de pares compromete decisão de LP]. Hipótese: usuário que vê "0,05% · 72% do volume" não aporta no fee tier com zero roteamento — erro que atualmente não é sinalizado em nenhum DEX.Presets com probabilidade histórica por pool: Exige série histórica de preço vs. range por pool. Para pools com < 30 dias de dados: fallback para sugestão manual sem percentuais — experiência degradada mas não quebrada. Custo de infra: cache de série histórica por pool com TTL configurável. Pools com alta volatilidade recente podem ter probabilidades históricas desatualizadas; timestamp de "calculado em [data]" mitiga parcialmente.
Fee tier como pools reais com % de volume: Exige chamada de volume por fee tier ao carregar a tela. Em pools com indexador lento (rede congestionada): fallback para fee tier sem % — componente degrada graciosamente para segmented control padrão. Custo: +1 chamada de API por carregamento de T02.
Mini-card sticky em mobile: Em viewport muito estreito (< 375px), mini-card sticky pode consumir 20–25% do espaço disponível. Mitigação: versão colapsável por tap em mobile (chevron de colapso/expansão) com estado mínimo sempre visível (par + badge atividade, 1 linha).
Slippage adaptativo em tempo real: Cálculo de profundidade de pool em tempo real gera latência. Mitigação: exibir estimativa baseada em dados cached imediatamente ("Auto (~X%)") e atualizar com dado preciso em segundo plano quando disponível.
Separação T02/T03 (Concentrada vs. Simples): Dois screens de configuração em vez de uma tela bifurcada aumenta superfície de manutenção. Vantagem: cada tela tem escopo claro, não carrega complexidade do outro modo. O stepper exibe o mesmo label "Configurar" para ambos os modos — consistência visual mantida. Routing T01→T02 ou T01→T03 deve ser transparente: o usuário não deve sentir que "mudou de tela", apenas que a configuração reflete o modo escolhido.
Tela de configuração para adição de liquidez no modo Simples (V2 / StableSwap passivo) em um pool existente: o usuário define os valores de aporte sem precisar gerenciar intervalos de preço — o paradigma "depositar e não gerenciar". Foco: iniciante BR/LatAm que quer rendimento automático, protegido por validação inline de compatibilidade par↔protocolo e por pedagogia embutida no ponto de decisão, não em docs externos.
a) Mini-card de identidade do pool (sticky no topo) Par + badge de modo ("Simples e passiva · V2" ou "Par correlacionado · StableSwap") + badge de atividade + Vol 24h compact + APR estimado compact com asterisco. Mesmo padrão de T02 e do design system Kotai — nunca removido durante a configuração. Se pool inativo: expandido forçado com banner vermelho.
b) Stepper horizontal "Par e modo" (✓ completo) | "Configurar" (ativo) | "Confirmar". Clique em "Par e modo" retorna para T01 preservando contexto.
c) Campos de aporte com proporção fixa Token A e Token B. A proporção é fixada pelo protocolo (V2: fórmula constant product; StableSwap: proporcional ao pool). Ao inserir Token A: Token B calcula-se automaticamente. Campo de Token B exibe sub-label "(Calculado automaticamente com base no preço atual)" para comunicar o acoplamento. Campo de Token B não editável diretamente — se o usuário tentar focar nele, foco retorna para Token A com indicador visual sutil.
Preset chips de saldo (25% / 50% / 75% / Tudo) com affordance honesta: outline quando saldo = 0, tap abre prompt de compra contextual. Equivalente em R$ obrigatório abaixo de cada campo.
d) Aviso de par incompatível com modo (condicional — StableSwap) Aparece quando par selecionado não é correlacionado (ex: BTC/ETH em modo StableSwap). Banner amarelo inline com dois CTAs explícitos. Não bloqueia silenciosamente — o usuário precisa tomar uma ação consciente antes de avançar.
e) APR estimado com caveat obrigatório Exibido abaixo dos campos de aporte, antes do card de custo: "~X,X% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ". Tooltip do ⓘ obrigatório com explicação de IL em linguagem de usuário. Esta linha é obrigatória em toda proposta de LP da Kotai — nunca omitida.
f) Card de custo agregado (após campos preenchidos)
Total a depositar: R$ X.XXX,XX
Gas estimado: ~R$ XX,XX
──────────────────────────────────
Você paga agora: R$ X.XXX,XX
Sub-label: "O total depositado permanece seu na posição — o gas é o custo para registrar na rede."
g) Slippage automático Campo simplificado: chip "Auto (X%)" com valor visível. Tooltip: "Margem de variação de preço aceita durante a transação. Calculado para este pool." Aviso inline quando Auto > 1% em modo V2: "⚠ Slippage acima de 1% para pool Simples — verifique se há liquidez suficiente."
h) Nota pedagógica inline 1 linha abaixo dos campos, antes do APR: "Neste modo, o protocolo distribui automaticamente seus tokens conforme a fórmula do pool. Você não precisa definir intervalos de preço." Botão de dismiss "Entendido ×" por sessão (não permanentemente — respeita Pilar 3 / proibição de "Don't show this again" em contexto relevante).
i) CTA principal Label dinâmico. Disabled até ambos os valores preenchidos + saldo suficiente.
Proporção fixa V2: Ao inserir Token A: Token B = valor de A × (reserva de B / reserva de A no pool). Campo B não editável diretamente. Sub-label "(Calculado automaticamente com base no preço atual)" sempre visível. Se proporção inverter durante sessão (preço mudou): re-calcular Token B automaticamente e exibir nota "O valor foi recalculado com o preço atual."
Proporção StableSwap: Proporcional à composição atual do pool (pool desequilibrado aceita proporção não 50/50 com menor IL). A proporção calculada é exibida: "Proporção atual do pool: X% [Token A] / Y% [Token B]."
Validação par↔modo para StableSwap: Se par classificado como "não correlacionado" (heurística): banner amarelo inline aparece. O CTA não avança automaticamente — usuário deve clicar explicitamente "Continuar com risco entendido" (laranja) ou "→ Usar modo Concentrada" (primário). Ação explícita é obrigatória para continuar com par incompatível. Esta regra resolve o ponto isolado mais crítico do consolidado PancakeSwap (formulário aceitava BNB+CAKE em StableSwap sem nenhuma validação).
Saldo insuficiente: CTA nomeia o token específico em falta: "Saldo insuficiente em [Token A] · Comprar [Token A] →" (laranja). Link direto para on-ramp/compra.
Nota pedagógica: Visível por default na primeira visita à tela (baseado em sessão, não em persistência permanente). Estado de collapsed guardado por sessão. Na segunda visita na mesma sessão: collapsed por default. "Don't show this again" permanente é proibido — a nota pode ser relevante numa nova sessão.
Slippage: Auto por default. Para V2 pools grandes, geralmente < 0,5%. Aviso automático quando Auto > 1% (threshold mais baixo que em T02 — pools V2 são geralmente mais estáveis; slippage alto em V2 é sinal mais grave).
Aprovações de token:
Sub-label no CTA "(Aprovação necessária)" quando tokens precisam de aprovação. Passo proativo ao avançar (padrão do design system Kotai de criar-pool-04).
Re-cálculo ao mudar preço: Se o preço do par mudar > 1% entre o momento de entrada na tela e o momento de submit: toast de aviso "O preço mudou. Valores recalculados." Proporção se atualiza automaticamente.
Vazio: Campos zerados. Preset chips outline. Nota pedagógica visível. Card de custo não visível ainda. APR estimado visível com dados do pool. CTA "Inserir valores" disabled.
Loading de dados do pool: Skeleton nos campos de aporte (proporção do pool sendo carregada) e no APR. Se > 3s: "Buscando dados do pool... pode levar alguns segundos." Fallback com proporção estimada + indicador "(Estimativa — dados do pool sendo carregados)."
Par incompatível com modo StableSwap: Banner amarelo expandido inline. CTA principal travado até ação explícita: "→ Usar modo Concentrada" (primário verde) ou "Continuar com risco entendido" (laranja). O banner não tem dismiss silencioso — permanece até o usuário fazer uma escolha. Esta é a proteção crítica do fluxo.
Pool inativa (Vol/TVL < 0,001): Mini-card expandido forçado com banner vermelho. APR estimado exibe "~0,00% ao ano (pool inativa)" com ⓘ explicativo. CTA "Adicionar mesmo assim" (laranja). Nota pedagógica colapsada automaticamente para dar espaço ao banner de pool inativa.
Saldo insuficiente: CTA laranja com label dinâmico e sub-label: "Você tem R$ XX,XX · Necessário: R$ YY,YY."
Proporção recalculada (preço mudou): Toast: "O preço mudou. Valores recalculados." Token B atualiza silenciosamente. Se mudança > 5%: banner âmbar mais visível: "O preço de [Token A] mudou significativamente — verifique os valores antes de continuar."
Aprovação pendente: Sub-label no CTA "(Aprovação necessária)". Ao avançar: passo proativo de aprovação (design system).
Sucesso / Avanço: Stepper marca T03 como ✓. Transição para tela de revisão e confirmação. Toast contextual na tela de confirmação: "Posição Simples configurada · [Token A]/[Token B] · Proporção: XX%/YY%."
Mini-card de identidade — modo Simples:
"Você está adicionando em: [USDC/ETH] · Simples e passiva · ● Ativo"
Mini-card de identidade — modo Correlacionado:
"Você está adicionando em: [USDC/USDT] · Par correlacionado · StableSwap · ● Ativo"
Sub-label campo Token B:
"(Calculado automaticamente com base no preço atual)"
Proporção StableSwap:
"Proporção atual do pool: 52% USDC / 48% USDT"
Nota pedagógica:
"Neste modo, o protocolo distribui automaticamente seus tokens conforme a fórmula do pool. Você não precisa definir intervalos de preço." "Entendido ×"
APR com caveat obrigatório:
"~X,X% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ"
Tooltip APR (texto completo):
"Estimativa baseada nas taxas coletadas nos últimos 30 dias neste pool. Não inclui Impermanent Loss — a diferença de valor entre manter os tokens e fornecê-los como liquidez. O Impermanent Loss pode reduzir ou zerar o retorno, dependendo da variação de preço entre os tokens."
Card de custo:
"Total a depositar: R$ X.XXX,XX" "Gas estimado: ~R$ XX,XX" "Você paga agora: R$ X.XXX,XX" "O total depositado permanece seu na posição — o gas é o custo para registrar na rede."
Warning par incompatível (banner inline):
"⚠ [Token A] e [Token B] não se movem em conjunto — o modo Par correlacionado é otimizado para pares como USDC/USDT. Continuar pode resultar em perdas maiores por variação de preço entre os tokens." [→ Usar modo Concentrada] [Continuar com risco entendido]
Slippage chip:
"Auto (0,5%)"
Tooltip slippage:
"Margem de variação de preço aceita durante a transação. Calculado para este pool. Para ajustar: [Configurar →]"
Warning slippage V2 alto:
"⚠ Slippage acima de 1% para pool Simples — verifique se há liquidez suficiente neste pool."
Pool inativa:
"⚠ Pool com pouca atividade · Vol/TVL < 0,1% · Rendimento de taxas pode ser próximo de zero"
Proporção recalculada:
"O preço mudou. Valores recalculados."
CTA sequência:
"Inserir valores" → "Revisar aporte"
Saldo insuficiente:
"Saldo insuficiente em [Token A] · Comprar [Token A] →"
Pool inativa — CTA:
"Adicionar mesmo assim"
[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico e contextual]visualizar-pool-04, visualizar-posicao-02 e adicionar-liquidez-02 no design system Kotai[pancake-final § Insight — Transparência proativa antes do CTA (parcial)]; padrão cross-fluxo do design system Kotai[uniswap-final § Insight — Múltiplas representações do mesmo dado + bidirecionalidade][uniswap-nova-posicao.md § Insight 2 — Microcopy pedagógica inline]; quando uma consequência é eliminada pelo protocolo, manter a section visível e usar o espaço para educarvisualizar-pool-03 e adicionar-liquidez-02 no design system Kotaicriar-pool-04 estabelecido no design system Kotai[pancake-adicionar-liquidez.md § Ponto isolado, tela 4 — form aceita BNB+CAKE em StableSwap sem validação] + [pancake-adicionar-liquidez.md § Oportunidade 3 — Validação par↔protocolo inline][uniswap-nova-posicao.md § Fricção 1 — Versão como caixa-preta] (manifestação: usuário não entende por que o segundo campo muda automaticamente) + [uniswap-nova-posicao.md § Insight 2 — Microcopy pedagógica inline: quando decisão é eliminada por contexto, manter section visível e explicar][uniswap-final § Fricção 6 — Métricas DeFi sem decomposição, janela ou comparativo] + [uniswap-pools.md § Oportunidade 1 — Sistema pedagógico de métricas DeFi: APR sem ancoragem de IL é promessa falsa][pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência] (Pilar 3/7: "Don't show this again" proibido em contexto relevante para iniciante)[uniswap-nova-posicao.md § Ponto isolado — "Auto = 2,5%" sem critério]; threshold menor para V2 porque slippage alto em pool simples é sinal mais grave que em concentrada[pancake-adicionar-liquidez.md § Fricção Sistêmica — Localização incompleta: inglês técnico dentro de UI PT-BR] + [pancake-final § Fricção 2 — i18n parcial e inconsistente][pancake-adicionar-liquidez.md § Oportunidade 3 — Validação par↔protocolo inline antes do aporte]. Hipótese: usuário que recebe warning de "BTC/ETH não é par correlacionado" e troca para modo Concentrada tem IL menor e NPS mais alto na primeira posição LP. Nenhum DEX analisado entrega esta proteção.[uniswap-pools.md § Oportunidade 1 — Sistema pedagógico de métricas DeFi: re-label + tooltip de IL]. Hipótese: usuário que lê "~X% ao ano sem Impermanent Loss" tem expectativas calibradas, menor taxa de abandono/reclamação no primeiro mês.[pancake-adicionar-liquidez.md § Oportunidade 1 — Entrada por intenção] + [uniswap-nova-posicao.md § Oportunidade 1 — Path B para iniciante]. A simplificação de T03 vs. T02 é a realização prática da filosofia "Simples e passiva" para o perfil iniciante do target.visualizar-posicao-01 do design system). Evidência a coletar: frequência de "preço mudou" durante sessão vs. taxa de falha de transação por slippage.Validação par↔protocolo: Exige heurística de classificação de par mantida por equipe de produto. Se a heurística classificar incorretamente um par como "não correlacionado" quando ele se movimenta em conjunto (ex: WBTC/BTC em alguns mercados), o warning é falso positivo — cria atrito desnecessário para o usuário avançado. Mitigação: threshold conservador; "Continuar com risco entendido" sempre disponível como escape; revisão da heurística trimestral com dados de IL realizado por modo.
Nota pedagógica colapsável: Adiciona string de UI por modo de provisão. Custo de i18n: ~3 strings por modo × 3 modos = 9 strings pedagógicas por idioma. Mitigação: componente reutilizável com prop de conteúdo (não hardcoded por tela).
Campo Token B não editável: Pode gerar fricção para o usuário que prefere inserir pelo Token B (ex: "quero depositar exatamente 100 USDT"). Mitigação: tooltip no ícone de cadeado com "Para definir um valor específico de USDT, edite o campo USDC acima." Alternativa futura: campo de input alternativo que travoca A e B como "âncora" do cálculo. Decisão adiada para segundo release — o comportamento atual é mais previsível e alinhado com como o protocolo funciona.
APR tooltip com link "Saiba mais": O link de educação sobre IL aponta para conteúdo externo ou interno. Se externo: dependência de URL que pode mudar; se interno: custo de produção e manutenção de conteúdo pedagógico. Mitigação de MVP: tooltip autocontido (sem link) com texto completo de 3 linhas.
Re-cálculo automático de proporção: Polling de preço a cada 30s gera chamadas contínuas enquanto a tela está aberta. Em mobile com conexão fraca: pode causar piscar dos campos ao atualizar. Mitigação: debounce de 5s antes de aplicar novo valor; atualização silenciosa sem re-renderização completa do formulário.
Separação T02/T03 vs. tela bifurcada: A mesma observação de T02 se aplica: dois screens de configuração aumentam a superfície de manutenção. O benefício é que T03 é fundamentalmente mais simples que T02 (sem range, sem fee tier dinâmico, sem gráfico de distribuição de liquidez) — a separação evita que o iniciante seja exposto à complexidade do modo Concentrado ao escolher o modo Simples.
Permite ao usuário receber criptoativos na carteira Kotai com proteção ativa contra o principal vetor de perda não-maliciosa em DeFi — enviar token em rede errada e perder fundos de forma irreversível. Substitui o paradigma de endereço cru por um fluxo guiado de 2 passos: escolha do token + rede, depois endereço com contexto. Foco: iniciante (quem mais sofre o vetor).
Step indicator (2 passos visíveis simultaneamente, passo ativo em destaque) Comunica ao usuário que há duas decisões a tomar antes do endereço aparecer — estabelece expectativa e reduz abandono por surpresa de fluxo longo.
Passo 1 — Seleção de token
Passo 2 — Seleção de rede (habilitado após token selecionado)
Endereço (pós-seleção de token + rede)
0xd09B…618a com botão de expansão para exibir completo.Copiar endereço | Mostrar QR Code — pareados, sem hierarquia visual entre eles.Separador "Receber de uma plataforma de negociação"
↗ (sinaliza que abre fora do produto).Link modo avançado (discreto, no rodapé do modal)
↗.[Token] e [Rede] substituídas pelos valores selecionados. Exibida no momento em que o endereço aparece, não antes.Vazio / Step 1 sem busca ativa Lista pré-populada com tokens do portfólio do usuário (ordem por valor decrescente). Se portfólio vazio: tokens trending por locale. Nenhum campo em branco.
Loading Step 2 (verificando redes disponíveis) Skeleton de 2–3 items com copy: "Verificando redes disponíveis para [Token]…" Resolução < 500ms esperada; se persistir, exibe lista completa conhecida com aviso de atualização pendente.
Token sem suporte em nenhuma rede Kotai Não bloqueia — informa. Copy: "A Kotai ainda não suporta receber [Token] diretamente. Use o modo avançado com atenção ou transfira via corretora." Link para modo avançado + link para seção CEX.
Rede não suportada selecionada por engano Não aparece na lista do Step 2 (filtrada); seção colapsada "Redes não suportadas" disponível para expandir com copy neutra por rede.
Solana como família separada Card separado do EVM no Step 1 de seleção de token quando usuário tem SPL tokens. No Step 2, endereço Solana (Ed25519) exibido com badge "Solana — endereço diferente do EVM" para evitar confusão de usuários multi-chain.
CEX loading (OAuth) Spinner no card de CEX selecionada; timeout em 10s → "Não conseguimos conectar ao [CEX] agora. [Tentar de novo] [Usar endereço manual]".
CEX falha de OAuth Toast âmbar: "Não conseguimos conectar ao [CEX]. Use o endereço manual →" com link direto para Step 1 do fluxo guiado.
Endereço copiado (sucesso) Toast: "Endereço copiado — use APENAS [Token] na rede [Rede]." Toast persiste 5s e é dismissível.
| Elemento | Copy |
|---|---|
| Título do modal | Receber tokens |
| Subtítulo | Escolha o token e a rede para gerar seu endereço de recebimento |
| Label Passo 1 | Qual token você quer receber? |
| Placeholder busca | Buscar por nome ou símbolo |
| Label Passo 2 | Em qual rede você vai enviar? |
| Badge "Recomendada" | Recomendada — menor taxa agora |
| Aviso de segurança | Envie APENAS [Token] na rede [Rede]. Outras combinações resultam em perda permanente de fundos. |
| CTA cópia | Copiar endereço |
| CTA QR | Mostrar QR Code |
| Toast de cópia | Endereço copiado — use APENAS na rede [Rede] |
| Separador CEX | Receber de uma plataforma de negociação |
| Badge externo | ↗ Abre fora do Kotai |
| Link CEX ausente | Não vejo minha corretora → |
| Link modo avançado | Ver todos os endereços › (avançado) |
| Pedir ajuda | Precisa de ajuda? |
| Rede não suportada | [Rede] — não suportada nesta versão |
| Badge bridged | Bridged via [rede de origem] ⓘ |
| Tooltip bridged | Este [Token] foi criado por ponte, não é o original. Pode não ser resgatável fora desta rede. |
| CTA desabilitado Step 2 | Selecione o token primeiro |
| Loading Step 2 | Verificando redes disponíveis para [Token]… |
| Token sem suporte | A Kotai ainda não suporta receber [Token] diretamente. |
| Falha OAuth CEX | Não conseguimos conectar ao [CEX]. [Tentar de novo] [Usar endereço manual] |
[uniswap portfolio-04 § Insight 1]. Replicação consciente — listar N cards com o mesmo endereço seria poluição.[uniswap portfolio-04 § Regras de negócio].[uniswap portfolio-04 § Insight 2] + [uniswap portfolio consolidado § Insights — Suporte contextual dentro de modais sensíveis]. Affordance de ajuda no momento de maior risco — não no footer global.[uniswap portfolio-04 § Insight 3]. Kotai adiciona badge ↗ para tornar a distinção explícita.[uniswap portfolio-04 § Insight 4]. Cobre os dois caminhos reais: copy para colar em app desktop, QR para escanear no celular.[uniswap portfolio-06 § Insight 2] + [uniswap portfolio consolidado § Microcopy na linguagem mental do usuário].[uniswap portfolio-06 § Insight 1]. CEX section exibe apenas integrações funcionais.[uniswap portfolio-04 § Fricção 2] + [pancake-final § Fricção 4 — endereço sem identificador de rede]. Fluxo guiado de 2 passos elimina o endereço cru como artefato principal. User não recebe endereço sem saber para qual token+rede ele serve.[uniswap portfolio-04 § Fricção 1]. Step 2 mostra apenas redes onde o token existe + seção "não suportadas" com copy neutra por rede.[uniswap portfolio-06 § Fricção 2] + [uniswap portfolio consolidado § Fricção — Exclusão geográfica]. CEX detectadas por locale: Mercado Bitcoin + Binance BR como primários para usuário BR.[uniswap portfolio-06 § Fricção 1]. CEX section tem múltiplas opções reais hierarquizadas por relevância de locale.[uniswap portfolio-06 § Fricção 3]. Badge ↗ em todos os cards que redirecionam para OAuth/URL externa — distingue affordance local de integração externa.[uniswap-final § Fricção 2]. Badge "Canônico" / "Bridged via [rede]" com tooltip de risco distingue emissões e protege o iniciante de tratar tokens bridged como equivalentes ao canônico.[uniswap portfolio-04 § Oportunidade] + [uniswap portfolio consolidado § Oportunidade — Receber guiado]. Hipótese de diferenciação: fluxo guiado com aviso dinâmico de token+rede elimina o principal vetor de perda do iniciante. Zero envio de USDT-TRC20 para endereço EVM porque o modal nunca exibe o endereço sem o contexto de token+rede. Passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes entregam endereço cru (2) ✓ afeta iniciante diretamente (3) ✓ falta de investimento (4) ✓ ganho perceptível: diferença entre perder $500 e não perder.[uniswap portfolio consolidado § Oportunidade — On-ramp local-first] + [pancake-final § Pilar 7 — Mobile + BR/LatAm]. Hipótese: mostrar Mercado Bitcoin + Binance BR para usuário BR converte o caminho "teatral" do Uniswap em fluxo funcional. Passa nas 4 perguntas-teste.[uniswap portfolio consolidado § Oportunidade — Seletor de rede contextualizado]. Hipótese: lista de redes filtrada por token + seção "não suportadas" com redes populares elimina o cenário de "usuário envia em Tron achando que está incluída nas '17 redes'".Custo de UX (+1 passo no fluxo de recebimento): 2 passos vs 1 clique no modelo atual. Trivial vs custo de perda irreversível de fundos. Aceitar sem hesitação. Modo avançado (endereço cru) preserva o caminho de 1 clique para usuário avançado.
Mapa "token → redes suportadas" exige manutenção contínua: cada novo token adicionado precisa de mapeamento de redes. Custo de infra real, amortizável com o mesmo mapa usado em swap (seletor de token), pools (discovery) e visualizar-token.
Badge "Bridged" exige governança editorial: qual versão é o "canônico" de USDC — Ethereum mainnet, Base, ou outra? Requer critério público clicável ("como determinamos 'canônico'") para evitar percepção de endosso. Risco de litigation se Kotai classifica token incorretamente.
CEX local-first por locale: VPN users veem layout incorreto → botão "Não estou no Brasil" como fallback. Cada integração de CEX tem custo recorrente de manutenção (APIs mudam, KYC muda). MVP: Mercado Bitcoin + Binance BR + Coinbase (3 integrações); escalar após adoção validada.
i18n: aviso de segurança dinâmico usa template com variáveis [Token] e [Rede] — precisa validação de concordância em PT-BR para todos os tokens/redes (ex: "Envie APENAS Ether na rede Ethereum" vs "Envie APENAS USDC na rede Base"). Adicionar gênero gramatical ao registro de tokens é custo extra mas necessário para evitar copy quebrada.
QR Code com metadata de rede: alguns wallets leem metadata EIP-681 embutida no QR (rede + token no payload). Implementar quando disponível — reduz erro de rede errada no flow de scan.
Apresenta o portfólio quando uma ou mais fontes de dados falhou parcialmente — sem esconder a falha (honestidade visual), sem declarar o produto "quebrado" (catálogo declarativo de causas com ação e tempo estimado), mantendo operacionais as funcionalidades que ainda funcionam. Endereça simultaneamente o estado de gráfico em erro, o estado de conexão parcial EVM+Solana, e o timeout de skeleton de saldo. Foco: iniciante (quem interpreta falha parcial como produto quebrado e abandona) e intermediário (que precisa saber qual rede está com problema).
Banner de falha parcial (chip âmbar ancorado na área de dados, não no header global)
Big stat de patrimônio em estado parcial
Gráfico em estado de falha declarativo
Skeleton de saldo com timeout escalonado
[uniswap portfolio-05 § Fricção 2].Tabs (Tokens / NFTs / Atividade) — operacionais independentemente
Cards de funding (Adicionar fundos / Receber tokens)
Falha parcial — EVM ok, Solana falhou Banner âmbar: "Solana com atraso · [Recarregar]". Big stat com asterisco: "R$ X.XXX,XX " + sub-label " Sem dados de Solana por ora". Tab Tokens mostra apenas tokens EVM com banner inline "Mostrando apenas tokens EVM — Solana indisponível". Tab Atividade: idem.
Falha total — todas as redes falharam Banner vermelho acima de toda área de dados: "Não conseguimos carregar seu portfólio · [Recarregar] · [Ver status da Kotai]". Big stat: skeleton → após 5s: "— · [Recarregar]". Gráfico: widget cinza com tooltip de causa + fallback de diagnóstico. Cards de funding: operacionais.
Loading inicial (< 5s) Skeleton padrão no big stat. Gráfico: área cinza sem tooltip (ainda não é erro — é loading). Pills de timeframe: desabilitadas silenciosamente (sem tooltip — usuário ainda não tentou clicar).
Skeleton timeout (≥ 5s) Sub-label âmbar abaixo do skeleton do big stat: "Demorando mais que o esperado · [Recarregar]". Gráfico: tooltip declarativo com causa genérica + ação.
Wallet nova / sem histórico Gráfico em cinza com tooltip: "Sem histórico ainda — seu gráfico aparece após a primeira transação." Pills de timeframe: desabilitadas com tooltip "Disponível após a primeira transação". Sem banner de erro (não é falha).
Dado stale (> threshold por tipo) Eyebrow âmbar no big stat: "Atualizado às [HH:MM] · pode estar desatualizado". Botão inline: "[Atualizar]". Sem banner — stale data é menos urgente que falha total.
Recuperação (retry bem-sucedido) Toast verde: "Portfólio atualizado". Banner desaparece. Pills de timeframe reabilitadas. Big stat atualizado sem asterisco. Acontece silenciosamente em background — sem interrupção de fluxo do usuário.
Recuperação parcial (1 de 2 redes recuperadas) Banner reduz de "2 redes com falha" para "1 rede com falha" dinamicamente. Big stat atualiza sem asterisco para rede recuperada, mantém asterisco para rede ainda falhando.
RPC do usuário lento (causa externa) Tooltip do gráfico com diagnóstico diferenciado: "Pode ser sua conexão. · [Testar conexão] · [Recarregar]". Nota contextual: "Se o problema persistir, verifique sua conexão de internet."
| Elemento | Copy |
|---|---|
| Banner falha parcial | [Rede] com atraso · [Recarregar] |
| Banner múltiplas redes | Dados de [N] redes indisponíveis · [Ver detalhes] |
| Banner falha total | Não conseguimos carregar seu portfólio · [Recarregar] · [Ver status] |
| Sub-label big stat parcial | * Sem dados de [Solana] por ora |
| Sub-label timeout skeleton | Demorando mais que o esperado · [Recarregar] |
| Sub-label falha total big stat | — (em vez de número) · [Recarregar] |
| Tooltip gráfico — indexador lento | Histórico de [Rede] com atraso — normalmente resolve em ~30s · [Recarregar] · [Ver status] |
| Tooltip gráfico — wallet nova | Sem histórico ainda — seu gráfico aparece após a primeira transação |
| Tooltip gráfico — causa genérica | Não conseguimos carregar o histórico. Pode ser conexão ou atraso. · [Recarregar] · [Ver status] |
| Tooltip pills desabilitadas | Disponível após os dados carregarem |
| Tooltip pills — wallet nova | Disponível após a primeira transação |
| Banner tab afetada | [Rede] com atraso — mostrando dados parciais |
| Toast recuperação | Portfólio atualizado |
| Eyebrow stale | Atualizado às [HH:MM] · pode estar desatualizado |
| CTA inline stale | Atualizar |
| Tooltip RPC do usuário | Pode ser sua conexão · [Testar conexão] · [Recarregar] |
| Link status externo | Ver status da Kotai ↗ |
[uniswap portfolio-05 § Insight 1]. "Dados do gráfico ausentes" do Uniswap é padrão correto de honestidade visual — Kotai expande com causa + ação + tempo.[uniswap portfolio-05 § Insight 2]. Saldo e gráfico carregam de fontes distintas; dois estados de loading separados reduzem a frustração de "está tudo carregando há 10s".[uniswap-final § Insights — Estados como instrução acionável]. Suprimir o widget é pior que explicá-lo.[pancake-final § Insights — Cobertura proativa de estados não-triviais]. Pancake cobre conexão parcial EVM+Solana como estado de tela dedicada — padrão a herdar na forma de banner por família de rede.[uniswap portfolio-05 § Fricção 1]. Tooltip declarativo com 3 variantes de causa (indexador / wallet nova / causa genérica) + ação + tempo estimado substitui "Dados de saldo do portfólio indisponíveis."[uniswap portfolio-05 § Fricção 2]. Timeout escalonado de 5s para skeleton: skeleton → sub-label âmbar "Demorando mais que o esperado · [Recarregar]". Resolve a contradição de "gráfico declarou erro terminal mas saldo continua em skeleton infinito."[uniswap portfolio-05 § Fricção 3] + [uniswap portfolio consolidado § Fricção estrutural — Affordances interativas ativas em estados onde não funcionam]. Pills desabilitadas com tooltip explicativo — preservam valor pedagógico (controles visíveis) sem custo de clique morto. Restauram ao estado ativo no retry bem-sucedido.[pancake-final § Fricção 1]. "Histórico de Base com atraso" em vez de "Subgraph indisponível"; "Solana com atraso" em vez de "RPC endpoint SVM timeout".[uniswap portfolio-05 § Oportunidade] + [uniswap portfolio consolidado § Oportunidade — Error states com diagnóstico]. Hipótese: "Histórico de Base com atraso — ~30s" converte "produto quebrado" em "problema localizado e temporário" → retenção do iniciante que abandonaria ao ver mensagem genérica. Passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes usam copy genérica de erro (2) ✓ afeta iniciante diretamente (3) ✓ falta de investimento em catálogo de causas (4) ✓ ganho perceptível — o iniciante diferencia "feature com atraso" de "produto quebrado".[uniswap-final § Pilar 4] + [pancake-final § Pilar 6]. Banner por fonte de dado falhante (em vez de banner global único) é a expressão do default contextual no estado de erro — o contexto disponível (EVM respondeu, Solana não) é usado para informar o usuário com precisão.Catálogo de causas exige manutenção contínua: cada nova fonte de dado, cada nova rede, cada novo provider de indexador precisa do seu error state declarado. Custo real. Mitigável com template padronizado de 3 campos (causa, ação, tempo estimado) que qualquer engenheiro preenche ao adicionar nova feature. Regra: error state declarado é bloqueador de PR para features novas com fonte de dado externa.
Diagnóstico errado pode ser pior que copy genérica: se o sistema diagnosticar "indexador com atraso" mas o problema real for na carteira do usuário, a copy misleads. Solução: fallback sempre disponível ("ou pode ser sua conexão — [Testar conexão]") em todas as variantes de tooltip. Diagnóstico correto é melhoria sobre genérico; diagnóstico errado com fallback é neutro.
Banner por fonte de dado falhante pode crescer demais: se 3+ fontes falharem simultaneamente, banner area cresce e comprime o conteúdo útil. Banner condensa após N=2 falhas simultâneas em mensagem agregada "Dados de [N] redes indisponíveis · [Ver detalhes]" com expansão inline. N=2 é heurístico — ajustar por viewport (mobile condensa em N=1).
Retry automático em background (30s) tem custo de RPC: desabilitar para carteiras com muitas redes quando app está em background (Page Visibility API). Em foreground: retry ativo. Em background: suspend e retomar ao foreground.
Stale data threshold é arbitrário: preços em DeFi mudam a block time (~12s); dado de 5 min pode ser irrelevante. Definir thresholds distintos por tipo de dado (preço: 2 min; gráfico: 5 min; atividade: 10 min) e expor como configuração avançada no settings para intermediário que precisa de dados frescos.
Notação do big stat com asterisco: asterisco como indicador de "dado incompleto" é convenção de relatórios financeiros, não de apps mobile. Alternativa: eyebrow de cor âmbar + tooltip explicativo. Testar ambos via A/B; priorizar legibilidade em mobile (asterisco pode ser difícil de tocar).
Permite ao usuário iniciante BR/LatAm adicionar fundos à carteira Kotai através de caminhos reconhecíveis e funcionais no contexto local — PIX/TED como on-ramp primário, Mercado Bitcoin/Binance BR como transferência de CEX — em vez do paradigma global-first (Moonpay + Coinbase) que é teatral para o target. Consolida os 3 cards de funding do Uniswap (Compre criptos / Receber criptos / Transferência) em um único modal organizado por intenção, com detecção de locale. Foco: iniciante (principal — primeiro funding é a barreira mais concreta entre ele e a primeira operação real).
Header do modal
X fechar à direita.Seção 1 — Comprar com reais (ação de menor fricção para iniciante sem cripto)
Seção 2 — Transferir de uma corretora (para usuário com conta em CEX)
↗ Abre fora do Kotai.Seção 3 — De outra carteira (link, não seção expandida)
Rodapé
↗ padronizado para todos os cards que redirecionam para OAuth/URL externa.↗ em todos os cards externos: qualquer card que redireciona para OAuth/URL externa recebe badge ↗ Abre fora do Kotai. Diferencia affordance local (endereço copiado, ação local) de integração externa (sai do produto).Usuário sem saldo (estado inicial típico) Seção 1 (Comprar) em destaque. Header: "Adicionar fundos". PIX como card principal (locale BR). Cards de CEX visíveis abaixo.
Usuário com saldo existente (adicionando mais) Header: "Adicionar mais fundos". Ordem das seções idêntica — não inflar as opções só porque saldo existe.
Loading de providers disponíveis Skeleton de 2 cards em Seção 1 e 2 simultaneamente. Copy acima: "Carregando opções disponíveis para você…" Timeout em 5s: fallback para lista estática de providers conhecidos com nota "Taxa pode variar — confirme no parceiro".
Provider de on-ramp indisponível Card sombreado + badge cinza "Temporariamente indisponível". Fallback automático para próximo provider. Se todos os providers de PIX indisponíveis: seção 1 exibe Cartão como único card disponível + nota "PIX temporariamente indisponível — tente em alguns minutos".
Locale não detectado ou VPN Layout global: Cartão como card principal, sem badge "Mais popular no Brasil". Botão "Estou no Brasil →" visível como ação secundária no rodapé.
Handoff em andamento — usuário volta ao app Banner âmbar no topo do modal: "Operação via [Parceiro] em andamento · Iniciada às [HH:MM] · [Ver status]". Nova operação não bloqueada — usuário pode iniciar outra se quiser.
Handoff concluído (webhook ou polling bem-sucedido) Toast verde: "Fundos adicionados! Seu saldo foi atualizado." Banner de handoff dismissível automaticamente. Saldo no portfólio atualizado sem reload.
Handoff timeout (30 min sem confirmação) Banner âmbar muda para: "Sua operação pode estar pendente. Se você pagou e o saldo não atualizou, [Pedir ajuda]." Não declara erro — pagamento pode estar em processamento.
Erro de OAuth de CEX Toast âmbar: "Não conseguimos conectar ao [CEX]. [Tentar de novo] [Usar endereço manual]". Link "Usar endereço manual" abre portfolio-04.
CEX do usuário não listada "Não vejo minha corretora →" expande: lista completa de suportadas + instrução "Minha corretora não está na lista" → instrução genérica de saque + link para portfolio-04 com nota contextual.
| Elemento | Copy |
|---|---|
| Título do modal | Adicionar fundos |
| Título quando saldo > 0 | Adicionar mais fundos |
| Subtítulo | Escolha como quer financiar sua carteira |
| Label Seção 1 | Comprar com reais |
| Card PIX | PIX ou transferência bancária |
| Sub-label PIX | Taxa estimada: ~1,5% · Instantâneo |
| Badge PIX | Mais rápido e barato no Brasil |
| Card Cartão | Cartão de crédito ou débito |
| Sub-label Cartão | Taxa estimada: ~3–5% |
| Nota de conversão | Pague em reais e receba cripto direto na sua carteira |
| Label Seção 2 | Transferir de uma corretora |
| Sub-label por CEX | Transfer em ~[X] min · taxa de saque da corretora |
| Badge externo | ↗ Abre fora do Kotai |
| Link CEX ausente | Não vejo minha corretora → |
| Label Seção 3 | Receber de outra carteira ou rede → |
| Rodapé locale | Fora do Brasil? Ver opções internacionais › |
| Botão locale inverso | Estou no Brasil → |
| Banner handoff ativo | Operação via [Parceiro] em andamento · Iniciada às [HH:MM] · [Ver status] |
| Banner handoff timeout | Sua operação pode estar pendente. Se você pagou, [Pedir ajuda]. |
| Toast sucesso | Fundos adicionados! Seu saldo foi atualizado. |
| Erro OAuth | Não conseguimos conectar ao [CEX]. [Tentar de novo] [Usar endereço manual] |
| Provider indisponível | Temporariamente indisponível |
| Loading providers | Carregando opções disponíveis para você… |
| CEX não listada — instrução | Não encontrou sua corretora? Use o endereço de recebimento manual → |
| Pedir ajuda | Precisa de ajuda? |
[uniswap portfolio-04 § Insight 2] + [uniswap portfolio-06 § Insight 3] + [uniswap portfolio consolidado § Insights — Suporte contextual dentro de modais sensíveis]. Affordance de ajuda no momento de maior risco — não no footer global.[uniswap portfolio consolidado § Microcopy na linguagem mental do usuário] + [uniswap portfolio-06 § Insight 2]. Iniciante BR lê "corretora" e reconhece; "CEX" é jargão da indústria.[uniswap portfolio-06 § Insight 1]. CEX section exibe apenas integrações funcionais; provider indisponível recebe badge de estado, não é removido da lista.[pancake-final § Pilar 4 — Transparência proativa antes do CTA] + [pancake-final § Insights — Transparência proativa antes do CTA]. Breakdown "provedor / plataforma / câmbio" como precedente; Kotai implementa taxa estimada visível inline no card.[uniswap-final § Insights — Defaults agregados que respeitam modelo mental] + [pancake-final § Pilar 6 — CTA dinâmico + Default contextual]. Contexto disponível (saldo = 0) informa a hierarquia de seções.[uniswap portfolio consolidado § Insights — Empty state convertido em instrução acionável]. Se usuário chega sem saldo, modal não é decorativo — cada seção entrega instrução concreta com CTA.[uniswap portfolio consolidado § Fricção estrutural — Exclusão geográfica nos pontos de entrada de funding]. On-ramp local-first (PIX/TED como card principal) + CEX BR detectadas por locale substitui on-ramp global + Coinbase-only que são teatrais para usuário BR.[uniswap portfolio-06 § Fricção 2]. CEX section com Mercado Bitcoin + Binance BR para locale BR. Link de escape para usuário cuja CEX não está listada.[uniswap portfolio-06 § Fricção 1]. Modal com 3 seções distintas, cada uma com pelo menos 2 opções reais, justifica o nível de modal.[uniswap portfolio-06 § Fricção 3]. Badge ↗ Abre fora do Kotai em todos os cards que redirecionam para OAuth/URL externa — distingue affordance local de integração externa.[uniswap-final § Fricção 9 — handoff sem rastro] + [pancake-final § Fricção 8 — abandono em handoff]. Banner persistente "Operação em andamento via [Parceiro] · [Ver status]" visível no app mesmo após o usuário fechar o modal. Polling passivo a cada 30s.[uniswap-final § Fricção 4]. Locale detectado por IP/browser informa a hierarquia de providers — não apresentar lista global genérica para usuário BR quando o sistema já tem o sinal de locale.[uniswap portfolio consolidado § Oportunidade — On-ramp e CEX local-first] + [pancake-final § Pilar 7 — Mobile-first + Localização BR/LatAm como infraestrutura] + [uniswap-final § Pilar 1 — Localização BR/LatAm como infraestrutura]. Hipótese de diferenciação: PIX como método default para BR + CEX BR como opção principal converte o caminho "teatral" do Uniswap (onde o usuário BR não reconhece nenhum caminho funcional e abandona) em fluxo que o usuário BR reconhece na primeira tela. Passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes usam on-ramp global / CEX US-centric (2) ✓ afeta iniciante BR diretamente — é o ponto de entrada de funding (3) ✓ falta de investimento em integrações locais (4) ✓ ganho perceptível: PIX em segundos vs cartão internacional com 3–7% de taxa.[pancake-final § Pilar 4 — Educação contextual + Transparência financeira]. Taxa estimada visível inline no card antes do clique elimina a surpresa de taxa no flow do parceiro. Hipótese: usuário que vê "~1,5%" antes de clicar tem expectativa calibrada e conclui o flow com menor taxa de abandono pós-clique.[uniswap-final § Pilar 1 — Localização BR/LatAm] (item "faixa persistente de compra em andamento"). Banner de handoff com polling transforma a experiência de "paguei no PIX, sumiu no ar" em "compra em andamento via [Parceiro] · iniciada às [HH:MM]" — reduz suporte e abandono no período de espera.Detecção de locale via IP: VPN users veem layout incorreto → fallback "Fora do Brasil? Ver opções internacionais ›" mitiga. Custo: 1 botão de override sempre visível. Edge case: usuário BR em VPN estrangeira perde PIX como default; edge case inverso (estrangeiro em IP BR) vê PIX como default sem utilidade.
Fee estimada como promessa implícita: "~1,5%" pode criar expectativa que o parceiro não entrega (taxa real pode variar por volume, método, regulação). Usar sempre "Taxa estimada: a partir de ~X%" + tooltip "Confirmada pelo parceiro no momento da operação". Documentar claramente que é estimativa.
Cada integração de CEX tem custo recorrente: APIs mudam, KYC muda, compliance muda por jurisdição. MVP: Mercado Bitcoin + Binance BR + Coinbase (3 integrações); escalar conforme adoção validada. Não adicionar CEX que ainda não está integrada — viola o princípio de não fingir features.
Polling de handoff: 30s interval em foreground, suspend em background (Page Visibility API). Stop após 30 min sem confirmação com mensagem de fallback para suporte. Risco de false negative: confirmação pode chegar após 30 min (delay de rede, delay de PIX em horário de pico). Opção: manter banner âmbar indefinidamente após 30 min (em vez de remover) com copy de fallback — usuário que recebeu ignora; usuário que não recebeu usa o link de suporte.
Ordem das seções (Comprar / Transferir / Outra carteira): Seção 3 como link em vez de seção expandida reduz comprimento do modal mas adiciona 1 clique extra para o caminho de recebimento manual. Para iniciante sem saldo, a intenção mais provável é comprar — Seção 3 como link é correto. Para usuário retornante com saldo em outra wallet, Seção 3 deveria ser mais acessível. Avaliar: se métricas pós-lançamento mostrarem alta taxa de clique em Seção 3, considerar promovê-la para seção expandida.
i18n: fee labels, nomes de CEX, tempos de transfer e copy de handoff precisam de revisão por locale (PT-BR, ES-MX, ES-AR, etc.). O template de banner de handoff com variáveis [Parceiro] e [HH:MM] precisa validação de formatação de hora por locale (PT-BR: 14:32; ES: 14:32; EN-US: 2:32 PM).
Cross-modal com portfolio-04: Seção 3 (link "Receber de outra carteira") e link de escape de CEX ausente ambos abrem portfolio-04. Garantir que fechar portfolio-04 retorna para este modal (não para a tela de portfólio) — contexto de navegação preservado.
Tela de revisão final antes do commit on-chain — o usuário vê um sumário completo e imutável da posição que será criada (par, modo, valores, faixa de preço se Concentrada, custo total, APR estimado e risco de Impermanent Loss) e confirma conscientemente antes de qualquer token se mover. Foco: ambos iniciante e intermediário — o iniciante recebe pedagogia de risco no ponto de maior tensão; o intermediário encontra todos os dados para auditar sem precisar abrir outra tela.
a) Stepper horizontal "Par e modo" (✓ completo) | "Configurar" (✓ completo) | "Confirmar" (ativo — passo atual). Botão "← Editar" ao lado do stepper retorna para T02 ou T03 conforme o modo da posição, preservando todos os valores já preenchidos. Nunca destrói o formulário anterior.
b) Mini-card de identidade do pool (sticky no topo) Par + modo em label de benefício + fee tier + rede + badge de atividade compacto. Exatos mesmos dados e estilo que T02/T03 — design system estabelecido. Nunca removido durante a revisão. Em pool inativo: badge vermelho compacto ("Pool inativa") sem possibilidade de colapso.
c) Bloco de parâmetros da posição (estrutural — leitura do que foi configurado) Read-only. Nenhum campo editável. Cada linha tem label em PT-BR + valor + equivalente R$ quando aplicável.
Para modo Concentrada (V3/V4):
Para modo Simples (V2) e Par correlacionado (StableSwap):
d) APR estimado com caveat obrigatório "~X,X% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ" — idêntico ao padrão obrigatório de T02/T03 e do design system Kotai. Tooltip do ⓘ idêntico ao de T03: decomposição do APR em linguagem de usuário com aviso de IL. Esta linha nunca é omitida.
e) Aviso de Impermanent Loss contextual (condicional — aparece para par não-correlacionado) Banner amarelo (não modal) com ícone ⚠: uma linha de texto + accordion "Entender o risco ▾" que expande sem sair da tela. Aparece apenas quando o modo não é "Par correlacionado" (StableSwap). Para o par correlacionado, o aviso é substituído por nota positiva: "StableSwap minimiza Impermanent Loss para este par."
Conteúdo do accordion expandido: explicação de IL em 3 frases, em linguagem de usuário, sem jargão de AMM. Nunca tem "Não mostrar novamente" — aviso Tier 2 no fluxo de LP.
f) Card de custo total (linha-soma fechada — mesmo padrão de T02/T03)
Total a depositar: R$ X.XXX,XX
Gas estimado: ~R$ XX,XX [atualizar ↻]
──────────────────────────────────
Você paga agora: R$ X.XXX,XX
Sub-label: "O total depositado permanece seu na posição — o gas é cobrado separadamente pela rede." Se aprovações necessárias: nota adicional abaixo — "Gas da aprovação: ~R$ XX,XX por token (cobrado antes desta etapa)."
g) Linha de slippage "Tolerância de slippage: Auto (X,X%) · [Ajustar →]". Link "Ajustar →" retorna para T02/T03 preservando todos os valores, com scroll automático para o componente de slippage. Read-only na T04 — para mudar, o usuário edita na tela anterior.
h) CTA principal Label dinâmico conforme o estado de aprovação:
Disabled até: mini-card carregado + dados de gas disponíveis. Nunca verde — confirmar aporte não é ação destrutiva, mas é comprometimento financeiro irreversível. Cor primária brand (azul), não verde de validação.
Read-only estrito: Nenhum campo na T04 é editável. Toda edição obriga retorno para T02/T03 via "← Editar". Dados passados por parâmetro do formulário anterior — nunca re-carregados da rede (evita discrepância silenciosa entre o que o usuário configurou e o que a tela exibe). Exceção: gas estimado, que é atualizado on-demand via botão "Atualizar ↻".
Gas estimado: Carregado ao entrar na T04 com TTL de 60s. Após TTL, badge âmbar: "Gas pode ter mudado · Atualizar ↻". CTA mantido habilitado — o usuário pode confirmar com estimativa desatualizada; o gas real na confirmação pode ser diferente. Ao submeter, o gas real é o cobrado pela rede, não necessariamente o estimado.
APR com dados insuficientes: Para pools com < 30 dias de histórico: "APR estimado: dados insuficientes para este pool. O rendimento dependerá do volume futuro."
Pool inativa detectada: Mini-card exibe badge "Pool inativa" em vermelho compact. O aviso de pool inativa de T02/T03 persiste aqui como lembrete — o usuário não pode ter "esquecido" entre as telas, mas a fricção é mantida consistente com o padrão estabelecido. CTA muda label: "Adicionar mesmo assim" (laranja). Sem delay aqui — o delay de 1,5s foi em T02; no T04, o usuário já demonstrou intenção consciente ao chegar até a revisão.
Aprovações necessárias: Se um ou ambos os tokens precisam de aprovação para o contrato LP da Kotai: nota no card de custo + label do CTA reflete. Ao clicar no CTA com aprovações pendentes, avança para T05 (aprovação proativa), não executa o aporte diretamente.
Sem aprovações necessárias: Ao clicar no CTA "Confirmar aporte", avança diretamente para T06 (resultado), pulando T05. O fluxo T05 é opcional e condicional — não aparece quando não é necessário.
Gas insuficiente: CTA: "Saldo de gas insuficiente · Comprar [moeda da rede] →" (laranja). Link abre on-ramp contextualizado para a moeda nativa da rede ativa.
Loading (chegando de T02/T03): Skeleton no card de custo (gas sendo carregado) e no APR estimado (se não veio em cache). Mini-card com dados já disponíveis — não bloqueia render. CTA disabled durante loading. Se > 3s: "Carregando estimativas de custo..."
Gas desatualizado (> 60s): Badge âmbar "Gas pode ter mudado" no card de custo. Botão "Atualizar ↻" para refresh manual. CTA habilitado para o usuário que aceita o risco de gas diferente.
Pool inativa: Mini-card expandido com badge vermelho "Pool inativa". CTA laranja "Adicionar mesmo assim". Aviso de IL contextual para par volátil + aviso de pool inativa formam dois banners separados — não colapsam em um. Prioridade visual: pool inativa > IL risk.
Par incompatível confirmado pelo usuário em T01/T03: Banner âmbar discreto no topo do bloco de parâmetros: "⚠ Você escolheu continuar com par não-correlacionado em modo [StableSwap / Correlacionado] — o risco de IL é maior neste modo." Não é novo aviso — é lembrete do que o usuário já confirmou. Sem CTA de escape aqui — o usuário precisa usar "← Editar" se mudar de ideia.
Gas insuficiente: CTA laranja com label "Saldo de gas insuficiente · Comprar [ETH / BNB] →". Sub-label: "Gas necessário estimado: ~R$ XX,XX · Você tem: R$ YY,YY."
Dados do pool offline (RPC lento): Mini-card exibe "Dados do pool indisponíveis" com badge âmbar. APR estimado: "— (dados offline)". Card de custo: gas estimado mantido do cache (com badge de idade do dado). CTA habilitado com aviso inline: "Confirmar com dados possivelmente desatualizados."
Sucesso / avanço: Se aprovações necessárias → avança para T05. Se sem aprovações → avança para T06 com os parâmetros da posição como payload (par, modo, valores, tx hash pendente).
Título da tela:
"Revisar aporte"
Breadcrumb:
"Ganhar rendimento / Adicionar liquidez / Revisar"
Botão de edição:
"← Editar configuração"
Label do bloco de parâmetros:
"Resumo da posição"
Eyebrow de modo:
"Modo: Simples e passiva" / "Modo: Concentrada em um intervalo" / "Modo: Par correlacionado"
Faixa de preço (concentrada):
"Faixa de preço: R$ XX,XX – R$ YY,YY" "Preset: Equilibrado · ~70% do tempo in-range"
APR com caveat:
"~X,X% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ"
Tooltip APR:
"Baseado nas taxas coletadas nos últimos 30 dias. Não inclui Impermanent Loss — a diferença de valor entre manter os tokens e fornecê-los. O Impermanent Loss pode reduzir ou zerar este retorno dependendo da variação de preço."
Aviso de Impermanent Loss (banner amarelo, par volátil):
"⚠ Ao fornecer liquidez em [Token A]/[Token B], o valor dos seus tokens pode cair se os preços divergirem — isso é chamado de Impermanent Loss." [Entender o risco ▾]
Accordion IL expandido:
"Impermanent Loss acontece quando o preço de um token muda em relação ao outro depois que você depositou. Quanto maior a divergência, maior a perda potencial. As taxas do pool podem compensar — mas não há garantia. É um risco estrutural de qualquer posição de liquidez em par de ativos voláteis."
Nota positiva StableSwap (substitui aviso de IL):
"✓ O modo Par correlacionado minimiza Impermanent Loss para pares como [Token A]/[Token B] — ativos que se movem em conjunto."
Card de custo — labels:
"Total a depositar" "Gas estimado · [Atualizar ↻]" "Você paga agora" "O total depositado permanece seu na posição — o gas é cobrado separadamente pela rede."
Nota de gas por aprovação:
"Gas da autorização: ~R$ XX,XX por token (cobrado antes desta etapa)"
Linha de slippage:
"Tolerância de slippage: Auto (X,X%) · [Ajustar →]"
CTA — sem aprovações:
"Confirmar aporte"
CTA — com aprovações:
"Autorizar tokens e adicionar liquidez"
CTA — pool inativa:
"Adicionar mesmo assim"
CTA — gas insuficiente:
"Saldo de gas insuficiente · Comprar [ETH / BNB] →"
Gas desatualizado:
"Gas pode ter mudado · Atualizar ↻"
Sub-label gas insuficiente:
"Gas necessário: ~R$ XX,XX · Você tem: R$ YY,YY"
Lembrete par incompatível confirmado:
"⚠ Você escolheu continuar com [Token A]/[Token B] em modo Correlacionado — o risco de Impermanent Loss é maior do que em par estável."
[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico e contextual]adicionar-liquidez-02, adicionar-liquidez-03, visualizar-pool-04 no design system Kotaicriar-pool-03 e adicionar-liquidez-02 no design system Kotaisuas-posicoes, criar-pool, adicionar-liquidez-02, adicionar-liquidez-03)[pancake-final § Transparência proativa antes do CTA]; padrão cross-fluxo do design system Kotai[uniswap-visualizar-pool.md § Insight — Sinalização de risco/variação in-place sem friction transacional][pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência] + Pilar 3 Kotai — CTAs destrutivos nunca como primário verde; comprometimento financeiro segue o mesmo princípio[uniswap-nova-posicao.md § Insight 3 — Feedback visual explícito de estado]; label "← Editar configuração" sinaliza consequência da ação antes do clique[pancake-final § Insight — Transparência proativa antes do CTA] (fee total + breakdown explicitados antes do commit, incluindo gas de aprovação separado do gas de LP) e de [pancake-final § Pilar 4 — Educação contextual sistêmica + transparência financeira ativa] (linha-soma fechada de custo total como padrão do design system); reforçado por [uniswap-nova-posicao.md § Fricção 2 — Ausência de estado do pool destino na janela de decisão de aporte] (princípio: nenhuma informação financeira relevante oculta no fluxo de LP)[uniswap-visualizar-pool.md § Fricção — APR 0,00% mudo em fonte gigante] + [uniswap-final § Fricção 6 — Métricas DeFi sem decomposição]; APR sem IL é promessa falsa — na revisão final, é o último ponto em que o usuário pode calibrar expectativa antes de aportar[uniswap-nova-posicao.md § Fricção 2 — Ausência de estado do pool destino na janela de decisão] e [uniswap-visualizar-pool.md § Fricção — Desacoplamento widget↔contexto da pool no ato de decidir][pancake-adicionar-liquidez.md § Oportunidade 3 — Validação par↔protocolo inline antes do aporte][uniswap-nova-posicao.md § Oportunidade 2 — Card de pré-visualização do pool destino antes do depósito] + [pancake-adicionar-liquidez.md § Fricção Estrutural 1 — Seleção de protocolo como caixa-preta sem pedagogia]. O Pancake não tem tela de revisão entre a seleção de filtro de pool e a execução — o usuário comete o aporte sem tela de checkpoint. O Uniswap tem o Continuar da Etapa 2, mas sem decomposição de custo. A Kotai entrega revisão explícita com custo e risco — diferencial de confiança para iniciante. Hipótese: usuário que vê custo total + aviso de IL antes do commit tem taxa de abandono menor por "surpresa de gas" e taxa de posição bem-formada maior.[uniswap-visualizar-pool.md § Oportunidade — Narrativa automática dos dados em 3 níveis]. A narrativa narrativa de APR e IL integrada à tela de revisão — não acessível apenas via doc externo — diferencia a Kotai de todos os concorrentes analisados. Hipótese: iniciante que lê "quanto maior a divergência, maior a perda potencial" no momento de confirmação tem expectativa mais calibrada no primeiro mês de LP.Tela adicional no fluxo: T04 é uma tela inteiramente nova entre configuração e execução — não existe equivalente explícito no Pancake nem no Uniswap como tela separada. O risco é atrito de "mais uma tela" que pode elevar abandono entre T03 e a execução. Mitigação: a tela é lean — poucos componentes, nenhuma decisão nova, CTA proeminente. O abandono por "surpresa de custo" (gas inesperado) ou "surpresa de risco" (IL desconhecido) após a execução é mais custoso ao produto do que abandono preventivo em T04.
Gas estimado vs real: A estimativa de gas em T04 é heurística — o gas real cobrado pela rede no momento de execução pode ser diferente. O label "~R$ XX,XX" e o sub-label "cobrado separadamente pela rede" sinalizam que é estimativa, não garantia. Risco residual: usuário com saldo de gas exatamente igual ao estimado pode falhar a transação. Mitigação: estimativa conservadora (pegar percentil 75 do gas estimado, não a mediana).
Accordion de IL: Mais conteúdo em tela já densa. Decisão de deixar colapsado por default (apenas "Entender o risco ▾" visível) reduz carga visual para o intermediário que já entende IL; o iniciante que precisar expandir tem o conteúdo disponível sem sair da tela. O accordion é colapsado por default — não expandido forçado — porque a presença do banner amarelo já cumpre o papel de sinalização; o texto detalhado é opt-in.
Dois banners simultâneos (pool inativa + IL para par volátil): Em pools inativas com par volátil, os dois banners co-existem na tela. Risco de "banner blindness" quando há dois avisos ao mesmo tempo. Hierarquia: pool inativa (vermelho, topo do bloco de parâmetros) tem prioridade visual sobre IL contextual (amarelo, abaixo do APR). O usuário pode ver ambos sem conflito — são riscos diferentes, não duplicados.
i18n: Accordion de IL + linha de slippage + nota de gas de aprovação = 6–8 strings adicionais por idioma. Custo de manutenção real quando novas moedas de rede forem adicionadas (gas em ETH/BNB/MATIC etc. exige strings diferentes). Mitigação: componente de card de custo com prop de "moeda de gas" — não hardcoded.
Converter o momento de maior risco de abandono — wallet conectada, portfólio zerado — em instrução acionável para o primeiro aporte, priorizando o caminho mais curto e mais natural para o usuário iniciante BR/LatAm: PIX como porta de entrada financeira, "Receber de outra carteira" como alternativa imediata.
Perfil-foco: iniciante BR/LatAm (primary). Intermediário que já tem cripto em outro lugar também se beneficia, mas é usuário secundário desta tela.
Header patrimonial
Pills de período [1h / 1d / 7d / 30d / 1a / Tudo]
Área do gráfico
Cards de jornada (3 caminhos, empilhados verticalmente em mobile, grid 3 colunas em desktop)
| Posição | Título | Sub-label BR |
|---|---|---|
| 1º | "Comprar com fiat" | "via PIX · taxa est. 1,5%" |
| 2º | "Receber de outra carteira" | "Transferência sem custo entre carteiras" |
| 3º | "Trazer de uma exchange" | "De Mercado Bitcoin, Binance, Bitso e outras" |
Sub-label não-BR do card 1: "Cartão de crédito ou débito · taxas variam" Sub-label não-BR do card 3: "De Coinbase, Binance e outras"
Tabs de navegação [Tokens / NFTs / Atividade]
/portfolio/tokens, /portfolio/nfts, /portfolio/atividadeTab Tokens — empty state
Tab NFTs — empty state
Tab Atividade — empty state
Seletor de rede:
Pills de período:
Cards de jornada — detecção de locale:
navigator.language + IP geolocalização (fallback para navigator.language se GeoIP indisponível).CTA da Tab Tokens → Portfolio-03:
Propagação de estado:
Vazio (estado principal desta tela)
Desconectado (sem wallet)
Loading (carregando saldos on-chain após conexão)
Erro (falha de RPC ou indexador)
Erro parcial (EVM ok, Solana falhou)
Sucesso (primeiro aporte detectado)
Seletor de rede (tooltip disabled):
"Disponível após o primeiro aporte"
Pills de período (tooltip disabled):
"Disponível após o primeiro aporte"
Cards de jornada (locale BR):
Tab Tokens — empty:
"Adicione tokens para começar a acompanhar seu portfólio" CTA: "Receber tokens" Tooltip disabled search: "Disponível após adicionar tokens"
Tab NFTs — empty:
"Adicione NFTs para acompanhar sua coleção" CTA: "Receber NFTs"
Tab Atividade — empty (copy causal, sem CTA):
"Quando você fizer transações, elas aparecerão aqui" Tooltip disabled filtros: "Disponível após a primeira transação"
Estado desconectado:
Título: "Acompanhe seu portfólio" Sub-título: "Conecte sua carteira para ver seus ativos" CTA primário: "Conectar carteira" Link secundário: "Primeira vez em cripto? Crie sua carteira →"
Estado de erro:
Header: "Dados temporariamente indisponíveis · [Tentar novamente]" Gráfico: "Dados do gráfico indisponíveis · [Tentar novamente]" Erro parcial banner: "Não conseguimos carregar dados de [rede X]. Seu portfólio pode estar incompleto. [Tentar novamente]" Patrimônio parcial: "~R$X.XXX,XX · estimativa parcial ⓘ"
Toast de sucesso:
"Primeiro aporte detectado!"
[uniswap-portfolio § Insight — Empty state convertido em instrução acionável, telas 1–3][uniswap-portfolio § Insight — Microcopy na linguagem mental do usuário][uniswap-portfolio § Insight — Declaração de erro/ausência > silêncio, tela 8][uniswap-portfolio § Insight — Controles de descoberta visíveis, telas 2, 8–10]/portfolio/tokens, /portfolio/nfts, /portfolio/atividade). [uniswap-portfolio § Observação — Consistência URL por tab][pancake-carteira-conectada § Insight — Empty state como jornada estruturada, tela 1][uniswap-portfolio § Fricção 1 — Affordances interativas ativas em estados onde não funcionam][uniswap-portfolio § Fricção 3 — Gap entre instrução do empty state e CTA correspondente][uniswap-portfolio § Fricção — Exclusão geográfica nos dois pontos de entrada de funding][uniswap-portfolio § Oportunidade — On-ramp e CEX local-first][uniswap-portfolio § Oportunidade — Error states com diagnóstico + ação]Dois estados visuais por componente (disabled / enabled):
Detecção de locale para on-ramp PIX:
navigator.language. Se ambos falham, mostrar on-ramp global sem copy de taxa.Polling de 30s:
URLs por tab:
Copy causal na Tab Atividade (sem CTA):
Tela proativa de autorização de tokens — aparece entre T04 (revisão) e T06 (resultado) somente quando um ou ambos os tokens ainda não foram aprovados para o contrato LP da Kotai. Transforma uma etapa técnica opaca (token allowance) em sub-passo pedagógico nomeado e rastreável: o usuário sabe quantas autorizações são necessárias, quanto custa cada uma, e o que acontecerá quando todas estiverem completas. Foco: iniciante que interpreta a janela de aprovação da carteira como perda de tokens, e intermediário que quer confirmar o que está autorizando antes de assinar.
a) Stepper horizontal com sub-progresso "Par e modo" (✓) | "Configurar" (✓) | "Confirmar" (ativo — em andamento). O label "Confirmar" exibe um indicador de sub-passo discreto abaixo dele: "(Passo X de N)". Exemplo: se dois tokens precisam de aprovação e nenhum foi concluído: "(Passo 1 de 3)"; após primeira aprovação: "(Passo 2 de 3)"; após ambas: "(Passo 3 de 3)". A lógica de N é calculada no carregamento de T05: N = número de aprovações pendentes + 1 (a transação final de LP).
b) Barra de progresso de sub-passos (estrutural — âncora visual principal) Sequência horizontal de chips conectados por linha de progresso:
[✓ Par e modo] ── [✓ Configurar] ── [● Autorizar Token A] ── [○ Autorizar Token B] ── [○ Adicionar liquidez]
Chip ativo: círculo azul sólido com label. Chip pendente: círculo outline cinza com label. Chip completo: ✓ verde. Se apenas 1 token precisa de aprovação: a barra omite o chip do token já aprovado — mostra apenas os passos reais. Barra fica sticky abaixo do stepper principal.
c) Card de ação atual — Autorização (estrutural — conteúdo dinâmico por passo) O card muda conforme o sub-passo ativo. Três seções no card:
Seção 1 — O que está sendo autorizado:
Seção 2 — Custo desta etapa:
Seção 3 — Status da carteira:
d) CTA principal — "Autorizar [Token A] na carteira" Label dinâmico com nome do token. Ao clicar, abre o modal de assinatura da carteira. Durante assinatura: CTA desabilitado com label "Aguardando assinatura...". Após assinatura: CTA desabilitado com label "Aguardando confirmação da rede...". Após confirmação on-chain: CTA transita automaticamente para o próximo sub-passo (sem clique adicional do usuário) ou para T06 se era o último passo.
e) Rodapé informativo — Gas total desta etapa Abaixo do card de ação, discreto: "Gas estimado desta etapa: ~R$ XX,XX · Você ainda pagará R$ YY,YY pelo aporte após as autorizações." Mantém o usuário informado do custo total, não apenas do sub-passo.
Condicionalidade: T05 só aparece se pelo menos um dos tokens precisar de aprovação para o contrato LP. Se nenhum token precisa de aprovação (já foram aprovados em sessão anterior para este contrato), o fluxo vai de T04 diretamente para T06, pulando T05. Verificação de allowance feita no carregamento de T04 (background, para não criar delay em T05).
Sequência de aprovações: Uma aprovação por vez — não solicitar assinatura de múltiplas aprovações simultaneamente. Token A primeiro, Token B segundo (ordem alfabética por símbolo ou pela ordem dos campos em T02/T03). Após confirmação on-chain de cada aprovação, o card atualiza automaticamente para o próximo token pendente.
Valor de aprovação:
Aprovação pelo valor exato do aporte (não aprovação de "quantidade ilimitada" / uint256_max). Sub-label explicativo: "A autorização é limitada ao valor que você vai depositar agora — o protocolo não pode movimentar mais do que este montante." Justificativa: modelo de menor permissão, mais seguro para o usuário, e pedagogicamente correto para ensinar o que é uma aprovação.
Rejeição da assinatura: Se o usuário rejeitar a assinatura na carteira: card volta para o estado "aguardando assinatura" com nota âmbar: "Autorização cancelada. Toque em 'Autorizar' para tentar novamente." CTA reabilitado. Não retorna para T04 automaticamente — o usuário decide se tenta novamente ou usa "← Voltar à revisão".
Falha na rede: Se a transação de aprovação falhar on-chain (reverted): mensagem de erro específica no card + CTA "Tentar novamente" + link "Ver erro no explorador →". Não avança para próximo sub-passo.
Timeout de confirmação (> 3 minutos): Banner âmbar: "A confirmação está demorando mais que o usual — pode ser congestionamento na rede." Sub-label: "Você pode aguardar ou aumentar o gas e tentar novamente." Botão "Ver no explorador →" disponível. Não retorna para T04 automaticamente — a TX pode ainda confirmar.
Avanço automático: Após a última aprovação confirmada on-chain, T05 transita automaticamente para T06 com a execução da transação de LP. A transação de LP é submetida programaticamente sem novo clique do usuário — elimina a fricção de "clique para confirmar" após já ter clicado em "autorizar". O card de ação atualiza para mostrar a transição: "Autorizações concluídas · Adicionando liquidez..."
Vazio (ao entrar em T05): Barra de sub-passos carregada. Card de ação mostrando o primeiro token pendente no estado "aguardando assinatura". CTA habilitado. Gas estimado visível.
Aguardando assinatura na carteira: CTA desabilitado com label "Aguardando assinatura...". Ícone de carteira animado no card. Se a carteira não abriu automaticamente (pop-up bloqueado em desktop): nota "Se a janela da carteira não abriu, clique no ícone da sua carteira."
Aprovação submetida (TX na rede): CTA desabilitado com label "Aguardando confirmação da rede..." + spinner. Hash da TX visível + link "Ver →". O chip do sub-passo atual mostra animação de loading.
Aprovação confirmada (avança para próximo): Chip do sub-passo atual muda para ✓ verde. Card de ação transita para o próximo token pendente com animação suave. Se era o último: card muda para "Autorizações concluídas · Adicionando liquidez..." + spinner da TX de LP.
Aprovação rejeitada (usuário cancelou na carteira): Banner âmbar no card: "Autorização cancelada. Toque em 'Autorizar' para tentar novamente." CTA reabilitado. Sem retorno automático para T04 — o usuário escolhe.
Aprovação falhou (TX revertida): Banner vermelho no card com mensagem específica. CTA "Tentar novamente" + link de explorer. Sub-label: "A autorização não foi registrada na rede — seus tokens não foram movidos."
Timeout (> 3 min): Banner âmbar: "Confirmação demorando mais que o usual." Link "Ver no explorador →". Sem retorno automático.
Todas as aprovações concluídas → transitando para LP: Card mostra estado de loading da TX de LP: "Adicionando liquidez..." + spinner. A barra de sub-passos atualiza para o chip "Adicionar liquidez" como ativo.
Navegação retroativa: Botão "← Voltar à revisão" disponível o tempo todo (exceto enquanto TX está submetida na rede). Retorna para T04 com todos os parâmetros preservados. Aprovações já confirmadas não precisam ser repetidas na próxima tentativa.
Título da tela:
"Autorizar tokens"
Breadcrumb:
"Ganhar rendimento / Adicionar liquidez / Autorizar"
Headline do card de autorização:
"Autorizar [Token A]"
Explicação de o que está sendo autorizado:
"Você está autorizando o contrato de liquidez da Kotai a movimentar [X,XXXX Token A] em seu nome." "Esta autorização é necessária para adicionar seus tokens ao pool. Você mantém controle total — pode revogar quando quiser."
Sub-label de valor limitado:
"A autorização é pelo valor exato do seu aporte — o protocolo não pode movimentar mais do que este montante."
Gas da aprovação:
"Gas desta autorização: ~R$ XX,XX" "Cada autorização é uma transação separada na rede."
Status aguardando assinatura:
"Confirme esta autorização na sua carteira [MetaMask / WalletConnect]"
CTA — aguardando:
"Autorizar [Token A] na carteira"
CTA — submetendo:
"Aguardando assinatura..."
CTA — confirmando na rede:
"Aguardando confirmação da rede..."
Após aprovação confirmada:
"✓ [Token A] autorizado"
Barra de sub-passos — labels:
"Autorizar [Token A]" / "Autorizar [Token B]" / "Adicionar liquidez"
Progresso numérico:
"Etapa 1 de 3 concluída"
Rodapé de custo total:
"Gas total desta etapa: ~R$ XX,XX · Você ainda pagará ~R$ YY,YY pelo aporte"
Link de explorer:
"Ver transação →"
Pop-up não abriu:
"Se a janela da carteira não abriu, clique no ícone da sua carteira no navegador."
Rejeição do usuário:
"Autorização cancelada. Toque em 'Autorizar' para tentar novamente."
Falha de rede:
"A autorização não foi registrada na rede. Seus tokens não foram movidos." [Tentar novamente] [Ver erro no explorador →]
Timeout:
"A confirmação está demorando mais que o usual — pode ser congestionamento na rede." [Aguardar] [Ver no explorador →]
Transição para LP após aprovações:
"✓ Autorizações concluídas · Adicionando liquidez..."
Botão de retorno:
"← Voltar à revisão"
criar-pool-04 do design system Kotai; referenciado em adicionar-liquidez-02 e adicionar-liquidez-03 como comportamento prometido[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico e contextual]; o stepper não "some" durante aprovações — a progressão do fluxo maior permanece visível[pancake-final § Transparência proativa antes do CTA]; "Autorizar [Token A] na carteira" nomeia o token e a ação exatos[pancake-final § Cobertura proativa de estados não-triviais]; estado não enumerado = estado que vira bug em produção[uniswap-visualizar-pool.md § Insight — Dados on-chain inline sem desvio para explorer externo]; princípio simétrico: quando a TX está no explorer, o link pertence à tela[pancake-final § Pilar 3 — Defesa em camadas + Hierarquia de toggle]; cancelamento é sinal de incerteza — não redirecionar silenciosamente[pancake-final § Insight — Transparência proativa antes do CTA] (gas total e breakdown explicitados antes do commit como padrão de transparência financeira) e de [pancake-final § Pilar 4 — Educação contextual sistêmica + transparência financeira ativa]; o usuário precisa saber que aprovações custam gas separado antes de gastar — não depois de ver o saldo de gas mais baixo que o esperado[pancake-final § Fricção 1 — Léxico de protocolo como vocabulário primário]; "token allowance" e "approve()" são jargão de Solidity, não linguagem do usuário[pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência]; ação de cancelamento tem consequência que o sistema deve nomear, não tratar como estado vazio[pancake-final § Pilar 4 — Educação contextual + Transparência financeira] e [uniswap-nova-posicao.md § Insight 2 — Microcopy pedagógica inline]. O iniciante que entende "o protocolo pode mover exatamente X tokens e não mais" tem modelo mental correto de segurança de DEX — diferencial de confiança sobre concorrentes que mostram a janela de aprovação sem contexto. Hipótese: taxa de abandono durante aprovação ("achei que ia perder os tokens") cai com copy explicativo antes da janela da carteira.[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico] aplicado ao nível de sub-passo. Nenhum DEX analisado exibe a sequência de aprovações + LP como progresso visual antes de começar. Hipótese: usuário que sabe "são 3 etapas e estou na 1ª" não abandona na 2ª aprovação por acreditar que o processo não termina.uint256_max): sem precedente nos consolidados como opção de UX documentada explicitamente. O princípio âncora é [pancake-final § Pilar 3 — Defesa em camadas] (Pilar 3 Kotai — menor permissão por default é mais seguro; o template de Expert Mode mostra que a Pancake aplica defesa em camadas, mas não generalizou para aprovações de token), porém a decisão específica de expor aprovação por valor exato como UX principal é nova — nenhum dos concorrentes analisados documenta esta opção como padrão. Justificativa: aprovação ilimitada é padrão de indústria por conveniência (o usuário não precisa aprovar de novo na próxima operação), mas cria surface area de segurança desnecessária. Para o target iniciante da Kotai, a conveniência de "não precisa aprovar de novo" é menos valiosa do que a garantia de "o protocolo só move o que você autorizou agora". O custo é uma aprovação adicional na próxima operação com o mesmo par. Evidência a coletar: taxa de reclamações de segurança relacionadas a aprovações ilimitadas vs taxa de abandonos por "ter que aprovar de novo". Decisão revisável por release.Aprovação por valor exato: Cria dívida de UX para operações futuras — na próxima vez que o usuário adicionar liquidez com o mesmo par, precisará aprovar novamente se o valor for diferente. Concorrentes que usam uint256_max eliminam essa fricção futura. Mitigação de segunda ordem: ao aprovar, oferecer ao usuário avançado um toggle "Aprovação estendida (não precisar aprovar de novo)" — mas defaultar no valor exato para o iniciante. Esse toggle seria Tier 2 (preferência) na hierarquia de toggles do Pilar 3.
Avanço automático após aprovações: Se o usuário tiver mudado de ideia (ex: o preço do token mudou significativamente entre T04 e o final de T05), não terá janela de confirmação adicional antes da TX de LP. Mitigação: botão "← Voltar à revisão" disponível durante a confirmação das aprovações. Aceitar o risco residual — a TX de LP com parâmetros previamente revisados em T04 é o comportamento correto; o usuário que quiser mudar de ideia tem o escape disponível.
Barra de sub-passos em mobile: em viewport estreito (< 375px), chips de sub-passo podem ser muito densos. Mitigação: em mobile, exibir apenas o chip ativo como texto ("Passo 2 de 3: Autorizar [Token B]") sem a linha completa de chips conectados. A versão completa da barra aparece apenas em desktop e tablets.
Gas por aprovação vs gas real: Estimativa de gas para aprovação de token varia por contrato (ERC-20 com lógica adicional como fee-on-transfer pode ter gas mais alto). Mitigação: estimativa conservadora (percentil 90 do gas de approve() para os contratos conhecidos) com label "~R$" sinalizando estimativa. Contratos desconhecidos (tokens importados por endereço): fallback "Gas estimado: variável — depende do contrato do token."
i18n: 12–15 strings dinâmicas (token name, valor, gas em R$, número de etapas). Componente de card de autorização com props de conteúdo — não hardcoded. Moeda de gas varia por rede (R$ com ETH/BNB/MATIC como denominador), exigindo oracle de preço disponível para cada rede ativa.
Dar ao usuário com ativos uma visão clara e honesta do que tem — distinguindo o valor declarado pelo mercado do valor efetivamente realizável (saída estimada) — com drill-down por rede e por tipo de ativo, sem agregar números que escondem escopo nem exibir affordances que não funcionam.
Perfil-foco: iniciante e intermediário. Iniciante precisa da honestidade sobre liquidez; intermediário multi-chain precisa do seletor de rede com hierarquia útil.
Header patrimonial dual
Seletor de rede — 3 seções internas (ao abrir o dropdown)
Pills de período [1h / 1d / 7d / 30d / 1a / Tudo] — ATIVAS
Gráfico de patrimônio
Tabs de navegação [Tokens / NFTs / Atividade]
/portfolio/tokens, /portfolio/nfts, /portfolio/atividadeTab Tokens — lista de ativos
Tab NFTs — lista de coleções
Tab Atividade — lista de transações
Seletor de rede — label ao selecionar:
"Todas as redes ([N] com saldo)" → nenhuma rede específica selecionada"[Nome da Rede] ✓" → rede específica selecionada (nunca permanece texto genérico)Segunda linha de token (saída estimada):
saída_estimada < declarado * 0,95 (diferença > 5%)Patrimônio declarado vs saída estimada no header:
Default de período por maturidade da wallet:
Seleção de rede — curadoria "Não suportadas":
Populado (estado principal desta tela)
Loading de atualização de preços (preços sendo refrescados)
Erro de preço de token específico
Erro de gráfico
Seleção de rede sem saldo
Portfólio com 1 token apenas (saída estimada = declarada)
Saída estimada indisponível (> 30% dos tokens sem liquidez calculada)
Filtro de atividade retorna zero resultados
Header patrimonial:
"Patrimônio declarado""Saída estimada ⓘ""Se vendesse todos os ativos agora, com base nas rotas de melhor preço disponíveis. Pode diferir do declarado em ativos com baixa liquidez.""Atualizado às [HH:MM] · [Atualizar]"Seletor de rede:
"Todas as redes ([N] com saldo)""[Nome da Rede] ✓""Suas redes" / "Outras redes suportadas" / "Não suportadas nesta versão""[Nome da Rede] · não suportada nesta versão"Segunda linha de token (liquidez limitada):
"Saída estimada · ~R$XX ⓘ · liquidez limitada""Estimativa de quanto você receberia ao vender agora, via melhor rota disponível. Liquidez limitada significa que há poucos compradores para este ativo."Header com filtro de rede ativo:
"Patrimônio em Ethereum · R$X.XXX,XX""Ethereum ✓" no botão de redeErro de gráfico:
"Dados do gráfico temporariamente indisponíveis · [Tentar novamente]"Erro de preço de token:
"⚠ Preço indisponível""~R$X.XXX,XX · estimativa parcial ⓘ"Empty state de rede selecionada sem saldo:
"Nenhum ativo em [Ethereum]""Receber ativos em Ethereum"Filtro de atividade com zero resultados:
"Nenhuma transação corresponde aos filtros. Você tem [N] transações no histórico completo. [Ver todas]"Estimativa indisponível (> 30% sem cálculo):
"Saída estimada · parcialmente disponível ⓘ""Não foi possível calcular a saída estimada para parte do portfólio."[uniswap-portfolio § Insight — Controles de descoberta visíveis, telas 2, 8–10][uniswap-portfolio § Insight — Declaração de erro/ausência > silêncio, tela 5][uniswap-portfolio § Observação — Consistência URL por tab][uniswap-portfolio § Insight — Decisão correta tela 7][pancake-final § Pilar 5 — Mobile-first interaction][uniswap-final § Pilar 2 — CTA dinâmico + Default contextual] [uniswap-portfolio § Fricção — default Todo o período inadequado para wallet madura, tela 10][uniswap-portfolio § Fricção 2 — Agregações sem escopo declarado][uniswap-portfolio § Fricção — Seletor de rede ambíguo e sem feedback de estado, tela 11][uniswap-portfolio § Fricção — Filtro temporal sem date picker, tela 10][uniswap-portfolio § Fricção — filtro de tipos radio, tela 9][uniswap-portfolio § Oportunidade — Portfólio com valor recuperável vs declarado][uniswap-portfolio § Oportunidade — Seletor de rede contextualizado]Cálculo de saída estimada (custo de RPC + routing):
Seletor de rede "Não suportadas":
Duas grandezas no hero:
Filtros multi-select na Tab Atividade:
Default contextual por maturidade de wallet:
Tela de feedback pós-submit — cobre todos os estados após a transação de LP ter sido enviada à rede: pendente (aguardando confirmação on-chain), sucesso (posição criada com resumo e próximas ações) e erro (falha diagnosticada com recovery específico). Funciona como encerramento narrativo do fluxo de 6 telas: do par selecionado em T01 à posição confirmada em T06. Foco: iniciante que precisa saber se "funcionou" sem interpretar mensagens técnicas de blockchain; intermediário que quer o hash da TX, link de explorer e o estado final da posição.
a) Stepper horizontal — finalizado "Par e modo" (✓) | "Configurar" (✓) | "Confirmar" (em andamento — spinner discreto). O stepper permanece visível e comunica: "o processo não acabou, mas está no último passo."
b) Indicador visual de progresso — hero component Animação circular de loading com os dois avatares de token sobrepostos no centro (mesmo ícone combinado de par do mini-card). Cor: azul brand em progressão circular (não spinner genérico — é o par do usuário).
c) Headline e sub-headline Headline: "Registrando sua posição..." Sub-headline: "Sua transação foi enviada — aguardando confirmação na rede [Nome da Rede]."
d) Card de transação
0xAB12...CD34 com ícone de cópia ⬡ e link "Ver no explorador →" (abre nova aba)e) Contexto pedagógico de blockchain (colapsado por default, accordion "Saiba mais ▾") "Transações em blockchain são processadas em blocos — cada bloco leva ~12 segundos no Ethereum, ~3 segundos na BNB Chain. Em períodos de congestionamento, pode levar mais tempo." Não exibir forçado — é complementar para quem está curioso, não obrigatório para completar o fluxo.
f) Ação disponível durante pendência Link discreto (não CTA proeminente): "Você pode fechar esta tela. Sua transação continuará sendo processada. [Ver no explorador →]" Sub-label: "Sua posição aparecerá em 'Minhas posições' assim que confirmada."
a) Stepper horizontal — concluído "Par e modo" (✓) | "Configurar" (✓) | "Confirmar" (✓). Todos verdes.
b) Feedback visual de sucesso — hero component Ícone de sucesso animado (✓ verde com expansão suave) + ícone combinado de par. Sem confetes excessivos — produto financeiro exige seriedade, não celebração de gamificação. Efeito discreto de pulse verde.
c) Headline
"Posição criada com sucesso"
d) Card de resumo da posição criada (estrutural — dados da posição real)
e) CTAs de continuidade (hierarquia clara)
visualizar-posicao passando o ID da posição criadaf) Link de explorer "Ver transação confirmada →" — abaixo do card de resumo, discreto. Não CTA.
a) Feedback visual de erro — hero component Ícone de erro (× vermelho, não animado — erros não são celebrados) + ícone do par.
b) Headline + diagnóstico específico Headline e sub-headline variam por tipo de erro:
Slippage excedido:
"Transação não executada — slippage excedido" "O preço mudou mais do que sua tolerância de slippage (X,X%) enquanto a transação estava na rede. Seus tokens não foram movidos."
Gas insuficiente (TX revertida por falta de gas):
"Transação não executada — gas insuficiente" "A transação precisou de mais gas do que o estimado. Seus tokens não foram movidos."
TX revertida (outro motivo):
"Transação revertida pelo protocolo" "O protocolo não conseguiu executar o aporte. Seus tokens não foram movidos."
Usuário cancelou na carteira:
"Transação cancelada" "Você cancelou a transação na carteira. Seus tokens não foram movidos."
Timeout (TX não confirmada em X minutos):
"Transação sem confirmação" "A transação está demorando mais que o esperado — pode ter ficado pendente na rede. Verifique no explorador."
c) Card de recovery contextual (cada tipo de erro tem ação específica)
Slippage excedido → ação contextual:
Gas insuficiente → ação contextual:
TX revertida → ação contextual:
Usuário cancelou → ação contextual:
Timeout → ação contextual:
d) Garantia de não-perda de fundos Para todos os tipos de erro exceto timeout: nota de destaque — "✓ Nenhum token foi debitado da sua carteira." Para timeout: nota cautelosa — "Verifique no explorador antes de tentar novamente."
Tratado como sub-caso do Estado C, com diferença no aviso: "Suas autorizações foram confirmadas — não será necessário repetir esse passo ao tentar novamente." Recovery idêntico ao Estado C pelo tipo de erro da TX de LP.
Transição de estados: T06 começa no Estado A (pendente) assim que a TX de LP é submetida à rede. A tela escuta eventos da rede para a TX hash específica:
pending → Estado Aconfirmed (receipt com status 1) → Estado Bconfirmed (receipt com status 0 / reverted) → Estado C, com diagnóstico do erroRetry com parâmetros preservados: Todo CTA "Tentar novamente" retorna para T04 com os parâmetros exatos da última tentativa: par, modo, valores, faixa (se Concentrada), slippage (possivelmente ajustado). Nunca retorna para T01 — o usuário não perdeu o trabalho de configuração.
Slippage sugerido no retry: Para erros de slippage excedido: calcular o slippage real da TX que falhou e sugerir o teto mínimo que teria passado + margem de 0,5%. Exibir como pré-ajuste ao retornar para T04, com nota "Ajustamos o slippage para X,X% com base na volatilidade recente deste pool." O usuário pode mudar antes de confirmar novamente.
Status in-range na posição criada (Concentrada): Badge de in-range/fora da faixa na posição criada é calculado com o preço atual no momento de exibição do Estado B — pode ser diferente do preço no momento do aporte se houve movimento durante o processamento. Se fora da faixa: banner âmbar: "O preço saiu da faixa configurada enquanto a transação era processada. Você não ganhará taxas até o preço retornar — considere ajustar a faixa." CTA "Ver posição" continua como primário.
Gas total pago: No Estado B, exibe o gas real total do fluxo: gas de aprovações + gas de LP. Não o gas estimado — o real. Para o usuário que comparou estimativa vs real ao longo do fluxo, esta linha encerra o ciclo.
"Ver no explorador" sempre disponível: Link de explorer presente em todos os estados de T06 — pendente, sucesso e erro. Em estados de pendência ou timeout: é o canal primário de verificação. Em estado de sucesso: é complemento para o intermediário que audita a TX.
Pendente (nominal): Animação de loading. TX hash + link de explorer. Mensagem de contexto pedagógico colapsada. Link "Você pode fechar esta tela" disponível.
Pendente por mais de 2 minutos: Banner âmbar aparece: "A confirmação está demorando mais que o usual. Pode ser congestionamento na rede ou gas muito baixo." Link de explorer destacado. Sem timeout automático ainda.
Pendente por mais de 5 minutos (timeout): Transição para Estado C — tipo timeout. Aviso de cautela antes de retry.
Sucesso com posição in-range (nominal): Estado B descrito acima. Badge verde "● In-range".
Sucesso com posição fora da faixa (Concentrada): Estado B + banner âmbar adicional: "O preço saiu da faixa configurada — você não ganhará taxas até o preço retornar." CTA primário "Ver posição →" mantido; link "Ajustar faixa →" como ação secundária imediata.
Sucesso com pool inativa (APR ≈ 0): Estado B + nota discreta abaixo do resumo: "Este pool tem baixa atividade — o rendimento de taxas pode ser próximo de zero enquanto o volume não aumentar." Sem banner — o usuário foi avisado múltiplas vezes nas telas anteriores; aqui é apenas lembrete.
Erro — slippage excedido: Estado C com diagnóstico de slippage + CTA de retry com slippage pré-ajustado. Nota de não-perda de fundos.
Erro — gas insuficiente: Estado C com gas estimado vs real + CTA de compra de gas.
Erro — TX revertida (outro motivo): Estado C com link de explorer para diagnóstico técnico + CTA de retry.
Erro — usuário cancelou: Estado C com CTA "Retomar aporte" proeminente — usuário tem caminho claro de volta.
Confirmação parcial (aprovações OK, LP falhou): Estado C com nota "Autorizações mantidas — não precisará repeti-las ao tentar novamente."
Fechamento da tela antes da confirmação: Se o usuário fechar T06 enquanto a TX está pendente, a posição aparecerá em "Minhas posições" assim que confirmada. Na próxima vez que abrir o app: toast "Sua posição [Token A]/[Token B] foi criada." com link "Ver posição →".
Título da tela (estado pendente):
"Confirmando aporte..."
Título da tela (estado sucesso):
"Posição criada"
Título da tela (estado erro):
"Transação não executada"
Headline pendente:
"Registrando sua posição..."
Sub-headline pendente:
"Sua transação foi enviada — aguardando confirmação na rede [Nome da Rede]."
Accordion pedagógico:
"Por que demora? ▾" "Transações em blockchain são processadas em blocos. Na BNB Chain, cada bloco leva ~3 segundos; no Ethereum, ~12 segundos. Em períodos de alta demanda na rede, pode levar mais. Você não precisa manter a tela aberta."
Link "fechar tela" durante pendência:
"Você pode fechar esta tela — sua transação continuará sendo processada." "Sua posição aparecerá em 'Minhas posições' assim que confirmada."
Card TX:
"Transação: 0xAB12...CD34 ⬡ [Ver no explorador →]"
Headline sucesso:
"Posição criada com sucesso"
Card resumo — labels:
"Par e modo: [USDC/ETH] · Concentrada em um intervalo" "Aportado: X,XXXX USDC + X,XXXX ETH (≈ R$ X.XXX,XX)" "Faixa: R$ XX,XX – R$ YY,YY" "APR estimado: ~X,X% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ" "Status: ● In-range" "Gas total pago: R$ XX,XX"
Badge in-range:
"● In-range — você está ganhando taxas"
Badge fora da faixa:
"● Fora da faixa — o preço saiu do intervalo configurado"
Banner fora da faixa:
"O preço saiu da faixa configurada enquanto a transação era processada. Você não ganhará taxas até o preço retornar — considere ajustar a faixa."
CTAs sucesso:
"Ver minha posição →" (primário) "Adicionar mais liquidez" (secundário) "Voltar ao início" (link terciário)
Link de explorer — sucesso:
"Ver transação confirmada →"
Headline erro — slippage:
"Transação não executada — slippage excedido"
Sub-headline erro — slippage:
"O preço mudou mais do que sua tolerância de slippage (X,X%) enquanto a transação estava sendo processada. Seus tokens não foram movidos."
CTA retry slippage:
"Tentar novamente com slippage maior (Y,Y%)"
Headline erro — gas:
"Transação não executada — gas insuficiente"
Sub-headline erro — gas:
"A transação precisou de mais gas do que o estimado. Seus tokens não foram movidos."
CTA retry gas:
"Comprar [ETH / BNB] para gas →"
Headline erro — cancelado:
"Transação cancelada"
Sub-headline erro — cancelado:
"Você cancelou a transação na carteira. Seus tokens não foram movidos."
CTA retry cancelado:
"Retomar aporte"
Headline erro — timeout:
"Transação sem confirmação"
Sub-headline erro — timeout:
"A transação está demorando mais que o esperado. Verifique no explorador antes de tentar novamente para evitar aporte duplo."
Nota de não-perda de fundos:
"✓ Nenhum token foi debitado da sua carteira."
Nota de autorizações mantidas:
"Suas autorizações foram confirmadas — não será necessário repeti-las ao tentar novamente."
Toast de posição criada (retorno ao app):
"✓ Sua posição [Token A]/[Token B] foi criada. [Ver posição →]"
[uniswap-nova-posicao.md § Insight 3 — Feedback visual explícito de estado]; o produto deve comunicar o estado sem o usuário ter que inferir; os três headlines distintos (pendente / sucesso / erro) aplicam este princípio[pancake-final § Cobertura proativa de estados não-triviais]; estado não enumerado em produção vira bug de suporte; os 5 tipos de erro (slippage / gas / revertida / cancelada / timeout) cobrem os casos reais de falha de TX on-chain[uniswap-visualizar-pool.md § Insight — Dados on-chain inline sem desvio para explorer externo]; o princípio simétrico se aplica ao resultado: quando a TX já está no explorador, o link pertence à tela de resultado[pancake-final § Transparência proativa antes do CTA]; o CTA pós-sucesso não é decorativo — direciona a próxima intenção do usuário[pancake-final § Fricção 1 — Léxico de protocolo como vocabulário primário]; mensagens como "execution reverted: STF" são jargão de Solidity, não comunicação para usuário; cada tipo de erro recebe headline em linguagem natural + causa + confirmação de não-perda de fundos[uniswap-nova-posicao.md § Fricção 1 — Versão como caixa-preta sem pedagogia]; obrigar o usuário a reconfigurar tudo após um erro de slippage é solução pior que o problema (A3) — o erro foi da rede, não da configuração do usuário[pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência] + [pancake-final § Pilar 4 — Educação contextual]; em produto financeiro, confirmação de "seus tokens estão seguros" após falha é obrigação de confiança, não polish — todos os concorrentes analisados omitem esta confirmação explícita[pancake-final § Insight — Transparência proativa antes do CTA] (fee total e breakdown explicitados antes e após o commit) e de [pancake-final § Pilar 4 — Educação contextual sistêmica + transparência financeira ativa]; a diferença entre gas estimado e gas real é informação financeira relevante, especialmente para redes congestionadas onde o gas real pode ser significativamente maior[uniswap-nova-posicao.md § Oportunidade 3 — Slippage adaptativo ao par/pool] estendido ao recovery de erro. Nenhum DEX analisado calcula e sugere o slippage mínimo necessário baseado no erro real da TX. Hipótese: usuário que recebe "Tente novamente com X,X%" tem taxa de sucesso no retry maior do que usuário que ajusta slippage manualmente (que tende a errar para cima por excesso de segurança ou para baixo por subestimar a volatilidade).[uniswap-visualizar-pool.md § Insight — Sinalização de risco/variação in-place]. Posição concentrada pode ficar fora da faixa durante o processamento se o mercado se mover. Mostrar o status real da posição no momento da confirmação — e a ação sugerida se estiver fora da faixa — diferencia o produto de DEXs que exibem o sucesso sem o estado real da posição criada. Hipótese: usuário que vê "● Fora da faixa — você não está ganhando taxas" imediatamente após o sucesso toma ação de ajuste de faixa com menor delay, reduzindo capital ocioso.[pancake-final § Pilar 4 — Educação contextual no ponto de decisão]. A ansiedade durante pendência de TX é causa de retries prematuros (usuário que submete de novo achando que "travou"). O accordion disponível — sem forçar leitura — responde à pergunta sem aumentar cognitive load para quem não precisa da explicação. Hipótese: taxa de retries prematuros (antes do timeout) cai com o accordion disponível.Complexidade da máquina de estados: T06 é a tela de maior complexidade de estados do fluxo — 5 variações (pendente, pendente-timeout, sucesso, sucesso-fora-de-faixa, erro × 5 tipos). Cada estado tem headline, sub-headline, card e CTA distintos. Risco: inconsistência de implementação entre estados, especialmente nos estados de erro raramente testados. Mitigação: especificação de microcopy por tipo de erro como parte desta proposta (não deixar para copywriting posterior); testes de integração cobrindo os 5 tipos de erro em staging.
Slippage sugerido no retry: Calcular o slippage mínimo necessário baseado no erro real da TX exige acesso ao preço real no momento da execução e à profundidade do pool no momento do erro — dados que podem não estar disponíveis se o indexador estiver lento. Fallback: sugestão de slippage atual + 1% se não houver dados do erro real. Aceitar o fallback — é melhor que não sugerir nada.
Badge in-range / fora da faixa: Exige preço atual no momento de exibição do Estado B — que pode ser diferente do preço no momento do aporte (TX processou enquanto o preço se movia). Risco de "falso positivo fora da faixa" se o preço saiu brevemente e voltou. Mitigação: calcular in-range com o preço spot atual, não com o preço histórico do bloco da TX — o que importa para o usuário é o estado atual, não o histórico.
Toast no retorno ao app: Exige persistência local do hash de TX pendente + listener de confirmação em background. Em mobile, service workers são menos confiáveis; in-app notification pode não disparar se o usuário não der permissão. Fallback: ao abrir o app, verificar TXs pendentes na sessão anterior e exibir o resultado na próxima tela que o usuário visitar (não necessariamente como toast — pode ser inline na tela de Minhas Posições).
Múltiplas superfícies de sucesso: o mesmo sucesso de posição pode ser visto em T06, em "Minhas posições" e em notificações. Evitar discrepância de dados entre essas superfícies — todas devem exibir o mesmo estado da posição no mesmo instante. Requer design de estado compartilhado (não re-fetch por surface).
i18n: Headline e sub-headline por tipo de erro = 10+ strings adicionais por idioma. Strings dinâmicas (token name, gas em R$, slippage percentual) exigem interpolação em todos os idiomas. Custo de manutenção real — cada novo tipo de erro adiciona strings. Mitigação: componente de "card de erro" com props de conteúdo (headline, sub-headline, CTA, nota) — não hardcoded por tipo de erro na camada de view.
Eliminar o principal vetor de perda não-maliciosa em DeFi para iniciantes — envio de token na rede errada — guiando o usuário pela escolha de token + rede antes de exibir o endereço, em vez de entregar endereço cru e transferir o risco de "rede certa" para o usuário ou para quem vai enviar.
Perfil-foco: iniciante (primary). Intermediário que usa múltiplas redes também se beneficia, mas o fluxo padrão é projetado para quem pode não saber o que é "rede" ou "endereço EVM".
O fluxo é um bottom sheet de 2 passos que se expande sobre Portfolio-01 ou Portfolio-02 (contexto preservado ao fundo — Pilar 5, progressão sem perda de contexto).
Header do sheet
Campo de busca de token
Lista de tokens — 2 seções:
| Seção | Conteúdo |
|---|---|
| "Seus tokens" | Tokens que o usuário já tem na wallet, com saldo inline — mostra que o mesmo endereço serve |
| "Populares" | Tokens com maior volume de entrada na rede conectada (USDC, ETH, BNB…) |
Seleção de token → expansão de redes disponíveis
CTA do Passo 1
Link para modo avançado
Header do sheet
Badge de identidade da operação (sticky no topo do conteúdo)
QR Code
Endereço formatado
Aviso de rede (sempre visível, nunca tooltip hover-only)
Badge de rede (sempre visível)
CTAs do Passo 2
Toggle de modo avançado (somente após opt-in no Passo 1)
Filtro de redes por token:
Badge "Recomendada":
Aviso de rede — regra de exibição:
"Compartilhar pedido" — estrutura do deep link:
Modo avançado (skip de seleção token+rede):
Rede pré-selecionada (entrada via CTA contextual):
Variante NFT:
Passo 1 — vazio (sem busca)
Passo 1 — busca sem resultados
Passo 1 — token selecionado, carregando redes disponíveis
Passo 1 — token selecionado, 0 redes disponíveis
Passo 2 — endereço carregado (estado principal do Passo 2)
Passo 2 — erro de geração de endereço
Passo 2 — modo avançado ativo
Passo 2 — "Compartilhar pedido" (após toque)
Variante NFT — aviso de padrão:
Header Passo 1:
"Receber criptos · Passo 1 de 2"
Instrução Passo 1:
"Escolha o token e a rede antes de compartilhar seu endereço."
Placeholder de busca:
"Buscar token… (ex: USDC, ETH)"
Badge de rede no accordion:
"Recomendada · [N]% das transações de entrada nos últimos 30 dias""[Nome da Rede] · gas de entrada ~R$[X]"CTA Passo 1 (dinâmico):
"Escolha um token""Escolha a rede""Continuar"Link modo avançado:
"Mostrar só o endereço (modo avançado) ↗"
Modal modo avançado (Tier 2):
"Você está saindo do fluxo guiado." "Sem o guia, você precisará informar a rede corretamente para quem vai enviar. Fundos enviados na rede errada podem ser perdidos permanentemente." — [Cancelar] (primário, azul) · [Continuar sem guia] (secundário, laranja)
Header Passo 2:
"Seu endereço em [Nome da Rede]"
Link de retorno:
"← Passo 1"
Badge de identidade (sticky):
"[ícone TOKEN] em [ícone REDE] [Nome da Rede]"
Aviso de rede (sempre visível, nunca tooltip):
"Envie apenas [TOKEN] em [REDE]. Fundos enviados em outras redes podem ser perdidos permanentemente."
Badge de rede:
"Endereço válido em [REDE] · Não use em outras redes"
CTA primário Passo 2:
"Compartilhar pedido de [TOKEN] em [REDE]"
CTA secundário (link):
"Receber outro token"
Checkbox modo avançado:
"Copiar só o endereço (sem contexto de rede)" Sub-label: "Quem receber precisará saber a rede corretamente"
Badge de modo avançado (âmbar, sempre visível):
"⚠ Modo direto ativo — informe a rede corretamente para quem vai enviar"
Ajuda contextual (header, Passo 1 e 2):
"📧 Pedir ajuda"
Erro de busca sem resultado:
"Nenhum token encontrado para '[X]'. Verifique o nome ou símbolo correto."
Erro de geração de endereço:
"Não foi possível gerar seu endereço. [Tentar novamente]"
Texto de "Compartilhar pedido" (MVP, via compartilhamento nativo):
"Me envie [USDC] em [Polygon] para o endereço: 0xABCD…1234" (inclui rede explicitamente — elimina risco de rede errada na outra ponta)
Variante NFT — aviso de padrão:
"Seu endereço EVM recebe NFTs ERC-721 e ERC-1155 nesta rede. Confirme com quem vai enviar que a coleção usa esses padrões."
[uniswap-portfolio § Insight — Suporte contextual dentro de modais de ação sensível, telas 4 e 6][uniswap-final § Insight — Copy preventiva que declara o porquê / o que NÃO acontece][uniswap-portfolio § Insight — Microcopy na linguagem mental do usuário] [pancake-final § Pilar 1 — Naming system][pancake-final § Pilar 5 — Mobile-first interaction][pancake-final § Insight — CTAs descrevem o bloqueio com causa específica] [pancake-final § Fricção 10 — CTA disabled silencioso sem comunicar o gap][pancake-final § Pilar 2 — Defesa em camadas universal] [pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência][pancake-final § Pilar 7 — Curadoria opinionada + Modo avançado opt-in][uniswap-portfolio § Fricção — Vetor de perda por token-rede mismatch, tela 4][pancake-carteira-conectada § Fricção — Endereço sem identificador de rede, telas 5, 6, 8] [pancake-final § Fricção 4 — Endereço/agregação sem identificador de rede][pancake-final § Fricção 3 — Listas e controles sem hierarquia de consequência][uniswap-portfolio § Fricção 3 — Gap entre instrução do empty state e CTA correspondente][uniswap-portfolio § Oportunidade — Receber como fluxo guiado token-rede-first][pancake-carteira-conectada § Oportunidade — Receive como pedido de pagamento estruturado][uniswap-portfolio § Oportunidade — Error states com diagnóstico + ação]2 passos em vez de 1 (adição de 1 clique no caminho feliz):
Mapa token → redes com emissão verificada:
Accordion de redes inline no Passo 1:
Badge "Recomendada" baseado em dados de 30d:
"Compartilhar pedido" via compartilhamento nativo:
Aviso âmbar de rede permanentemente visível:
Modal/bottom sheet que aparece quando o par selecionado em T01 tem dois ou mais pools disponíveis (fee tiers distintos, tipos de AMM distintos, ou ambos) — permitindo que o usuário compare e escolha o pool correto antes de configurar o aporte, com cada opção descrita por consequência financeira e não por terminologia de AMM. Foco: iniciante que não sabe o que "0,3%" significa em termos de retorno esperado, e intermediário que quer ver dados de saúde antes de comprometer capital.
a) Header fixo "Escolher pool para [Token A]/[Token B]" + ícone combinado do par (sobreposição dos dois avatares) + botão × no canto direito (fecha o modal e mantém o par selecionado em T01, com o pool recomendado como seleção padrão). Sub-label: "N pools disponíveis nesta rede."
b) Cards de pool comparativos — componente central Um card por pool disponível, empilhados verticalmente. Ordenados por TVL decrescente por default. Cada card contém, em hierarquia:
c) Badge "Recomendado para este par ✓" Exibido no card do pool que o sistema recomendou em T01 (mesma heurística de T01 — não muda ao entrar no modal). O badge é explicativo, não apenas ornamental: tooltip "Recomendado com base na liquidez disponível e no perfil do par." Card recomendado fica no topo da lista, independente de sort.
d) Controles de ordenação (secondary, no canto superior direito do modal) Dois sort buttons: "Mais liquidez" (default) / "Maior rendimento". Sort afeta apenas a ordem dos cards não-recomendados — o recomendado permanece no topo. Botões de sort sem dropdown — dois estados simples.
e) Banner de aviso contextual (condicional — aparece em cenários específicos) Pool com APR > 200%: badge âmbar "Rendimento atípico ⓘ" inline no card. Tooltip: "APR muito acima da média pode indicar incentivo temporário ou baixa liquidez — o rendimento tende a cair à medida que mais capital é aportado." Não bloqueia seleção; sinaliza antes do clique.
Trigger: T07 é acionado de T01 quando:
Seleção padrão ao abrir: O pool recomendado pelo sistema está visualmente destacado (card com borda de destaque + badge), mas não é "confirmado" — o usuário precisa clicar "Selecionar este pool" ou fechar o modal (×) para aceitar a recomendação como está.
Fechamento sem seleção: Se o usuário fecha o modal via × sem clicar em nenhum CTA: o pool recomendado permanece como seleção padrão em T01. Não há "nenhum pool selecionado" — a recomendação do sistema serve como fallback.
Seleção de pool não-recomendado: Ao selecionar um pool diferente do recomendado: o modal fecha, o health card de T01 atualiza com os dados do pool escolhido, e o badge no health card muda de "Recomendado ✓" para "Selecionado ✓ (Taxa de X,XX%)". O usuário pode abrir T07 novamente para trocar.
Ordenação: Sort "Mais liquidez": TVL decrescente. Sort "Maior rendimento": APR decrescente. Em ambos os casos, o pool recomendado permanece no topo — a ordenação aplica apenas aos demais pools.
Pool inativo (Vol/TVL < 0,001): Card exibido por último na lista (mesmo com sort por rendimento), com badge vermelho "Pool inativa". Não removido da lista — não bloquear seleção consciente. A posição no final da lista é o sinal de dissuasão, não o bloqueio.
Propagação de dados para T01/T02/T03: Ao selecionar um pool, o ID do pool selecionado propaga para T01 e, na sequência, para T02/T03. O formulário de configuração usa os parâmetros do pool selecionado (fee tier para cálculos, liquidez para slippage estimado).
Loading (ao abrir o modal): Skeleton nos cards. Spinner no indicador de "N pools disponíveis". Se > 3s: "Buscando pools disponíveis... pode levar alguns segundos."
1 pool disponível (não abre modal): T07 não é renderizado. Em T01, o health card exibe "Único pool disponível para este par nesta rede" e o usuário avança diretamente para T02/T03.
Todos os pools inativos: Banner âmbar no topo do modal: "Todos os pools para [Token A]/[Token B] estão com baixa atividade — o rendimento de taxas pode ser próximo de zero. Você pode prosseguir ou escolher outro par." CTA de seleção de todos os cards muda para "Selecionar mesmo assim" (laranja). Não bloqueia — alerta com saída explícita.
Pool com APR atípico (> 200%): Badge âmbar "Rendimento atípico ⓘ" no card, inline. Tooltip com explicação. CTA "Selecionar este pool" mantido em estilo normal — o badge já comunica o risco.
Erro de dados (RPC lento): Modal exibe mensagem central: "Não foi possível carregar dados dos pools. [Tentar novamente]" com botão de retry. Se retry falhar: "Selecionar sem dados" disponível com nota "Os dados de liquidez e APR estão indisponíveis — você pode selecionar com base no fee tier apenas."
Sucesso — pool selecionado: Modal fecha com animação de colapso suave. Health card de T01 atualiza com os dados do pool escolhido. Badge "Selecionado ✓ (Taxa de X,XX%)" se pool diferente do recomendado. Badge "Recomendado para este par ✓" mantido se o usuário escolheu o recomendado.
Título do modal:
"Escolher pool para [USDC/ETH]"
Sub-label do título:
"3 pools disponíveis nesta rede · Escolha onde aportar sua liquidez"
Badge de recomendação:
"Recomendado para este par ✓"
Tooltip do badge:
"Recomendado com base na liquidez disponível e no perfil deste par."
Labels de fee tier — primário:
"Taxa muito baixa (0,01%) · Ideal para pares estáveis — slippage mínimo em grandes volumes" "Taxa baixa (0,05%) · Ótima para pares com pouca volatilidade — boa liquidez, custo menor por swap" "Taxa padrão (0,3%) · Mais comum para pares com volatilidade moderada — equilíbrio entre custo e rendimento" "Taxa alta (1%) · Para tokens de menor liquidez — compensação maior por swap, liquidez menor"
Secondary label técnico:
"V3 · 0,05% por swap"
Métricas:
"Liquidez total: R$ 2,34 M" "Volume 24h: R$ 450 mil" "APR estimado: ~4,2% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ"
CTA por card:
"Selecionar este pool"
CTA pool inativo:
"Selecionar mesmo assim" (laranja)
Sort buttons:
"Mais liquidez" / "Maior rendimento"
Badge pool inativa:
"● Pool inativa · Vol/TVL < 0,1% · Rendimento pode ser próximo de zero"
Badge APR atípico:
"Rendimento atípico ⓘ"
Tooltip APR atípico:
"APR muito acima da média pode indicar incentivo temporário ou baixa liquidez. O rendimento tende a cair à medida que mais capital é aportado — verifique a sustentabilidade antes de aportar."
Banner todos os pools inativos:
"Todos os pools para [Token A]/[Token B] estão com baixa atividade — o rendimento de taxas pode ser próximo de zero. Você pode prosseguir ou escolher outro par."
Erro de dados:
"Não foi possível carregar dados dos pools. [Tentar novamente]"
Fallback sem dados:
"Selecionar sem dados de liquidez" "Os dados de APR e TVL estão indisponíveis agora — você pode escolher pelo fee tier."
Feedback pós-seleção no health card de T01:
"Selecionado ✓ (Taxa de 0,3%)"
Pool único (aparece em T01, não em T07):
"Único pool disponível para este par nesta rede"
[pancake-final § Defaults pró-iniciante sem pedir permissão] — sistema assume responsabilidade de curadoria sem forçar o usuário a escolher do zero; o usuário pode sobrepor, mas o default é o correto para o par.adicionar-liquidez-01 do design system Kotai — mesmo componente e semântica visual.suas-posicoes, criar-pool, adicionar-liquidez-01/02/03/04).[uniswap-final § Progressive disclosure como padrão arquitetural, não recurso pontual] — o usuário que aceita a recomendação de T01 nunca precisa abrir T07; o modal existe para quem quer decidir conscientemente.[uniswap-nova-posicao.md § Insight 2 — Microcopy pedagógica inline] + Pilar 1 Kotai (nome técnico como secondary label, nunca como label primário).[uniswap-final § Fricção 3 — Listas/métricas sem risk signaling nem fenestração de curadoria] + [pancake-final § Pilar 6 — Risk signaling sistêmico] — sinalizar risco em listas de pools antes do clique é diretriz obrigatória do design system.[pancake-adicionar-liquidez.md § Fricção 2 — Componente de filtro de pool: vocabulário intraduzível e UX degradada] (CLAMM/LBAMM/Classic sem definição, telas 4/6/7 do Pancake) + [uniswap-nova-posicao.md § Fricção 1 — Versão como caixa-preta técnica] (fee tier como lista nua sem trade-off). A solução é labels em camadas: consequência financeira (primário) + termo técnico (secondary).[pancake-adicionar-liquidez.md § Fricção Sistêmica — Localização incompleta: inglês técnico dentro de UI PT-BR] — "CLAMM", "Dynamic Fees", "Classic" em inglês nos filtros de pool do Pancake são o caso mais crítico de i18n incompleto deste fluxo.[uniswap-final § Fricção 3 — Listas sem fenestração de curadoria] — esconder pools ruins protege o iniciante mas remove controle do avançado; a posição no final da lista é a solução de equilíbrio (curadoria visível, não bloqueio).[uniswap-nova-posicao.md § Ponto isolado, Tela 4 — Troca de versão pode redefinir formulário silenciosamente] — saída de sub-fluxo preserva estado da tela-pai.[pancake-adicionar-liquidez.md § Oportunidade 2 — Filtros de pool por consequência financeira: "Alta eficiência de capital" em vez de "CLAMM"]. Labels como "Taxa padrão (0,3%) · Mais comum para pares com volatilidade moderada" entregam a consequência sem exigir que o usuário conheça a arquitetura da AMM. Hipótese: iniciante que lê "Taxa baixa · Ideal para pares com pouca volatilidade" escolhe o pool correto com maior frequência do que iniciante que lê "0,05% fee tier".[pancake-final § Painel master/detail preservando contexto + progressive disclosure] — ver todas as opções no mesmo plano de decisão (não um de cada vez em dropdown) permite comparação real sem perda de contexto. Hipótese: usuário que compara APR + TVL lado a lado tem taxa de seleção de pool ativo maior do que usuário que seleciona de dropdown sequencial.[uniswap-final § Fricção 6 — Métricas DeFi sem decomposição, janela ou comparativo] + [pancake-final § Pilar 6 — Risk signaling sistêmico]. A explicação "APR tende a cair à medida que mais capital é aportado" é educação financeira DeFi no ponto de decisão — diferencial sobre concorrentes que exibem "APR 523%" sem contexto.Heurística de recomendação precisa ser confiável: O badge "Recomendado para este par" é um endorsement do produto. Se a heurística recomendar o pool errado (ex: fee tier 0,3% para USDC/USDT onde 0,05% tem profundidade muito maior), o badge amplifica o erro. Mitigação: a heurística é a mesma de T01 — calibrada por TVL e Vol/TVL, não por número de fee tier. Revisão trimestral com dados de perdas por pool mal selecionado.
Labels de fee tier por consequência exigem copywriting especializado: "Taxa padrão (0,3%) · Mais comum para pares com volatilidade moderada" pode estar desatualizado se as condições de mercado mudarem. Mitigação: os labels descritivos são propriedades do componente de card (não hardcoded na view) e revisados por release. O percentual sempre aparece como part do label — se a descrição ficar desatualizada, o dado primário (0,3%) permanece correto.
Overhead de UX para o usuário que só quer aceitar a recomendação: Abrir T07 para ver opções adiciona uma step ao fluxo. Mitigação: T07 só é ativado por ação explícita do usuário ("Ver N pools disponíveis ▾") — quem aceita o recomendado nunca vê o modal. O modal existe para quem quer controle, não para quem quer velocidade.
i18n: 4 labels de fee tier × 3 strings cada (label curto, label longo, secondary técnico) = 12 strings adicionais por idioma + strings de badge e sort = ~18 strings. Custo real de manutenção quando novos fee tiers forem adicionados (ex: fee tier de 0,5% em protocolo futuro). Mitigação: componente de card de pool com props de conteúdo (label, secondary, threshold de aviso) — não hardcoded por fee tier.
Mobile: cards empilhados com muitas métricas: Em viewport estreito (< 375px), cada card com 4 linhas de métrica pode exceder o viewport sem scroll. Mitigação: em mobile, métricas colapsadas por default em cada card (apenas fee tier label + badge de atividade + "Ver detalhes ▾") — a comparação expandida em desktop, o score qualitativo em mobile. Expandir um card colapsa os outros (accordion behavior).
Formulário condensado para adicionar capital a uma posição LP já existente, sem re-seletar par, modo ou faixa de preço — apenas os novos valores a depositar. É um entry point alternativo ao fluxo de Adicionar Liquidez que parte de uma posição conhecida (ID #NNNN) e respeita os parâmetros fixos dela, com aviso proeminente quando a posição concentrada está fora da faixa no momento do aporte. Foco: intermediário que já opera LP e quer aumentar exposição de forma rápida; iniciante que volta à posição pelo CTA "Adicionar mais liquidez" de T06 e precisa do caminho mais direto.
a) Mini-card de identidade da posição (sticky no topo — substitui o health card de T01) Não é o health card genérico do pool — é o cartão específico da posição do usuário, com:
b) Indicador de contexto do fluxo (substitui o stepper de 3 passos de T01-T06) O stepper completo (Par e modo / Configurar / Confirmar) não aparece — este é um sub-fluxo sem re-seleção. No lugar: indicador compacto de contexto no topo do formulário:
"Adicionando ao par [USDC/ETH] · Posição #3847"
com botão de retorno lateral: "← Voltar à posição" (retorna para visualizar-posicao).
c) Banner de aviso — posição fora da faixa (estrutural — condicional para Concentrada out-of-range) Aparece imediatamente abaixo do mini-card quando o badge é "Fora da faixa". Banner âmbar com ícone ⚠, texto em duas partes:
O formulário de aporte não está acessível até o usuário escolher uma das duas ações do banner — a faixa fora do range é informação crítica que exige decisão consciente antes de prosseguir. Esta regra segue a hierarquia de defesa em camadas do Pilar 3: confirmação exigida para ação com risco financeiro não-trivial.
d) Campos de aporte (locked ao modo da posição existente) Para modo Concentrada:
Para modo Simples (V2) e Par Correlacionado (StableSwap):
Para modo Simples (V2) com posição cujo token A ou B mudou de proporção desde o aporte original:
e) APR estimado com caveat obrigatório "~X,X% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ" — idêntico ao padrão do design system Kotai. Tooltip com explicação de IL.
f) Card de custo agregado (após campos preenchidos)
Total a adicionar: R$ X.XXX,XX
Gas estimado: ~R$ XX,XX
────────────────────────────────────
Você paga agora: R$ X.XXX,XX
Sub-label: "O total adicionado permanece seu na posição — o gas é o custo para registrar na rede." Nota adicional quando aprovações necessárias: "Gas da autorização: ~R$ XX,XX por token (cobrado antes desta etapa)."
g) CTA principal Label dinâmico conforme o estado. Disabled até ambos os valores preenchidos + saldo suficiente.
visualizar-posicao em nova aba)Parâmetros fixos da posição: Par, modo, fee tier, e faixa de preço (para Concentrada) são readonly e não editáveis nesta tela. O usuário que quiser mudar qualquer um desses parâmetros deve ir para a tela de gerenciamento da posição. Para criar uma posição nova com parâmetros diferentes, usar T01. O mini-card comunica isso visualmente (dados exibidos, sem campo de edição).
Posição out-of-range (Concentrada): O banner de aviso aparece imediatamente ao entrar em T08. O formulário de aporte é inacessível até o usuário fazer uma escolha explícita: "Ajustar a faixa →" ou "Adicionar mesmo assim" (laranja). Clicar em "Adicionar mesmo assim" fecha o banner e libera o formulário — com nota persistente e discreta no mini-card: "● Fora da faixa · Você optou por adicionar fora do intervalo." A nota persiste durante o preenchimento do formulário como lembrete, não como bloqueio.
Proporção para Concentrada: A proporção de Token A / Token B depende do preço atual em relação à faixa configurada:
Aprovações de token: Sub-label no CTA "(Aprovação necessária)" quando tokens precisam de aprovação. Sub-fluxo de T05 (Autorizar Tokens) ao avançar — idêntico ao fluxo principal. Aprovações já concedidas para este contrato LP em sessão anterior não precisam ser repetidas.
Resultado: O fluxo usa T06 como encerramento, com adaptações no headline e resumo:
visualizar-posicao passando o ID da posição)Posição encerrada (detectada ao carregar T08): Cenário improvável mas necessário: se a posição foi encerrada entre o clique em "Adicionar mais liquidez" e o carregamento de T08 (ex: outra aba do usuário encerrou a posição simultaneamente). Banner de erro: "Esta posição foi encerrada. Você não pode adicionar liquidez a uma posição fechada." CTAs: "Criar nova posição →" (vai para T01 com o par pré-selecionado) + "Ver minhas posições →".
Loading (ao entrar em T08): Skeleton no mini-card. Skeleton nos campos de aporte (proporção sendo carregada). Se > 3s: "Carregando dados da posição..."
Posição in-range, nominal (modo Concentrada): Formulário direto. Badge ● verde. Sem banners. CTA dinâmico. Fluxo normal.
Posição out-of-range (modo Concentrada): Banner âmbar proeminente logo abaixo do mini-card. Formulário bloqueado (campos desabilitados com estado visual cinza) até ação explícita. CTA principal: "Ajustar a faixa →" (primário, não verde — é redirecionamento, não comprometimento financeiro) + "Adicionar mesmo assim" (laranja).
Posição Simples com proporção alterada: Mini-card exibe proporção atual. Campos de aporte funcionam com a proporção atual do pool. Nota informativa discreta: "Proporção atual: X%/Y% (diferente do aporte original)." Sem bloqueio — é informação, não risco crítico.
Saldo insuficiente (token específico): CTA laranja: "Saldo insuficiente em [Token A] · Comprar [Token A] →". Sub-label: "Você tem R$ XX,XX · Necessário: R$ YY,YY." O clique redireciona para T09 (on-ramp contextual) preservando os valores preenchidos.
Gas insuficiente: CTA laranja: "Saldo de gas insuficiente · Comprar [ETH / BNB] →". Sub-label: "Gas necessário: ~R$ XX,XX · Você tem: R$ YY,YY."
Aprovação necessária: Sub-label no CTA: "(Aprovação necessária)". Ao avançar: sub-fluxo T05, depois T06 adaptado.
Preço mudou durante preenchimento (> 2%): Toast: "O preço mudou. Proporção recalculada." Token B se atualiza com animação suave. Se > 5%: banner âmbar mais visível: "O preço de [Token A] mudou significativamente — verifique os valores antes de continuar."
Posição encerrada: Banner de erro vermelho cobrindo o formulário: "Esta posição foi encerrada — você não pode adicionar liquidez a uma posição fechada." CTAs: "Criar nova posição →" + "Ver minhas posições →".
Sucesso com posição fora da faixa após aporte: Estado B de T06 adaptado + banner âmbar adicional: "Você adicionou ao par fora da faixa atual — esta liquidez não renderá taxas até o preço retornar ao intervalo." CTA primário "Ver minha posição →" mantido como principal; link "Ajustar faixa →" como ação secundária.
Título da tela:
"Adicionar ao par [USDC/ETH]"
Indicador de contexto:
"Adicionando à posição #3847 · Concentrada em um intervalo · Taxa 0,3%"
Mini-card — badge dentro da faixa:
"● Dentro da faixa — você está ganhando taxas"
Mini-card — badge fora da faixa:
"● Fora da faixa — você não está ganhando taxas no momento"
Mini-card — faixa:
"Faixa: R$ 1.800,00 – R$ 2.400,00"
Mini-card — proporção Simples:
"Proporção atual do pool: 52% USDC / 48% ETH"
Mini-card — APR:
"~4,2% ao ano (estimativa 30d, sem Impermanent Loss) ⓘ"
Banner out-of-range:
"Sua posição está fora da faixa atual — adicionar liquidez aqui não renderá taxas até o preço retornar ao intervalo configurado." [Ajustar a faixa →] [Adicionar mesmo assim]
Nota persistente pós-"Adicionar mesmo assim":
"● Fora da faixa · Você optou por adicionar fora do intervalo atual."
Sub-label Token B — Concentrada:
"(Calculado com base na faixa da sua posição)"
Sub-label Token B — Simples:
"(Calculado automaticamente com base no preço atual)"
Nota de proporção alterada:
"Proporção atual do pool: 52% USDC / 48% ETH (diferente da proporção no seu aporte original)"
Card de custo:
"Total a adicionar: R$ X.XXX,XX" "Gas estimado: ~R$ XX,XX · [Atualizar ↻]" "Você paga agora: R$ X.XXX,XX" "O total adicionado permanece seu na posição — o gas é cobrado separadamente pela rede."
CTA sequência:
"Inserir valores" → "Revisar adição" → "Confirmar adição"
CTA — saldo insuficiente:
"Saldo insuficiente em [Token A] · Comprar [Token A] →"
CTA — gas insuficiente:
"Saldo de gas insuficiente · Comprar [ETH / BNB] →"
CTA — aprovação:
"Autorizar tokens e adicionar liquidez"
Preço recalculado:
"O preço mudou. Proporção recalculada."
Preço mudou muito:
"O preço de [Token A] mudou significativamente — verifique os valores antes de continuar."
Posição encerrada:
"Esta posição foi encerrada — não é possível adicionar liquidez a uma posição fechada." [Criar nova posição →] [Ver minhas posições →]
T06 adaptado — headline sucesso:
"Liquidez adicionada com sucesso"
T06 adaptado — resumo:
"Adicionado à posição #3847 · USDC/ETH · Concentrada em um intervalo" "Adicionado: X,XXXX USDC + X,XXXX ETH (≈ R$ X.XXX,XX)" "Gas total pago: R$ XX,XX"
T06 adaptado — CTA primário pós-sucesso:
"Ver minha posição →"
T06 adaptado — CTA secundário:
"Adicionar mais"
Botão de retorno:
"← Voltar à posição"
adicionar-liquidez-02, adicionar-liquidez-03, adicionar-liquidez-04, visualizar-posicao no design system Kotai — contexto da entidade nunca é perdido durante ação contextualizada.[pancake-final § Transparência proativa antes do CTA] — padrão cross-fluxo do design system Kotai.criar-pool-03, adicionar-liquidez-02/03/04 do design system Kotai.criar-pool-04.[pancake-final § Pilar 3 — Defesa em camadas + Hierarquia de toggle] — ação com risco financeiro não-trivial exige confirmação consciente, não apenas aviso passável.adicionar-liquidez-03 do design system Kotai.[uniswap-nova-posicao.md § Fricção 2 — Ausência de estado do pool destino na janela de decisão]). O formulário bloqueado vai além do aviso passável — sem confirmação forçada, o usuário que não lê o banner comete erro financeiro real (capital não rende até o preço retornar). A regra específica de bloqueio está fundamentada em [pancake-final § Pilar 3 — Defesa em camadas] e detalhada no bloco ⚪.[uniswap-nova-posicao.md § Fricção 2 — Ausência de estado do pool destino na janela de decisão] — usuário que aumenta posição em pool com proporção diferente do aporte original precisa saber que os valores calculados refletem a proporção atual, não a original.[uniswap-nova-posicao.md § Oportunidade 2 — Card de pré-visualização do pool destino] + [pancake-final § Pilar 4 — Educação contextual no ponto de decisão]. Nenhum DEX analisado entrega a ação "Ajustar faixa" dentro do contexto de adicionar liquidez a uma posição existente — o usuário precisaria sair do fluxo, navegar para visualizar-posicao, encontrar a ação de ajuste, e voltar. O CTA contextual elimina esse desvio. Hipótese: usuário que vê "Ajustar a faixa →" antes de adicionar capital a uma posição fora do range tem taxa de ajuste de range maior, reduzindo capital ocioso.[uniswap-nova-posicao.md § Insight 1 — Stepper pedagógico e contextual] + princípio de coerência de design system. O usuário que já fez o fluxo completo (T01-T06) e retorna para "Adicionar mais" reconhece a tela de revisão e a tela de resultado — reduz cognitive load por familiaridade. Hipótese: taxa de conclusão de "adicionar mais" é maior quando o resultado é o T06 conhecido do que quando é uma tela nova.[pancake-final § Pilar 3 — Defesa em camadas] e em [pancake-final § Pilar 4 — Educação contextual no ponto de decisão], mas a regra específica de bloqueio do formulário é nova. Custo: lógica de estado que verifica in-range ao carregar T08, com polling de preço para manter atualizado. Evidência a coletar: taxa de clique em "Ajustar a faixa →" vs "Adicionar mesmo assim" — se > 40% ajusta a faixa antes de adicionar, o aviso está funcionando.Estado out-of-range como bloqueio de formulário: Bloquear o formulário até ação consciente adiciona fricção real para o usuário que já sabe o que está fazendo (ex: usuário avançado que intencionalmente adiciona capital fora da faixa como estratégia de acumulação). Mitigação: "Adicionar mesmo assim" é um click distante do formulário (não um confirm modal), e o formulário fica acessível imediatamente após. O custo de fricção é baixo; o ganho de prevenção de erro iniciante é alto. Aceitar.
Polling de preço para manter o badge in/out-of-range atualizado: A posição pode passar de in-range para out-of-range durante o preenchimento do formulário se o preço se mover. Polling de preço a cada 30s é necessário para o badge estar correto. Em mobile com conexão fraca: pode causar re-render do mini-card. Mitigação: atualização do badge com animação suave (fade) e sem re-render do formulário. Se o polling falhar: badge exibe "Status da faixa não disponível" com timestamp do último dado.
Reutilização de T05/T06 com copy adaptado: Os componentes de T05 (autorização) e T06 (resultado) são reutilizados com adaptações de copy ("adicionado" vs "criado", "posição #NNNN" vs "posição nova"). Risco: inconsistência de copy se as adaptações não forem feitas sistematicamente. Mitigação: as strings dinâmicas de T05/T06 são parametrizadas por "contexto de sub-fluxo" (novo / adicionar) — não são hardcoded. O componente de T06 já é parametrizável (headline, sub-headline, CTA por estado).
Dois CTAs no banner out-of-range: Dois botões de ação ("Ajustar a faixa →" + "Adicionar mesmo assim") podem criar paralisia de escolha. Mitigação: hierarquia clara — "Ajustar a faixa →" como primário (brand color, não verde) e "Adicionar mesmo assim" como ação de override (laranja). A cor laranja já é estabelecida no design system como sinal de "caminho de risco entendido".
i18n: Microcopy de estado da posição (in-range / out-of-range / ID / faixa) são interpolados — 8–10 strings dinâmicas por idioma. Custo real especialmente quando novos modos de LP forem adicionados. Componente mini-card de posição com props de conteúdo — não hardcoded.
Bottom sheet / modal lateral contextual que aparece quando o usuário em T02 ou T03 está com saldo insuficiente de um ou ambos os tokens do par LP, oferecendo três caminhos de resolução sem abandonar o fluxo de aporte: compra com reais via PIX ou cartão (PIX-first para BR/LatAm), troca de outro token na carteira, ou instrução de transferência da exchange. Ao ser resolvido, retorna automaticamente ao formulário com o saldo atualizado. Foco: iniciante BR/LatAm sem cripto mas com intenção real de aportar, que de outra forma abandonaria o fluxo por falta de saldo sem saber que tem caminhos de resolução dentro do produto.
a) Contexto preservado — formulário visível atrás do modal O formulário de T02 ou T03 permanece visível (e legível, sem overlay opaco) atrás do bottom sheet, em mobile de forma semi-visível acima do sheet e em desktop como modal lateral. O usuário não "sai" do fluxo de aporte — a compra é uma resolução de obstáculo, não um desvio. Esta decisão arquitetural é o princípio mais importante desta tela: o contexto do aporte (par, modo, valores inseridos) nunca é destruído.
b) Header do bottom sheet "Comprar [Token A] para o aporte"
Sub-label contextual dinâmico:
"Você tem R$ XX,XX de [Token A] — precisa de pelo menos R$ X.XXX,XX para este aporte."
Botão × no canto direito (fecha o sheet, retorna para T02/T03 com os valores preservados, sem compra iniciada). Botão × é sempre disponível — não forçar a compra.
c) Tabs de método (estrutural — organização do conteúdo por caminho de resolução) Três tabs horizontais, com a relevante para o contexto ativa por default:
d) Campo de valor de compra Label: "Quanto comprar (em reais)" Pré-preenchido com o delta calculado: (valor necessário − saldo disponível) × 1,10, arredondado para cima para o real inteiro. A margem de 10% absorve variação de preço entre o momento do cálculo e a chegada da cripto na carteira. Sub-label: "Calculado com base no seu aporte · você pode ajustar" Campo editável — o usuário pode comprar mais ou menos do que o sugerido.
e) Seletor de provider (componente central da aba) Lista de 3–4 providers de on-ramp ordenados por quantidade de [Token A] recebida (não por taxa isolada — o iniciante entende "você recebe mais USDC" mais do que "taxa menor"). Cada linha de provider:
Ordenação e destaques:
comprar do Pancake: provider de "Melhor cotação" pré-selecionado, critério explícito)f) Nota de transparência e segurança Abaixo do seletor de providers, discreta:
"Compra processada por [Provider] — a Kotai não processa pagamentos diretamente. Taxa Kotai: X% incluída na cotação acima."
g) CTA da aba "Comprar com reais" "Ir para compra →" (abre o provider selecionado em webview in-app em mobile ou nova aba em desktop)
h) Seletor de token de origem Label: "Qual token você tem?" Dropdown com apenas os tokens que o usuário tem na carteira com saldo > 0, excluindo os tokens do par do aporte (não faz sentido trocar Token A por Token A). Se nenhum token elegível estiver disponível: aba oculta do seletor de tabs.
Preview dinâmico após seleção do token de origem:
i) CTA da aba "Trocar tokens" "Ir para Trocar →" — abre o fluxo de Swap com Token X (origem) e Token A (destino) pré-selecionados, com o valor de saída aproximado como sugestão. Ao completar o swap e retornar, T09 detecta o saldo atualizado.
j) Instrução de transferência Label: "Seu endereço · [Nome da Rede]"
0xAB12...CD34Aviso de rede obrigatório:
"⚠ Certifique-se de enviar na rede [Nome da Rede] — enviar em outra rede pode resultar em perda permanente dos tokens."
Link pedagógico: "Como transferir da Binance para esta carteira →" (abre conteúdo educacional in-app ou, se não disponível, link externo em nova aba)
Nota de tempo: "A transferência pode levar alguns minutos para ser confirmada na rede."
Pré-cálculo do valor sugerido:
Ao abrir T09, calcular: max(0, valor_necessário_token_a − saldo_disponível_token_a) × 1.10, arredondado para cima. Se o usuário precisar dos dois tokens (ambos com saldo insuficiente): mostrar T09 para o token com maior déficit percentual primeiro; após resolução, re-verificar o segundo token e abrir T09 novamente se ainda insuficiente. Não tentar resolver os dois simultaneamente — uma compra de cada vez.
Geo-default para locale PT-BR: Aba "Comprar com reais" é a default e a aba ativa ao abrir T09 para usuário com locale PT-BR detectado. PIX aparece como método de destaque. Para outros locales: aba "Comprar com reais" ainda está disponível, mas sem destaque de PIX; o método de pagamento primário muda conforme o locale (SEPA para Europa, ACH para EUA).
Tab "Trocar tokens" — visibilidade condicional: A tab só aparece se o usuário tem pelo menos um token com saldo > 0 na carteira conectada, excluindo os tokens do par atual. Se nenhum token elegível: tab "Trocar tokens" oculta (não desabilitada com estado cinza — simplesmente não renderizada).
Cotação e atualização: A cotação de on-ramp tem TTL de 60s. Após TTL: badge âmbar "Cotação pode ter mudado · [Atualizar ↻]" e campo de "Você recebe" exibe "(cotação desatualizada)". O CTA "Ir para compra →" permanece habilitado — o provider recalcula a cotação no momento da execução.
Retorno após compra concluída: Quando o usuário retorna do provider (in-app webview fechado ou nova aba fechada): T09 inicia polling de saldo a cada 15s por até 5 minutos. Se o saldo atualizar: T09 fecha automaticamente + toast em T02/T03: "Saldo de [Token A] atualizado. Verifique o valor e continue." Se o saldo não atualizar em 5 minutos: toast "A compra pode ainda estar sendo processada — aguarde ou verifique o status no provider." + botão "Verificar saldo agora" para polling manual.
Retorno após compra iniciada mas não concluída: Se o usuário retornar sem completar a compra (fechou o webview no meio): T09 permanece aberto no estado da aba onde estava. Sem toast de "compra cancelada" — o usuário pode ter apenas pausado. Se o saldo não mudar em 30s após retorno: volta ao estado de espera passiva (sem polling ativo).
Fechamento via × sem compra: Retorna para T02/T03 com todos os valores e o estado de "Saldo insuficiente" preservados — o CTA de T02/T03 ainda mostra "Saldo insuficiente em [Token A] · Comprar [Token A] →". O usuário não perdeu nada; pode tentar de novo mais tarde.
Wallet de contrato (smart wallet/MPC): Aba "Transferir da exchange" exibe nota adicional: "Algumas exchanges não permitem enviar para endereços de contrato. Verifique com sua exchange antes de enviar." Badge discreto no endereço: "Contrato · [Nome da Rede]".
Loading de cotação (ao abrir a aba "Comprar com reais"): Skeleton nos cards de provider. Sub-label no campo de valor: "(Calculando cotação...)" Se > 3s: "Buscando melhores cotações... pode levar alguns segundos."
Erro de cotação — provider offline: Card do provider com badge cinza "Cotação indisponível — tente outro provider". Se todos os providers offline: mensagem central: "Não foi possível carregar cotações. Verifique sua conexão ou use as abas Trocar tokens ou Transferir da exchange."
Cotação desatualizada (> 60s sem refresh): Badge âmbar "Cotação pode ter mudado · [Atualizar ↻]" no seletor. Campo de quantidade exibe "(cotação desatualizada)" ao lado do valor. CTA "Ir para compra →" mantido habilitado.
Compra concluída — saldo atualizado: Polling detectou saldo novo. T09 fecha com animação de colapso. Toast em T02/T03:
"✓ Saldo de [Token A] atualizado. Verifique o valor e continue." O CTA de T02/T03 muda automaticamente de "Saldo insuficiente" para o próximo passo do fluxo.
Compra iniciada — saldo ainda não confirmado: Polling de 5 min sem detecção de saldo novo. Toast:
"A compra pode ainda estar sendo processada. Aguarde ou verifique o status no provider." Botão "Verificar saldo agora" para polling manual.
Tab "Trocar tokens" — sem tokens elegíveis: Tab não renderizada (não está presente no seletor de tabs). Se o usuário chegar em T09 com carteira sem tokens, apenas as abas "Comprar com reais" e "Transferir da exchange" estão visíveis.
Rede errada detectada (usuário em Ethereum, par na BNB Chain): Banner âmbar no header do sheet:
"⚠ Você está na rede Ethereum, mas este par está na BNB Chain. Troque de rede antes de transferir." Link: "Trocar para BNB Chain →"
Ambos os tokens com saldo insuficiente: T09 abre para o token com maior déficit percentual (Token A). Após resolução de Token A: ao retornar para T02/T03, se Token B ainda insuficiente: toast "Saldo de [Token A] ok! Agora você precisa de mais [Token B]." + reabre T09 automaticamente para Token B. Não tentar resolver ambos em uma única sessão de T09 — um passo de cada vez.
Título do bottom sheet:
"Comprar [Token A] para o aporte"
Sub-label contextual:
"Você tem R$ XX,XX de [Token A] — precisa de pelo menos R$ X.XXX,XX para este aporte."
Labels das tabs:
"Comprar com reais" / "Trocar tokens" / "Transferir da exchange"
Campo de valor:
"Quanto comprar (em reais)" "Calculado com base no seu aporte · você pode ajustar"
Badge de melhor cotação:
"Melhor cotação agora ✓"
Badge PIX:
"● PIX · Mais rápido"
Badge combinado:
"Melhor cotação · PIX ✓"
Linha de comparação de provider:
"Você recebe X,XXXX [Token A]"
Linha secundária de provider:
"Você paga R$ X.XXX,XX · Taxa do provider + Taxa Kotai"
Nota de transparência:
"Compra processada por [Provider] — a Kotai não processa pagamentos diretamente. Taxa Kotai: X% incluída na cotação."
CTA — aba "Comprar com reais":
"Ir para compra →"
Cotação desatualizada:
"Cotação pode ter mudado · [Atualizar ↻]"
Timestamp:
"Cotação atualizada há N min"
Aba "Trocar tokens" — seletor:
"Qual token você tem?"
Aba "Trocar tokens" — preview:
"Taxa de câmbio: 1 [ETH] ≈ 2.358,00 USDC" "Você recebe aproximadamente X,XXXX USDC"
CTA — aba "Trocar tokens":
"Ir para Trocar →"
Aba "Transferir da exchange" — label endereço:
"Seu endereço · BNB Chain"
Aba "Transferir da exchange" — aviso de rede:
"⚠ Certifique-se de enviar na rede BNB Chain — enviar em outra rede pode resultar em perda permanente dos tokens."
Link pedagógico:
"Como transferir da Binance para esta carteira →"
Nota de tempo:
"A transferência pode levar alguns minutos para ser confirmada na rede."
Toast — compra concluída:
"✓ Saldo de [Token A] atualizado. Verifique o valor e continue."
Toast — compra em andamento:
"A compra pode ainda estar sendo processada. Aguarde ou verifique o status no provider."
Botão de verificação manual:
"Verificar saldo agora"
Banner — rede errada:
"⚠ Você está na rede Ethereum, mas este par está na BNB Chain. Troque de rede antes de transferir." [Trocar para BNB Chain →]
Providers offline:
"Não foi possível carregar cotações. Verifique sua conexão ou use as abas Trocar tokens ou Transferir da exchange."
Wallet de contrato — nota:
"Algumas exchanges não permitem enviar para endereços de contrato. Verifique com sua exchange antes de enviar."
Segundo token insuficiente (após resolver o primeiro):
"Saldo de [Token A] atualizado! Agora você precisa de mais [Token B] para completar o aporte."
[pancake-final § Transparência proativa antes do CTA (parcial)] + [pancake-comprar § provider melhor cotação pré-selecionado com critério visível] — o iniciante entende "você recebe mais USDC" mais facilmente do que "taxa menor"; output em cripto como unidade de comparação é o padrão correto para contexto DeFi.[pancake-final § Defaults pró-iniciante sem pedir permissão] — PIX pré-selecionado para locale PT-BR, aba "Comprar com reais" ativa por default, provider de melhor cotação já selecionado. O usuário avançado pode trocar; o iniciante recebe o caminho correto sem precisar configurar.[uniswap-final § Progressive disclosure como padrão arquitetural, não recurso pontual] + [uniswap-final § Ação imediata sem commit nem onboarding] — o sub-fluxo de compra não destrói o contexto do fluxo-pai; o usuário retorna exatamente de onde saiu.[pancake-adicionar-liquidez.md § Insight 1 — Adaptação honesta do formulário ao protocolo] — não renderizar opção que não existe para aquela configuração; tab oculta (não desabilitada) quando não há tokens elegíveis.[pancake-final § Fricção 4 — Endereço sem identificador de rede no momento de saída] — a fricção 4 do Pancake é exatamente a ausência de badge de rede no endereço; T09 a resolve no único ponto do fluxo de LP onde o usuário pode precisar de um endereço para receber.[uniswap-final § Fricção 4 — Defaults ignoram contexto que o sistema já tem] (a Uniswap não usa locale detectado; a Kotai usa como default da primeira camada).[uniswap-final § Fricção 4 — Defaults ignoram contexto que o sistema já tem] (Uniswap aponta Moonpay/Coinbase para usuário BR sem considerar o contexto local) + [pancake-final § Pilar 5 — Mobile-first interaction + Localização BR/LatAm como infraestrutura] (PIX/CEX BR como infraestrutura, não feature opcional).[pancake-final § Fricção 4 — Endereço sem identificador de rede no momento de saída] — a posição do aviso importa: exibir após a cópia já é tarde se o usuário não leu; o aviso antes do endereço muda a ordem de leitura.[pancake-final § Fricção 1 — Léxico de protocolo como vocabulário primário] aplicado ao contexto de on-ramp — "Provider Fees" e "Pancake Fees" em inglês no breakdown do Pancake são o padrão que a Kotai resolve com breakdown em PT-BR + taxa explicitada.[uniswap-nova-posicao.md § Fricção 2 — Ausência de estado do pool destino na janela de decisão] por simetria — assim como o usuário precisa ver o estado do pool antes de aportar, precisa ver o quantum do déficit antes de comprar. "Você tem R$ XX,XX — precisa de R$ X.XXX,XX" é a informação que torna a compra concreta, não abstrata.[pancake-final § Pilar 5 — Mobile-first interaction + Localização BR/LatAm como infraestrutura] — on-ramp como infraestrutura do produto, não como link externo. Hipótese: usuário que resolve o saldo insuficiente dentro do fluxo de Adicionar Liquidez tem taxa de retorno ao formulário maior do que usuário redirecionado para uma tela de "Comprar" genérica, que perde o contexto do par e dos valores inseridos.[pancake-final § Pilar 5 — Localização BR/LatAm como infraestrutura]. A diferenciação concreta é: o produto não apenas suporta PIX, mas o coloca no topo da lista e o marca como "Mais rápido" para o usuário BR. Hipótese: usuário BR que vê "PIX · Mais rápido" como primeira opção tem menor abandono no on-ramp do que usuário que precisa rolar para encontrar o PIX entre métodos internacionais.[uniswap-nova-posicao.md § Oportunidade 3 — Slippage adaptativo ao par/pool] por analogia — o mesmo princípio de "calcular automaticamente o parâmetro ótimo" se aplica ao valor de compra sugerido. Hipótese: usuário que compra o pré-calculado + 10% não precisa repetir o processo porque comprou a menos.Contexto preservado atrás do modal: Manter T02/T03 visível atrás do bottom sheet requer que o formulário permaneça montado em memória durante a sessão de T09. Em mobile de baixo custo com pouca RAM, isso pode causar reload do formulário ao retornar. Mitigação: persistência local dos valores do formulário (localStorage ou estado de sessão) — em caso de reload do formulário ao retornar, os valores são restaurados automaticamente.
Polling de saldo pós-compra (custo de API): Polling de saldo a cada 15s por 5 minutos = até 20 chamadas de API por sessão de compra. Para produtos com muitos usuários simultâneos em on-ramp, isso pode ser caro. Mitigação: exponential backoff (15s → 30s → 60s) após o primeiro minuto sem detecção de saldo; cancelamento do polling se o usuário fechar T09 ou T02/T03.
Pré-cálculo com margem de 10% pode forçar compra excessiva: O usuário com exatamente R$ 1.000,00 disponíveis e déficit de R$ 950,00 receberá sugestão de R$ 1.045,00 — acima do seu limite. O campo é editável e o sub-label deixa claro que é sugestão, mas o valor pré-preenchido pode frustrar quem não pode comprar mais do que o necessário. Mitigação: verificar se o pré-calculado com margem excede algum limite implícito do usuário (difícil de detectar sem KYC). Aceitar o risco — a margem beneficia mais casos do que prejudica.
Tab "Trocar tokens" esconde complexidade: A troca de tokens para resolver o déficit de LP esconde o fato de que o swap tem seu próprio slippage e custo de gas — o usuário pode trocar Token X por Token A e acabar com menos Token A do que esperava, retornando ao estado de saldo insuficiente. Mitigação: o preview dinâmico da aba "Trocar tokens" exibe a quantidade estimada de Token A com aviso de slippage. Sub-label: "Valor estimado — o slippage pode reduzir a quantidade recebida." Não bloquear — apenas informar.
Aviso de rede na aba "Transferir da exchange" pode ser ignorado: O aviso "Certifique-se de enviar na rede BNB Chain" é informação crítica mas pode sofrer de banner blindness. Mitigação: o aviso está posicionado antes do endereço (não depois) e usa o ícone ⚠ em âmbar. Para wallets EOA, considerar adicionar o nome da rede como parte do QR Code de endereço para que o provider de CEX que escaneia também veja a rede. Implementação futura — não bloqueia o MVP.
i18n e localização de providers: O seletor de providers precisa exibir providers relevantes por região — PIX é BR-exclusivo; SEPA é Europa; ACH é EUA. A lista de providers não é global. Custo: localização do seletor de providers por locale/região detectada, com fallback para lista global quando região não reconhecida. Este custo é o maior deste componente — o seletor de on-ramp é a parte mais cara de manter a longo prazo à medida que providers entram e saem do mercado.











































