




Max price recalcula ratio dinamicamenteFunção: demonstra a relação range ↔ ratio de capital ao vivo. User aumentou Max price de 2504,9182 (Tela 13) pra 2942,466 (~32% acima do preço atual). USDC permanece em 1000, mas ETH subiu de 0,205 pra 0,458 — produto recalculou automaticamente. Chart no topo mostra banda azul estendida pra direita (Max maior = mais espaço acima do preço). Provavelmente capturado pra evidenciar a mecânica de re-cálculo.
Componentes (diff em relação à Tela 13)
1D / 1W / 1M / 1Y / All time + Reset) — banda azul mais larga pra direita que na Tela 13.2.233,08 USDC/WETH ($2.233,08) (inalterado).Price strategies colapsada/visível na transição.Min price = 1706,2113 (inalterado, −24% do preço atual).Max price = 2942,466 (mudou, +32%).Deposit tokens:1000 USDC (inalterado, $1.000,00).0,45830405644617936 ETH (recalculado, ~`$1.082,29`).Review ativo.Regras de negócio
Max (mais espaço acima do preço atual) → mais ETH necessário. Lado-ETH da curva agora cobre faixa maior → mais token-de-cima é depositado.$1.487 → $2.082) porque ETH dobrou; user pode reduzir USDC pra rebalancear.🟢 Insight 1 — Re-cálculo ao vivo torna a relação range ↔ exposição em token evidente sem texto. Tela 13 mostrava 0,205 ETH; Tela 14 mostra 0,458 ETH após aumentar Max. User decoda em 1 segundo: "quanto mais espaço pra cima, mais ETH preciso". Sem tooltip, sem FAQ. Padrão a herdar pra Kotai — feature mecânica complexa virou pedagogia por demonstração (a mesma lógica do Insight 1 da Tela 13, agora observável em sequência).
🟢 Insight 2 — Latência zero do re-cálculo carrega sinal de qualidade técnica. Mudar input de Max e ver o ETH ajustar instantaneamente (sem spinner, sem "recalculando…") sinaliza que o cálculo é client-side. User power percebe e confia; user iniciante não percebe mas se beneficia da fluidez. Padrão a herdar — cálculos de produto financeiro devem rodar client-side quando matematicamente possível.
🟢 Insight 3 — Chart sincroniza com input numérico — banda azul redesenha conforme Max price muda. Não há "Atualizar chart" — mudar input redesenha visualização. As 3 vias de input (chart-drag, preset, input numérico) compartilham estado único. Padrão a herdar — múltiplas vias de input devem refletir mesmo estado bidirecional, sempre.
🔴 Fricção 1 — Ao aumentar Max, ETH subiu silenciosamente de $487 pra $1.082 — user precisa reagir (estrutural — re-cálculo modifica capital sem alerta)
$1.487 total ($1.000 + $487). Ao mover Max pra cima, o produto aumentou o custo total pra $2.082 ($1.000 + $1.082) sem alerta. User pode não ter $2.082 em wallet — vai descobrir só no Review (Tela 16 presumível) ou pior, em "insufficient balance" no submit. Insight 1 (educativo) tem custo invisível.Total a depositar: $2.082,29 (+$595 vs antes). Delta colorido (vermelho se aumentou, verde se diminuiu). User vê instantaneamente o impacto financeiro de cada ajuste de range. Trade-off: mais um number na tela; ganho: zero surpresa de capital no Review.🔴 Fricção 2 — 0,45830405644617936 ETH em 17 casas decimais é honestidade que vira ruído visual (cosmética — precisão sem propósito visível pro user)
0,45830405644617936 é trabalho cognitivo. Iniciante pode pensar "preciso digitar isso tudo? esse é o number real?".0,4583 perde precisão de Insight 2 da Tela 13; mostrar só ($1.082,29) esconde o token amount.0,45830) com tooltip on-hover mostrando precisão completa. Botão "Copiar valor exato" no tooltip pra avançado. Trade-off: esconde precisão real; ganho: foco no ($1.082,29) que é a leitura humana.🔴 Fricção 3 — Não há "snapshot" do estado anterior pra comparar configs (estrutural — produto não oferece comparação entre escolhas)
Max 2504, ETH 0,205, total $1.487) e agora testa Tela 14 (Max 2942, ETH 0,458, total $2.082). Pra comparar qual é melhor, precisa lembrar dos numbers da config anterior de cabeça. Nenhum "histórico de tentativas" ou "fixar essa config". Decisão final fica por intuição do que ele lembra.Salvar esta config que cria card-comparador lateral. User pode salvar 2–3 configs, ver lado a lado: Config A: ±12% range, $1.487, APR estimado X% / Config B: ±32% range, $2.082, APR estimado Y%. Escolhe a melhor antes de Review. Trade-off: mais UI; ganho: decisão informada por comparação concreta, não memória.🟡 Oportunidade competitiva — Modo "Capital fixo" como inversão do default
Total $1.000, sistema sugere range que cabe com APR ótimo.Por range (avançado) (default Uniswap) vs Por capital (sugerido) (Kotai default). Em modo "Por capital", user define $X total + perfil de risco (conservador/equilibrado/agressivo), sistema sugere range ótimo. User vê range no chart e pode ajustar. Inversão respeita mental model fiat.Observação adicional — Tela 14 confirma que Min ficou inalterado entre 13→14. User só mexeu em Max. Isso valida a hipótese de re-cálculo one-at-a-time: editar um input fixa outro, recalcula o terceiro. Padrão arquitetural simples (input editado = âncora; tokens recalculam) que evita o problema clássico de "todos os campos dançam em loop". Kotai deve herdar — em formulários acoplados matematicamente, definir explicitamente qual input é âncora a cada momento.
Função: continuação do Step 2 com range custom finalizado via inputs numéricos (Min price / Max price preenchidos) e section Deposit tokens revelada abaixo. Esta é a tela onde a decisão de range vira decisão de capital — produto calcula o ratio de USDC e ETH automaticamente com base no range escolhido + preço atual. CTA Review ativo (rosa) — Step 2 está pronto pra revisar.
Componentes
Price strategies ainda visível acima (vide Tela 11/12).Min price = 1706,2113 + controles − +.Max price = 2504,9182 + controles − + + sufixo +12,17% (delta vs preço atual? vide Observação).Deposit tokens com subcopy "Specify the token amounts for your liquidity contribution":1000 + ($1.000,00) + ícone USDC + ticker USDC.0,20528138691144813 + (~$487,10) + ícone ETH + ticker ETH.Review (rosa, ativo) ocupando full-width no rodapé.Regras de negócio
USDC/WETH (preço de WETH em USDC, leitura humana de $/ETH — o user inverteu via toggle na Tela 11).1706 / 2504 com preço atual ~$2.233), a fórmula privilegia o lado com mais espaço. Aqui Max está mais distante do preço atual (~12% acima) que Min (~24% abaixo), então mais USDC entra por unidade de ETH.Min price aceita −/+ em incrementos discretos (tick mínimo). Trocar via input livre arredonda pro tick mais próximo.Review ativa quando: range válido (min < max) + pelo menos 1 input de token > 0.🟢 Insight 1 — Ratio calculado automaticamente é a melhor pedagogia possível sobre concentrated liquidity. Iniciante não precisa entender a fórmula (L = sqrt(P) · ...) — vê na prática: "se eu colocar $1000 USDC, preciso de $487 em ETH pra esse range". A relação range ↔ exposição vira evidente via observação, não via texto. Padrão a herdar pra Kotai: feature matemática complexa que pode ser demonstrada por re-cálculo ao vivo > feature explicada por tooltip.
🟢 Insight 2 — 0,20528138691144813 ETH em 17 casas decimais é honestidade brutal sobre precisão de cálculo. Number completo expõe que o produto não arredondou — você está depositando exatamente isso. Avançado aprecia (sem surpresa downstream); iniciante estranha mas não sofre (($487,10) ao lado dá a leitura humana). Padrão a herdar — exibir precisão completa + alias humano em paralelo. Esconder casas decimais introduz dúvida ("o produto está arredondando o que cobra de mim?").
🟢 Insight 3 — ($1.000,00) e (~$487,10) em USD ao lado dos amounts ancora o user em moeda fiat. Iniciante pensa em "$1000", não em "1000 USDC". Cripto-nativo já sabe que USDC ≈ $1, mas pares como ETH/WBTC precisam disso desesperadamente. Padrão a herdar — todo input de token exibe equivalente USD ao lado, mesmo em pares que parecem óbvios (USDC).
🟢 Insight 4 — Review em vez de Confirm no CTA primário sinaliza que ainda haverá tela de revisão. Step 2 termina em "Review", não em "Approve" ou "Sign". User sabe que tem mais 1 passo antes do compromisso on-chain. Reduz ansiedade de "esse é o botão final?". Padrão a herdar — labels de CTA devem refletir consequência (review ≠ commit).
🔴 Fricção 1 — Ratio calculado automaticamente sem explicar por que os números são esses (estrutural — re-cálculo ao vivo sem narração)
1000 USDC + 0,205 ETH. Por que 0,205? Por que não 0,447 (50/50 em valor)? Por que não 0,1 (range muito assimétrico privilegia USDC)? Insight 1 acima é verdadeiro mas incompleto — o user vê o resultado, não entende o mecanismo. Em range balanceado parece 50/50; em range assimétrico parece arbitrário. Iniciante pensa "o produto está me fazendo comprar menos ETH do que eu queria — bug?".L = sqrt(P) · (1 - sqrt(Pa)/sqrt(Pb)) afasta iniciante; mostrar tooltip "É calculado automaticamente" não explica nada.🔴 *Fricção 2 — Botão Review full-width no rodapé sem resumo do que está sendo revisado (cosmética-estrutural — transição abrupta entre input e review)
Review, vai pra próxima tela. Mas e se ele errou? Review deveria implicar "vou conferir antes" — mas a passagem é cega, sem preview. Iniciante pode clicar achando que já depositou (CTA primário rosa parece "commit").Review em sticky-footer-with-summary infla UI.Total: ~$1.487,10 · Range: ±12% · APR estimado: X% · [Review →]. User vê o resumo na própria tela de input, antes de ir pra próxima. Reduz medo de "essa transição é final?". Trade-off: mais real estate no rodapé; ganho: zero clique de review puro pra checar.🔴 Fricção 3 — Inputs Min price e Max price ficam separados da section Deposit tokens sem amarração visual explícita (cosmética — relação acoplada mostrada em sections desconectadas)
Min price / Max price (range) e 1000 USDC / 0,205 ETH (depósito) são acoplados matematicamente (mudar range muda ratio). Mas estão em sections visuais separadas: range no meio, deposit abaixo. User pode mudar range no input e não notar que o depósito recalculou. Re-cálculo ao vivo (Insight 1) perde efeito se o user não está olhando pros dois ao mesmo tempo.🟡 Oportunidade competitiva — Mostrar capital eficiency vs full range ao lado do ratio
$1.487) vs equivalente full range ($14.000). User decoda "esse range concentra meu capital em 10×" — entende valor de v3 em concreto.Observação adicional — +12,17% ao lado do Max price. Indicador delta vs preço atual: max é 12,17% acima de $2.233. Decisão de produto boa — ancora o user em "quanto acima/abaixo" sem precisar fazer conta. Vale herdar pra Kotai: inputs de range numéricos sempre exibem delta vs preço atual ao lado (como já fizemos via markers no chart, agora também no input). Coerência visual em dois lugares (chart + input) reforça mental model.
Função: modal de revisão final que sobrepõe (overlay translúcido sobre o Step 2) ao clicar Review na Tela 13/14/15. É o último ponto de checagem antes da transação on-chain — depois do Create aqui, vai pra confirmação da wallet (Tela 17). O modal agrupa em um card único: header com par/fee, mini-thumbnail do range, recap de Min/Max, recap de Deposit amounts, e botão Create rosa. Mantém Step 2 visível por trás (com chart e inputs) — user pode dispensar e ajustar sem perder estado.
Componentes
USDC / ETH + version + fee tier.1.706,21 USDC/WETH herdado da Tela 13).2.504,92 ou 2.607,14 herdado).1000 USDC + ícone USDC.0,237682839… ETH + ícone ETH (note: difere ligeiramente dos valores das Telas 13–15 — provavelmente o user re-ajustou range pra Max realista antes do Review; ver Observação).Create rosa primário.Review ainda visível — provavelmente o modal está empilhado sobre o Step 2, ambos parcialmente visíveis na captura.Regras de negócio
Create dispara o prompt da wallet (Tela 17), só então a transação é assinada.🟢 Insight 1 — Mini-thumbnail do range no modal é tradução de número em geometria — exatamente o que iniciante precisa no momento de commit. Iniciante leu Min 1706 / Max 2504 no Step 2; aqui vê o range como forma. Se ele errou range na Tela 13 (digitou Max errado), o thumbnail denuncia visualmente. Pedagogia anti-typo. Padrão a herdar pra Kotai — toda confirmação de transação deve incluir representação visual da decisão (chart, ícone, badge), não só números repetidos.
🟢 Insight 2 — Step 2 visível por trás do modal preserva escape e contexto. User pode "voltar" mentalmente pra checar input específico sem fechar o modal. Diferente de full-screen review (que apaga contexto). Decisão deliberada — modal sem perder estado. Padrão a herdar — overlay translúcido > nav transition em ações reversíveis.
🟢 Insight 3 — Create como CTA primário, não Submit ou Confirm. Vocabulário do produto: você está criando uma posição, não "submetendo uma ordem". Reforça mental model de LP (long-term, é seu) vs trader (transação isolada). Padrão a herdar — labels de CTA devem traduzir intent semântica, não verbo genérico.
🟢 Insight 4 — Modal centralizado e estreito (não full-screen) sinaliza "isso é uma decisão, não um destino". Full-screen review (típico de checkout fintech) implica "você está numa nova página"; modal centrado implica "é um modal de confirmação — clique e siga". Reduz ansiedade. Padrão a herdar — escolha modal vs full-page reflete peso percebido da ação.
🔴 Fricção 1 — Modal de review não mostra APR estimado, fees esperados, ou impermanent loss projetado — apenas restate dos inputs (estrutural — último ponto educativo desperdiçado em mero recap)
1000 USDC + 0,237 ETH no range 1706–2504. User já viu isso no Step 2. O modal não adiciona informação nova — só repete. Mas esse é literalmente o último ponto em que o produto pode educar antes do commit on-chain. Numbers críticos ausentes: APR estimado pra esse range, fees esperados em 30d, % chance de ficar in-range, IL estimado se preço se mover ±X%. Em vez disso, o modal serve só pra confirmar que o user não errou typing. Oportunidade perdida.🔴 Fricção 2 — Create é label ambíguo na fronteira on-chain — não diz se aciona wallet sign ou se deposita diretamente (estrutural — verbo de commit não esclarece se há mais uma etapa)
Create. O que acontece? (a) Wallet abre prompt de assinatura (correto — Tela 17). (b) Posição é criada direto. (c) Tx é enviada e some sem feedback. Sem antecipação, user pode (a) clicar pensando que é commit final e se assustar com prompt da wallet (especialmente em mobile, onde o switch de contexto é abrupto), (b) clicar duas vezes pensando que não funcionou. Vocabulário cripto-nativo cobre esse caso com Sign in wallet → ou Confirm in wallet →.Sign in wallet é jargão pra iniciante (o que é wallet sign?); Create é claro mas omite a etapa intermediária.Create position (1 wallet signature required) → — label autodescritivo + indicação do próximo passo. Trade-off: label longo; ganho: zero surpresa.🔴 Fricção 3 — Captura mostra dois CTAs primários simultâneos (Create no modal + Review no Step 2 atrás) (cosmética-estrutural — overlay translúcido revela ambiguidade visual)
Review rosa ainda renderizado. User vê dois botões rosa primários ao mesmo tempo: Create (modal) e Review (background). Iniciante pode clicar no errado — especialmente em viewport mobile onde os dois ficam próximos visualmente. Modal deveria escurecer ou desabilitar visualmente o CTA do background.Review background (cinza translúcido em vez de rosa) — visível mas "desligado". Modal foreground mantém rosa pleno. Trade-off: exige re-render condicional; ganho: zero ambiguidade de CTA.🟡 Oportunidade competitiva — Review como "contrato visual" do que vai acontecer (incluindo cenários adversos)
Create, complementa. User commit com mental model calibrado.Observação adicional — depósito de 0,237682834… ETH no modal indica que user re-ajustou Max entre Tela 15 e Tela 16. Tela 13 = 0,205 ETH; Tela 14 = 0,458 ETH; Tela 15 = 0,274 ETH. Modal = 0,237 ETH. Trajetória de exploração: aumentou Max → diminuiu → re-calibrou. Sinal valioso: o flow real tem múltiplas idas-e-voltas no Step 2 antes de chegar no Review. Vale herdar pra Kotai: o "Modo de exploração" (PosPop #14 oportunidade) deve suportar essa pingue-pongue sem fricção. Histórico de tentativas (PosPop #14 fricção 3) seria o complemento perfeito — user veria "você testou 3 configs antes, qual quer reusar?".
Max price extremamente alto (range degenera em "one-sided lower")Função: user definiu Max price em valor extremo (26071406 — provavelmente 2.607,1406 com vírgula perdida no display, ou input absurdo testando limite). Min permanece em 1706,2113. Re-cálculo: ETH caiu de 0,458 (Tela 14) pra 0,27425… (~$648). Comportamento contraintuitivo se lido como "Max maior → mais ETH" — mas matematicamente correto: range tão largo pra cima vira quase one-sided lower, capital concentra em USDC (lado abaixo do preço atual), ETH-side fica diluído por uma faixa enorme.
Componentes (diff em relação à Tela 14)
Min price = 1706,2113 (inalterado).Max price = 26071406 (input ambíguo — vide nota abaixo) ou plausivelmente 2.607,1406 com separador removido no render.Deposit tokens:1000 USDC (inalterado).0,27425424248181698196… ETH (recalculado para baixo).Review permanece ativo (range válido — só absurdo).Regras de negócio
sqrt(P) em relação aos sqrt(Pa)/sqrt(Pb) (bounds). Quando Pb (Max) → ∞, ratio tende a "tudo USDC" pq lado-ETH cobre faixa quase infinita — capital fica diluído.1706 está abaixo do preço atual $2.233 → range cobre território onde ainda há USDC (preço caindo deixa o pool comprando ETH com USDC). Max extremo → ETH-side fica residual.$1.000 + $648 = $1.648 — menor que Tela 14 ($2.082) apesar de range mais largo. Contraintuitivo.🟢 Insight 1 — Re-cálculo aceita inputs extremos sem quebrar — robustez técnica. User pode digitar Max=∞ (ou número absurdo) e o cálculo entrega resultado coerente (ETH residual, capital concentrado em USDC). Sem crash, sem erro, sem "valor inválido". Padrão a herdar pra Kotai — calculadora financeira deve ser robusta a inputs ruins, mesmo quando o usuário está errando.
🟢 Insight 2 — Total cai ($2.082 → $1.648) ao aumentar Max, demonstrando que range maior ≠ capital maior. Comportamento contraintuitivo é também pedagógico: user vê que ETH residual = posição one-sided lower = menos capital pra cobrir lado-ETH. Mostra na prática a forma da curva. Padrão a herdar — quando matemática é contraintuitiva, o produto deve deixar o user experimentar (não bloquear, não esconder); experiência ensina mais que tooltip.
🔴 Fricção 1 — Produto aceita Max = 26.071.406 sem questionar plausibilidade (estrutural — guard-rail ausente em input com consequência real)
Review (ainda ativo!), passa pra tela final, deposita capital, e fica com posição que nunca atinge o lado-ETH — ETH no pool fica congelado até preço chegar a $26M (nunca). Capital travado. Pior caso de UX em DeFi: silêncio do produto + decisão irreversível.Max ≤ 10× preço atual) elimina apostas legítimas extremas (LP com tese de "ETH a $50K em 5 anos"); modal "Tem certeza?" toda vez é fricção.Manter valor / Reduzir pra 10× / Editar. Não bloqueia, mas exige confirmação informada. Trade-off: exige heurística de "absurdo"; risco de falsos positivos em apostas legítimas. Aceitar com toggle "Não mostrar de novo".min < max), não valida semântica (range faz sentido?). Em produto financeiro com consequência on-chain, validação semântica é guard-rail essencial.🔴 Fricção 2 — Display de Max price sem separadores de milhar transforma erro em ambiguidade (cosmética — formatação numérica pobre)
26071406 é lido como (a) 26 milhões, (b) 2,6 milhões, ou (c) 2607.1406? Sem separador (26.071.406 ou 26,071,406 ou 2.607,1406), o user que digitou erra duas vezes: na entrada e na revisão. Em locale PT-BR, . é milhar; em EN, , é milhar. O display nu é ambíguo.26.071.406 em PT-BR, 26,071,406 em EN). Display do Max price exibido sempre formatado com separador local. Trade-off: exige detecção de locale + formatação ao salvar; ganho: zero ambiguidade visual.🔴 Fricção 3 — ETH em 20 casas decimais (0,27425424248181698196…) ultrapassa precisão útil em pixel screen (cosmética — overflow textual)
0,27425424248181698196 excede largura do input mobile e desktop em grande parte dos viewports; o número vaza, é truncado com …, ou quebra layout. Em modo exploratório (user mexendo em range), o input dança visualmente cada vez que ETH recalcula. Distração estética em momento crítico.0,2742542424… (10 casas) com … clicável que expande para precisão completa em popover. Aceita "Copiar valor exato" no popover. Trade-off: esconde precisão visualmente; aceitar pela legibilidade — quem precisa do exato clica.🟡 Oportunidade competitiva — Validação semântica + sanity check em inputs de range/capital
min < max, valor > 0). Não validam semântica ("esse range faz sentido?", "esse Max é absurdo?"). Resultado: user comete erros caros (capital travado, range degenerado, fee tier desalinhado) sem aviso.+500% / -2%); (d) total > 80% do saldo da wallet; (e) fee tier desalinhado com range escolhido (vide PosPop #7); (f) APR estimado < 0 (IL maior que fees projetadas). Cada warning vem com explicação + ação sugerida. Override sempre disponível, mas com fricção de confirmação.Observação adicional — interpretação do number 26071406 é incerta. Pode ser (a) 26.071.406 (vinte e seis milhões — absurdo legítimo, user testou limite), (b) 2.607,1406 (duas mil e seiscentas — sensato; render perdeu separadores), ou (c) outro typo. A própria ambiguidade valida a Fricção 2 acima — se eu, analisando o screenshot com calma, não consigo decidir qual é o número, o user na hora do depósito também não consegue. Vale registrar essa observação como evidência empírica da fricção (o problema apareceu durante o próprio benchmark). Independente da interpretação correta, o aprendizado vale: formatação numérica sem separador é falha de UX, e em produto financeiro é falha estrutural.
Função: popup externo à Uniswap disparado pela wallet (provavelmente Phantom, dado o estilo do UI, ou MetaMask) ao clicar Create na Tela 16. É o ponto de transferência de soberania: a UX deixa de ser do produto Uniswap e passa pra UX da carteira. Mostra: origin (https://app.uniswap.org), Simulation Results (impacto em saldo), bloco Add Liquidity com parâmetros decodificados (chain, tokens, prices, contrato, protocolo), Advanced Settings colapsado, e fee de gás + CTAs Begin signing process / Cancel.
Componentes
https://app.uniswap.org (origin do request).Simulation Results (simulação pré-execução pela wallet):-1,000.0000 USDC com label ≈ $999.50 (linha vermelha = vai sair).-0.2377 ETH com label ≈ $529.02 (linha vermelha = vai sair).+1 unknown com badge NFT (linha verde = vai entrar; é o NFT da posição v3).Add Liquidity (decodificação semântica da call):View Raw (link à direita — pra dev/avançado).1,000.0000 USDC.0.2377 WETH.1 USDC ≈ 0.0004 WETH.1 USDC ≈ 0.0004 WETH.0.0056%.0xc36442…11e88 (link expandível).Uniswap V3 (com ícone).Advanced Settings (chevron).$0.67 -0.000303 ETH + dropdown Normal v.Jake's Port… + endereço 0x2de4f7…0bb01a + saldo $108,460.97.Begin signing process (rosa primário — unusual label).Cancel (secundário).Regras de negócio
Simulation Results é renderização do estado pós-execução (estimado). Reduz risco de "achei que ia perder $100 e perdi $500".+1 unknown com badge NFT é o NFT da posição v3 (Uniswap v3 emite NFT ERC-721 por posição — diferente de v2, que era ERC-20). Wallet não reconhece o NFT (ainda não está em registro padrão) → unknown.Interacted before: Yes é trust signal — wallet sabe que essa wallet já interagiu com esse contrato antes (não é primeira vez, então provável ser legítimo).Normal v dropdown: Normal/Fast/Aggressive/Custom).Begin signing process em vez de Confirm ou Sign é vocabulário da wallet específica.🟢 Insight 1 — Wallet faz simulação pré-execução e mostra o resultado antes da assinatura. "Você vai perder 1000 USDC, 0.2377 ETH, e receber 1 NFT" — em vermelho/verde, antes de assinar. Reduz a fenomenologia da "transação cega" típica de DeFi pré-simulação. Vitória de UX da wallet, não da Uniswap. Padrão a herdar pra Kotai (lado da Uniswap) — ainda que a wallet faça simulação, a Uniswap pode pré-mostrar o mesmo conteúdo dentro do modal de review (Tela 16), antes mesmo de chegar na wallet. Não fica refém de qual wallet o user tem.
🟢 Insight 2 — Decodificação semântica de Add Liquidity (chain, tokens, prices, protocol) substitui hex bruto. Sem essa decodificação, user veria 0xc36442…11e88::multicall(0x...) — incompreensível. Wallet conhece ABI do Uniswap v3 e traduz pra humano. Padrão a herdar — qualquer agent/wallet/produto que renderiza tx on-chain deve carregar ABI registry pra traduzir bytecode em texto.
🟢 Insight 3 — Pool Price vs Market Price + Price Diff 0.0056% é check anti-MEV embutido na wallet. Wallet compara cotação interna do pool com cotação de mercado (provavelmente CEX agregado) e mostra diff. User vê "o pool está a 0,0056% do preço de mercado" — confiança de que não vai ser sandwiched. Padrão a herdar — qualquer flow de swap/add-liquidity deve incluir este check (não só na wallet; também no produto).
🟢 Insight 4 — Interacted before: Yes é trust signal contextualizado. Wallet sabe a história da própria wallet com o contrato. "Você já fez add liquidity nesse contrato antes — não é primeira vez" reduz ansiedade de "isso é phishing?". Padrão a herdar — produto pode mostrar trust signals baseados em histórico do user ("você já fez essa ação 3 vezes") sem violar privacidade.
🟢 Insight 5 — Fee de gás editável com tier visual (Normal v) e equivalente USD ao lado ($0.67). User vê custo em fiat instantaneamente; pode subir pra Fast se pressa. Convenção madura de wallets. Padrão a herdar — qualquer custo de transação deve ter (a) tier nomeado, (b) valor em token, (c) equivalente USD, (d) override custom.
🔴 Fricção 1 — Transferência de UX Uniswap → Wallet é abrupta e rompe o "fio mental" do flow (estrutural — fronteira de produto rompe pedagogia construída)
Simulation Results, Add Token 1, Interact contract, Interacted before. Termos similares mas estrutura visual diferente, sem mapeamento explícito. Iniciante precisa re-traduzir o que entendeu na Uniswap pro que está vendo aqui. Risco: ele não reconhece que "Add Token 1: 1000 USDC" é o mesmo 1000 USDC da Tela 16. Hesitação no momento crítico = abandono.Create) que antecipa o vocabulário da wallet — "Ao clicar Create, sua carteira mostrará: 'Add Liquidity', 'Simulation Results', e um NFT como retorno (esse NFT é a sua posição). Esse vocabulário é da carteira, não da Uniswap.". Pequena ponte semântica que prepara o user. Trade-off: texto extra no modal; ganho: zero choque cultural na transição.🔴 Fricção 2 — +1 unknown com badge NFT rotula a posição v3 como "desconhecido" — semanticamente errado e potencialmente assustador (estrutural — wallet não reconhece NFT do produto core)
unknown (porque o NFT ainda não está em registro padrão de tokens da wallet). Iniciante lê "você vai receber 1 NFT desconhecido" e pensa: "o quê? não pedi NFT, isso é golpe?". Em flow legítimo de DeFi, um trust signal vira alerta. Pior caso: user clica Cancel. Causa raiz: gap entre o protocolo (que emite NFT) e os registros padrão da wallet (que demoram pra indexar novos contratos).unknown da wallet.unknown).🔴 Fricção 3 — Begin signing process como CTA primário é redundante e atípico (cosmética — label longo onde Sign ou Confirm cobriria)
Confirm ou Sign. O label longo pode ser tradução literal de variável interna ou A/B test, mas adiciona ruído. Pra iniciante, "begin a process" sugere múltiplos passos seguintes ("vou assinar e depois...?"); na verdade é o único clique.Sign ou Confirm é o canonical. Fora do escopo da Uniswap; vale registrar como observação.🟡 Oportunidade competitiva — Pré-simulação da transação dentro do modal de Review (Uniswap-side, antes da wallet)
Create e abrir wallet. Decisão de produto vs wallet: produto não duplica trabalho de simulação que a wallet vai fazer.Price Diff é 0.0056%. Toda essa info podia estar antes, no momento de "ainda posso voltar e ajustar". Pós-wallet, voltar é re-clicar tudo.Simulation Results + decode da call que a wallet vai mostrar. User confirma tudo no Uniswap; wallet vira mero "assinador" sem surpresa. Reduz ansiedade da fronteira.🟡 Oportunidade competitiva — Onboarding "primeira vez com wallet sign" embutido no Uniswap
Create.add liquidity. Tour com 4 cards: (1) Simulation Results = "preview do que vai mudar na sua carteira", (2) Add Liquidity = "Uniswap traduziu sua ação pra humano", (3) NFT = "sua posição vira NFT — é o título dela", (4) Gas fee = "custo da rede pra registrar isso, não é taxa da Uniswap". Dismiss = "Pular, sei o que faço".Observação adicional — wallet ativa "Jake's Port…" sugere que captura é de wallet de teste/demo. Endereço 0x2de4f7…0bb01a + saldo $108,460.97 + nickname "Jake's Port" indicam wallet de benchmark, não wallet real de produção. Não é fricção — é só registro do contexto de captura. Vale notar: capturas com wallet de demo são úteis pro benchmark (sem risco real), mas perdem realismo em fricções que dependem de saldo limítrofe ou primeira interação real. Pra completude do estudo, seria útil ter print de mesmo flow com wallet "vazia" (user iniciante real, sem histórico) — aí Interacted before: No viraria sinal de alerta da wallet, e a Fricção 1 (transferência abrupta) ficaria ainda mais visível.
Observação final do flow PosicaoPopulada (17 telas). Esse modal de wallet é o último ponto do flow capturado. Não há tela 18 confirmando "posição criada com sucesso" no canvas — o flow termina antes da confirmação on-chain. Sugestão pra completude: adicionar captura pós-sign (Uniswap mostrando "Position created", redirect pra /pool com nova posição visível na lista) — fechamento de loop importante pra avaliar UX de feedback de sucesso (componente que muitas DEXes fazem mal — confirmação fraca, sem CTA "ver minha posição agora"). Sem isso, o flow analisado é de decisão+commit, não de decisão+commit+confirmação — falta a última peça pra ciclo completo de LP onboarding.


O fluxo de Nova Posição entrega decisões pedagógicas acertadas na superfície — stepper vertical que sinaliza progressão desde a entrada (1), microcopy inline que educa sem exigir tooltip (1, 2), defaults do caso 90% (1) — mas é dominado por uma fricção estrutural transversal: a escolha de versão (v2/v3/v4) é o controle mais consequente do fluxo inteiro e recebe o menor investimento pedagógico. Aparece como chip discreto no canto (1), lança cross-sell desbalanceado quando o usuário já decidiu por v2 (2), expõe lista nua de opções sem trade-off (4) — e nunca orienta o iniciante sobre o que a decisão significa em termos de capital, risco e esforço de gestão. Perfis mais afetados: iniciante (cria posição em versão errada, enfrenta range concentrado sem conceito de price tick) e intermediário (percebe o erro tarde, já na Etapa 2).
O stepper vertical com 2 etapas visível desde a entrada (1) não é decorativo — é contrato com o usuário: "este processo tem dois passos, você está no primeiro". O refinamento aparece na Tela 2 (2): os labels se adaptam conforme a versão escolhida. Em v4: "Definir faixa de preço e valores de depósito"; em v2: "Inserir valores de depósito". O stepper comunica diferença arquitetural sem precisar de explicação extra — o usuário vê em segundos o que vai ser exigido no próximo passo. Concorrentes como PancakeSwap jogam tudo num formulário único; aqui o usuário tem âncora de progressão antes de começar a decidir. Padrão a herdar para Kotai: qualquer fluxo com >3 decisões interdependentes ganha stepper visível com labels que reflitam o que realmente vai acontecer em cada passo — não labels genéricos.
Instrução de campo vive abaixo do label, sempre visível, em linguagem que evita jargão técnico (1): "Escolha os tokens para os quais você deseja fornecer liquidez" em vez de esconder em tooltip ⓘ que iniciante não passa o mouse. O padrão se sofistica na Tela 2 (2): quando a escolha de v2 elimina o campo de fee tier, a section permanece visível com microcopy que explica o motivo — "Todos os pools v2 têm tarifa fixa de 0,3%. Para mais opções, oferte liquidez no v4." Manter a section visível e explicar o motivo é mais pedagógico do que remover silenciosamente (o que geraria "cadê o nível de tarifa?"). Padrão a herdar: quando uma decisão é eliminada por contexto, manter a section visível e usar o espaço para educar.
Múltiplas manifestações de transparência sobre o que o sistema está fazendo ou o que uma ação vai causar. O botão Continuar muda de outline cinza para preenchimento sólido quando habilitado (2) — sem texto auxiliar redundante, só mudança visual. O chip "Auto" exibe o valor calculado (2,5%), não esconde a heurística por trás de caixa-preta (3). O label "Nova posição de Vx" no dropdown sinaliza que clicar = redefinir o formulário, não ajustar in-place (4) — o verbo carrega a semântica da consequência. Padrão a herdar: estado e próxima ação sempre visíveis sem exigir que o usuário infira; quando uma ação é destrutiva ou irreversível, o label deve refletir isso.
Diagnóstico do atrito real: o controle de maior consequência do fluxo — versão define toda a arquitetura abaixo: range, fee tier, hooks, label do stepper, URL — recebe hierarquia visual de configuração secundária: chip no canto superior direito no mesmo eixo de Redefinir e ⚙ (1). No dropdown que expõe as alternativas, as opções aparecem como labels nus sem qualquer descrição do trade-off (4). Quando o usuário já decidiu por v2, uma frase de cross-sell unidirecional o empurra de volta para v4 sem oferecer o contra-argumento simétrico (2). A palavra "v2" se repete no chip, no stepper e na microcopy — nunca traduzida para o que significa em termos de comportamento para o usuário (2).
Consequências de segunda ordem: (a) iniciante defaultado em v4 enfrenta Etapa 2 com range concentrado — conceito que pressupõe entender price tick; (b) iniciante que "corrige" para v2 via dropdown pode perder os campos já preenchidos sem aviso (4); (c) o cross-sell "Para mais opções, oferte em v4" (2) incentiva o retorno à versão mais complexa exatamente quando o usuário tinha saído dela.
Por que a solução óbvia falha: promover versão para cartões hero na entrada impõe decisão técnica imediata — exatamente o que a UX atual evita ao defaultar v4. Mas o esconderijo cria a cascata acima.
Alternativa em dois planos:
Perfil afetado: iniciante (principal — cria posição em versão errada, enfrenta range sem ferramenta) + intermediário sem familiaridade com LP.
Diagnóstico do atrito real: o usuário completa par + versão + fee e o botão Continuar fica habilitado (2) — sem nunca ver o estado do pool para o qual está aportando capital. Em v2, par + fee = pool único; não há fee tier alternativa para escapar para um pool mais saudável. Um pool morto (WISE/ETH v2 0,3%: APR 0,00%, Volume 24h ↓81,84%) é armadilha invisível: o usuário aporta capital, acumula impermanent loss sem compensação de fee, não entende por quê, e interpreta como "o produto está me fazendo perder dinheiro".
Consequência de segunda ordem: o dano é assimétrico com o swap. Um swap em pool morto gera slippage pontual e discreto. Um aporte em pool morto mantém posição aberta com IL crescente — o usuário continua exposto enquanto não entender que deve sair.
Por que a solução óbvia falha: bloquear aporte em pool inativo é editorial e fere neutralidade de protocolo; aviso genérico no botão Continuar replica banner blindness.
Alternativa: card de estado do pool inline assim que par + versão ficam definidos: TVL + Volume 24h + APR + badge de atividade em pool existente. Em pool ainda inexistente: "Você será o primeiro provedor — você define o preço inicial" com warning de risco de arbitragem (caso de semântica completamente diferente, vide Observações adicionais). Colapsável em pool saudável; expandido forçado em pool morto ou pool novo.
Trade-off: adiciona altura ao formulário na Etapa 1; risco de overwhelming. Mitigação: colapsável default em pool ativo, expandido forçado em pool crítico.
Perfil afetado: iniciante (principal — não tem heurística de pool health) + intermediário descuidado.
Diagnóstico do atrito real: dois campos em telas distintas compartilham o mesmo padrão de ambiguidade na leitura do componente ou na semântica do label. Campo "Nível de tarifas" (1): caixa cinza com placeholder -- nível de tarifas + botão lateral "Mais ▾" — não fica claro se clicar no campo ou no botão abre a lista; a decisão de fee tier em v4 é estratégica (tier baixo = mais volume, menos fee/swap; tier alto = ao contrário) e a UI não orienta exploração. Label "Prazo final da transação" (3): sugere deadline absoluto (ponto no tempo), mas o valor "30 minutes" é janela relativa (30 minutos depois da submissão) — quando a transação expira, o iniciante não sabe se pode reenviar ou perdeu o trem.
Alternativas:
Perfil afetado: iniciante (principal) + intermediário sem familiaridade.
Padrão atual da indústria: Uniswap (chip discreto + dropdown de labels nus, (1) e (4)), PancakeSwap (toggle v2/v3 minúsculo no topo), 1inch (não expõe versão pra LP) — todos tratam versão como seleção de string técnica, não como decisão entre arquiteturas de LP com trade-offs distintos de risco e gestão.
Por que afeta nosso target: iniciante não sabe que v2 = constant product (deposite e esqueça), v3 = concentrated range (sai do range → para de ganhar fee → gestão ativa necessária), v4 = hooks + concentrated (ainda mais complexo). Default v4 (1) expõe o perfil mais vulnerável à versão que exige mais competência. O resultado é posições mal configuradas: range muito estreito, saída prematura, fees zero por semanas, abandono confuso.
Hipótese de diferenciação Kotai — três paths possíveis:
A solução atual — exposição técnica sem pedagogia — é a pior das três: expõe a decisão sem ajudar a tomá-la.
Trade-off: Path B adiciona 1 passo ao funil e frustra power user que sabe o que quer (mitigação: chip "Pular"). Path C depende de heurística acertada e perde controle explícito. Path A é seguro mas não é diferenciador.
Passa nas 4 perguntas-teste? (1) ✓ todos os DEX expõem versão como seleção técnica sem pedagogia; (2) ✓ afeta iniciante diretamente — posição mal configurada, fees zero, abandono; (3) ✓ razão = falta de investimento em UX pedagógica + cross-promo de versão mais nova; (4) ✓ ganho perceptível — iniciante vê "Simples" e escolhe v2; posição melhora.
Leverage estrutural — posicionamento "DEX que orienta iniciante na decisão arquitetural mais importante de LP".
Padrão atual da indústria: Uniswap (2), PancakeSwap, Curve — fluxo de criação de posição não exibe estado do pool destino na Etapa 1. A informação (TVL, Volume, APR) chega na Etapa 2, quando o usuário já está com mindset de "vou aportar", não de "devo aportar aqui?".
Por que afeta nosso target: usuário completa par + versão com base no nome do par, não na saúde do pool. Pool morto é armadilha invisível de IL sem compensação (ver Fricção 2 desta seção). O dano é maior para iniciante, que não tem heurística de pool health e interpreta IL como "o produto está me fazendo perder dinheiro".
Hipótese de diferenciação Kotai: card inline de estado do pool (TVL + Volume 24h + APR + badge de atividade) assim que par + versão ficam definidos — reusando componente de detalhe de pool (já existente no fluxo VisualizarPool). Colapsável por default em pool saudável ("Ver detalhes do pool ▾"); expandido forçado em pool inativo ou pool novo.
Trade-off: adiciona altura ao formulário na Etapa 1; pode sobrecarregar visualmente. Mitigação: colapsável em pool saudável, forçado expandido quando importa.
Passa nas 4 perguntas-teste? (1) ✓ todos os DEX adiam a info para Etapa 2; (2) ✓ afeta iniciante e intermediário direto; (3) ✓ arquitetura de funil herdada + receio de sobrecarregar Etapa 1; (4) ✓ ganho perceptível — "APR 0,00% / Volume ↓82%" aparece na janela de decisão de aporte.
Família cross-fluxo: Pools #1, #4 (sinalização de pool inativa), VisualizarPool 1. Leverage estrutural — posicionamento "Kotai te mostra onde você está aportando antes de aportar".
Padrão atual da indústria: Uniswap (Auto com valor fixo 2,5% sem critério exposto, (3)), PancakeSwap, 1inch — todos usam "Auto" como constante interna ou caixa-preta sem critério visível.
Por que afeta nosso target: em WISE/ETH (pool morto, profundidade baixa), 2,5% pode ser insuficiente → transação falha, usuário não entende por quê. Em USDC/ETH (pool líquido), 2,5% é absurdamente generoso → exposição a MEV. Iniciante não tem heurística por par e confia cegamente em "Auto".
Hipótese de diferenciação Kotai: "Auto" calcula slippage por profundidade do pool + volatilidade 24h + tamanho da transação. Tooltip do ⓘ existente expande com 1 frase do critério ativo: "Auto: calculado com base na profundidade do pool e na volatilidade recente. Para este par, 2,5%." Em par estável: Auto sugere 0,1%. Em pool morto: Auto sugere 5% + warning. Em pool líquido grande: Auto sugere 0,5%.
Trade-off: pricing engine inline é custo de engenharia real; dependência de oráculo externo cria latência; critério exposto gera reclamações se estiver "errado" — trade-off de implementação mais pesado que nas oportunidades anteriores.
Passa nas 4 perguntas-teste? (1) ✓ todos os DEX usam Auto opaco; (2) ✓ afeta iniciante e intermediário; (3) ✓ falta de investimento em pricing engine inline; (4) ✓ transação falha menos e absorve menos slippage — ganho perceptível.
Família cross-fluxo: 🟡 pré-visualização rica de transação DeFi (Swap), sinalização de pool inativa. Slippage adaptativo é a manifestação prática dessas oportunidades no momento do submit. Leverage médio-alto — afeta toda submissão de transação no produto.
Não há consolidado equivalente de PancakeSwap para este fluxo. O mais próximo seria adicionar-liquidez, ainda sem análise consolidada. Comparação a completar após análise de adicionar-liquidez do PancakeSwap. Link futuro: Consolidado PancakeSwap — Adicionar Liquidez.




Função: página de detalhe da pool ETH/USDC v3 0,05% (0x88e6…c5C7) servindo como entrypoint do flow de criação de posição. Diferente de VisualizarPool (pool WISE/ETH v2 morto), aqui o pool é live e saudável — usado pelo benchmark exatamente pra mostrar a UX no estado "vale aportar". O user está na fase de avaliar a pool antes de clicar em "Add liquidity".
Componentes
Pools › ETH / USDC.v3 + fee 0,05% + setinha de inverter par + endereço encurtado 0x88e6…c5C7 + ícones (chart toggle, share, "…").Apr 12, 2026, 8:43 PM (volume do dia destacado no chart).30.6K ETH | 59.7M USDC.$111.0M ↑2.0%.$47.8M ↑76.6%.$143.4K.Regras de negócio
Total APR = (24h fees × 365) / TVL — yield observado anualizado da pool inteira. Não reflete APR específico de range escolhido em v3.Liquidity só existe em pools v3+ (v2 só tem Price/Volume). Decisão arquitetural — distribuição de liquidez por tick é conceito específico de concentrated liquidity.+ Add liquidity (não Swap), sinalizando que essa página foi pensada como entrypoint do LP, não do trader.🟢 Insight 1 — Pool detail bem populado vira "argumento de venda" do LP, não só relatório. O contraste com WISE/ETH (VisualizarPool, APR 0,00% / Volume ↓81%) é gritante: aqui o mesmo template entrega APR 47% / Volume ↑76% / Fees $143K. Mesma estética, mesmos slots, mensagem totalmente oposta. Padrão a herdar pra Kotai — o componente "Pool Stats" deve resistir ao caso bom e ao caso ruim sem precisar de tratamento gráfico diferente; o number é quem fala. Quando o template não diferencia, a UI escala.
🟢 Insight 2 — CTA primário é + Add liquidity, não Swap. Decisão deliberada de hierarquia: o user que aterrissa numa pool detail é mais provavelmente um candidato a LP (chegou via Pools List, breadcrumb explícito) do que um trader (que iria pelo /swap direto). Hierarquia visual reflete intenção. Padrão a herdar — CTA primário herda a intenção do funil que trouxe o user, não o "verbo mais agressivo" possível.
🟢 Insight 3 — Tooltip "Fees: $2.4K" no bar do chart conecta volume e fee. Ao passar o mouse no bar de volume, o user vê quanto aquele volume gerou de fee — entrega o loop pedagógico Volume → Fees → APR sem precisar de relatório separado. Família com 🟡 "Narrativa do chart" (VisualizarPool #2) — aqui o produto já entrega narrativa local, sem precisar de caption.
🟢 Insight 4 — Tab Liquidity como dimensão extra em v3. Pool v3 ganha view de distribuição de liquidez (que vira a Tela 2 deste flow). Não é decoração — é a ferramenta principal de decisão de range pra LP de v3. Padrão a herdar pra Kotai — quando a arquitetura adiciona dimensão (range, hook, etc.), a página de detalhe ganha tab dedicada, não popup secundário.
🔴 Fricção 1 — Total APR 47,16% em fonte gigante é o APR médio da pool, não o APR do range que o user vai escolher (estrutural — vetor de FOMO direto em v3)
47,16% é a média ponderada — não promete nada a uma posição específica. Mas a fonte gigante + label "Total APR" sem qualificador induz iniciante a pensar "vou ganhar 47% se aportar aqui". Erro de leitura é o mais perigoso de v3: user aporta full range esperando 47% e ganha 8%, ou aporta tight range esperando 47%, fica out-of-range em 2h e ganha zero.Total APR médio remove a comparação grosseira útil entre pools; trocar pra "APR médio (varia por range)" em letra menor não muda o peso visual; tooltip ⓘ é dismissado.🔴 Fricção 2 — Tab Liquidity aparece sem affordance de que é específica de v3 (cosmética-estrutural — feature avançada disfarçada de "mais uma view")
Price / Volume / Liquidity aparecem como peers visuais — mesma altura, mesmo peso, mesma cor. Mas Liquidity é dimensão exclusiva de v3+ (vide regras de negócio); user que migrou de v2 nunca viu essa tab antes. Sem onboarding inline (badge "Novo", "Específico de v3", ou tooltip), o user clica esperando "outra visualização do mesmo dado" e cai na curva de liquidez (Tela 2) — gráfico abstrato que precisa de pedagogia (vide Fricção 1 da Tela 2).Liquidity, tooltip inline aparece com 1 frase explicando o conceito + link "Saiba mais" — onboarding contextual de feature avançada. Sessões subsequentes não mostram. Trade-off: exige state de "user já viu" (cookie/localStorage); ganho: feature explicada no momento do primeiro contato, não em manual separado.🔴 Fricção 3 — UI em inglês quebra continuidade com o resto do produto (PT-BR) (estrutural — fricção de i18n de captura ou de produto)
Trade / Explore / Pool / Portfolio / Swap / Add liquidity / Transactions / Time / Type / Wallet / Total APR / Pool balances / TVL / 24h volume / 24h fees. O flow Nova Posição (analisado em outras telas) está em PT-BR (Negociar / Explorar / Pool / Portfólio / Fazer swap / Nova posição / Continuar). Duas possibilidades: (a) a captura foi feita em locale diferente do resto (problema do benchmark, não do produto); (b) o produto realmente serve a página detail em EN e o flow Nova Posição em PT-BR (inconsistência real). Se for (b), é fricção grave — o user que navega Pools › ETH/USDC em PT-BR vê de repente cabeçalho EN, perde âncora de "estou no mesmo produto?".30 minutes (Nova Posição #3 settings), e potencialmente página inteira aqui.🟡 Oportunidade competitiva — APR estimado por range simulado direto na pool detail
Total APR (médio da pool) como number único na pool detail. APR estimado por range só aparece dentro do flow de criação de posição, quando o user já está com mindset de aportar. A janela de decisão "vou aportar aqui? em que range?" não recebe info — só o number médio.Observação adicional — + Add liquidity como CTA na pool detail aterrissa no flow Nova Posição com par já pré-preenchido. Decisão de produto importante: o user que clica daqui pula a Etapa 1 do Nova Posição (Selecionar par) ou cai nela com ETH/USDC já preenchido. Em qualquer dos dois, a versão default (v4 segundo Nova Posição #1) pode não coincidir com a versão da pool em que o user estava (v3 nesta tela). Fricção potencial: user clicou em "Add liquidity" numa pool v3 e o flow abre em v4. Não consigo confirmar com esta captura isolada, mas é decisão a verificar — herdar versão do contexto de origem (v3 aqui → flow começa em v3) é a expectativa do user.
Função: captura nomeada PosicaoPopulada4.png que, em pixels, é idêntica à Tela 3 — mesmas dimensões (1920×1080), ImageChops.difference() retorna bbox vazio. Diferem só no encoding PNG (md5 diferente, mesmos pixels). Portanto não é um novo estado de UI da Uniswap; é uma duplicata do print da Tela 3 dentro da pasta de captura. Registro aqui como artefato de benchmark a corrigir, não como fricção do produto.
Componentes
1 WETH = 2,235 USDC, sidebar Stats com Total APR 47,16%, tabela Transactions com Add/Remove/Buy/Sell, section Links no rodapé.)Regras de negócio
🟢 Insight — Decisão correta: não inventar análise quando não há sinal. Per CLAUDE.md ("Não invente fricção pra preencher campo — se a tela genuinamente não tiver atrito relevante, diga isso e justifique"). Aqui não há tela, há cópia. A análise crítica é admitir isso e propor saneamento do dataset.
🔴 Fricção (de benchmark, não de produto) — Slot de captura ocupado por duplicata cega o flow (cosmética, escopo: organização do canvas)
Observação adicional — protocolo pra detectar duplicatas no resto do flow. Vale rodar md5 + PIL ImageChops.difference() em todo o BenchmarkUniswap antes de continuar a análise. Se há uma duplicata sutil aqui, pode haver outra entre as 17 capturas. O custo de detectar é um script de 5 linhas; o custo de analisar duas vezes a mesma tela é proporcional ao detalhe do relatório (vide Telas 1–3, que somam ~3k palavras cada).
Função: mesma view de Liquidity da Tela 2, agora com marker do tick ativo sobreposto à curva + section Links revelada no rodapé. Estado capturado em momento posterior à Tela 2 (preço caiu de $2.359 pra $2.235; Pool balances ajustados — vide observação da Tela 2). A page exibe simultaneamente "onde está o capital depositado" (curva) + "onde está o preço agora" (marker) + "fundamentos on-chain" (links de contrato).
Componentes (diff em relação à Tela 2)
ETH / USDC + endereço 0x88e6…0572 + ícones copy/abrir.Regras de negócio
🟢 Insight 1 — Marker "Active tick range" sobre a curva conecta liquidez e preço no mesmo eixo visual. Tela 2 mostra a curva, Tela 3 anota onde o preço está. Iniciante decoda em 1 segundo: "o pico de liquidez está exatamente onde o preço está agora — então a maior parte dos LPs colocou tight range em torno deste preço". Sem o marker, a curva é um gráfico abstrato; com o marker, vira mapa. Padrão a herdar pra Kotai: visualizações pesadas de v3 precisam de âncora de localização explícita; sem ela, o gráfico se autocomenta mal.
🟢 Insight 2 — Tabela de Transactions mistura LP-side (Add/Remove) e trader-side (Sell/Buy) na mesma stream. Decisão pedagógica importante — sinaliza que o pool tem dois tipos de fluxo: gente entrando/saindo como LP (Add/Remove muda reservas e curva), e gente fazendo swap (Sell/Buy muda preço). Mesma tabela exposição combinada permite o user observar correlações ("um Remove grande antes do preço cair" — sinal de LP saindo antecipando movimento). Padrão a herdar — separar essas streams em tabelas distintas perde a correlação temporal.
🟢 Insight 3 — Atualização live de Pool balances revela a mecânica do AMM. Preço caiu de $2.359 pra $2.235 → ETH subiu de 30,6K pra 33,0K no pool. O user que vê os dois prints lado a lado decoda intuitivamente "quando ETH cai, o pool absorve mais ETH" — mecânica de constant product entendida por observação, não por leitura de whitepaper. Padrão a herdar — produto cripto deve revelar mecânica protocolar pela observação, não pela explicação textual.
🔴 Fricção 1 — Label "Active tick range" é ambígua: pode significar (a) tick atual da pool ou (b) range ativo da posição do user (estrutural — vetor de leitura errada)
🔴 Fricção 2 — Mudança de preço entre Tela 2 e Tela 3 (2.359 → 2.235, queda de 5,3%) sem âncora temporal (cosmética — para uso analítico do canvas; estrutural — para user real)
🔴 Fricção 3 — Section "Links" tem só pool address; tokens individuais não estão listados (estrutural — inconsistência com VisualizarPool #3)
🟡 Oportunidade competitiva — Simulador de posição direto na curva (clicar na curva = "se eu colocasse range aqui...")
Observação adicional — flow capturado é "user sem posição". As 3 telas todas mostram o pool detail no estado "user não tem posição neste pool" (não há LP overlay no chart, não há card "Suas posições" na sidebar). Pra uma pasta chamada "PosicaoPopulada", isso é estranho semanticamente — o nome sugere "user já tem posição populada", mas as 3 primeiras capturas mostram o pré-aporte. Provavelmente o flow inteiro (1–17) é "como populamos uma posição neste pool", e 1–3 = entrypoint, 6–15 = criação, 16–17 = confirmação. Faz sentido como rebobinamento, mas vale registrar pra futura organização do canvas — a pasta poderia se chamar "FlowLPv3" ou "CriacaoPosicao" pra refletir o flow completo, não só o estado final.
Função: mesma page de detail, agora com tab Liquidity ativa. Substitui o histogram de Volume da Tela 1 pela curva de distribuição de liquidez por tick — ferramenta canônica de v3 pra LP decidir range. Big stat de Volume sai; conversões de preço atual entram no topo.
Componentes (diff em relação à Tela 1)
Price / Volume / **Liquidity** ✓ (mudou).$805.2K + data.Regras de negócio
🟢 Insight 1 — Conversões bidirecionais (1 WETH = 2,359 USDC + 1 USDC = 0,0004239 WETH) eliminam o cálculo mental. Iniciante que pensa "tenho 100 USDC, quanto é em WETH?" não precisa inverter 2,359 — vê direto 0,0004239 × 100 = 0,042 WETH. Decisão de copy aparentemente pequena que economiza fricção real. Padrão a herdar pra Kotai: quando uma razão pode ser lida em duas direções (preço/preço inverso), exibir ambas é mais barato que assumir que o user inverte mentalmente.
🟢 Insight 2 — Curva em "agulha" comunica visualmente que esse pool é hiper-concentrado no preço atual. A forma do gráfico é a mensagem: pico estreito = capital concentrado no tick atual; cauda longa = pouca liquidez nas margens. LP novo vê em 1 segundo: "a maior parte dos LPs apostou aqui mesmo". Não precisa ler eixo nem entender unidade pra absorver a informação principal. Padrão a herdar — gráfico cuja forma carrega a primeira camada de informação reduz dependência de legibilidade técnica.
🔴 Fricção 1 — Curva de liquidez sem legenda explicando o que cada eixo significa (estrutural — visualização poderosa mas ilegível pra iniciante)
Liquidity (USD), Price (USDC per ETH)) com gridlines numeradas poluem o gráfico abstrato; perdem a leveza da "agulha".🔴 Fricção 2 — Sem marcador visível do preço atual sobreposto à curva (estrutural — informação ausente no momento crítico)
~$2.359 colado no topo da linha. Igual à Tela 3, que já tem isso — então a fricção pode ser na verdade inconsistência entre Tela 2 e Tela 3 do mesmo template (a Tela 3 mostra a curva com marker, esta não — possivelmente porque foram capturadas em momentos diferentes do mesmo carregamento). Vide observação adicional.🔴 Fricção 3 — Tab Liquidity muda o chart e o stat principal sem aviso visual (cosmética; quebra de modelo de tabs)
$805.2K do canto superior do chart e entra as conversões 1 WETH = 2,359 USDC. User espera que mudar tab só mude o gráfico, e percebe (ou não) que o KPI grande sumiu. Tela 1 = Volume + número do dia; Tela 2 = Liquidity + conversões; provavelmente Tela Price = Preço + preço atual. Cada tab tem sua "âncora numérica" — decisão arquitetural defensável mas não anunciada.$805.2K em todas as tabs perde semântica (volume não faz sentido como hero em Liquidity); manter o slot vazio em Liquidity vira buraco visual.$805.2K Apr 12 volume; Liquidity tab: ~$2.359 preço atual; Price tab: idem. A "âncora numérica" muda com a tab, mas o slot permanece previsível. Trade-off: exige decisão de "qual é o number representativo de cada tab" (já existe implicitamente; só precisa formalizar).🟡 Oportunidade competitiva — Anotações pedagógicas inline na curva de liquidez
Observação adicional — capturas Tela 1 / Tela 2 / Tela 3 são prints em momentos diferentes, não estados do mesmo momento. O preço passa de $2.359 (Tela 2) pra $2.235 (Tela 3) com Pool balances mudando de 30,6K ETH pra 33,0K ETH. Esses dados não podem ser todos do mesmo instante. Pra análise do canvas/benchmark, isso é ruído de captura (não fricção do produto); pra Kotai vale registrar que prints sequenciais de telas live carregam armadilha analítica: comparações entre telas podem confundir mudança real do mercado com mudança de estado de UI.
O flow "Posição Populada" cobre o ciclo completo de LP v3 — avaliação de pool (1–3), hub de posições existentes (5), criação em stepper de 2 etapas (6–15), modal de revisão (16) e assinatura na wallet (17). É o flow mais longo e mais rico em decisões financeiras do benchmark Uniswap.
O produto é arquiteturalmente sofisticado: progressive disclosure em todas as camadas, defaults informados por comportamento agregado, re-cálculo client-side instantâneo, wizard não-destrutivo que preserva estado em todas as transições. Para o avançado, o flow é coerente.
Para iniciante e intermediário (nosso target), o atrito se concentra em três eixos que se repetem do início ao fim: variáveis acopladas (fee × range × APR × denominação) tratadas como decisões independentes em steps sequenciais; ausência de guard-rails semânticos (produto valida sintaxe, nunca plausibilidade); transições que avançam sem antecipar o passo seguinte. O iniciante entra com confiança — entrypoint limpo (1), CTA correto — encontra o maior atrito no Step 2 (9–12) e chega ao commit (16–17) sem calibração de expectativa.
O flow concentra a maior densidade de oportunidades competitivas de qualquer flow Uniswap analisado — especialmente no eixo "simulação antes de commit", onde múltiplas peças formam um sistema coerente de diferenciação.
Progressive disclosure não é recurso pontual — é o padrão arquitetural dominante do produto em todos os níveis. Na pool detail, as três tabs Volume → Liquidity → Active Tick (1, 2, 3) adicionam camadas sem quebrar as anteriores. No fee tier, 1 linha colapsada (7) expande em 4 cards com 3 dimensões de evidência (8). No range, Full/Custom como tabs de entrada (9) se desdobram em presets (10), drag no chart, e inputs textuais (11). Cada decisão tem superfície mínima no default e superfície máxima sob demanda. Padrão sistemático a herdar pra Kotai: feature complexa não precisa de tab dedicada — precisa de camada de disclosure sob demanda.
O produto posiciona ações e vocabulário consistentemente pelo contexto de chegada, não pelo "verbo mais agressivo". Na pool detail, CTA primário é + Add liquidity (não Swap) porque quem aterrissa via Pools veio pra LP (1). No Step 2, default é Custom range (não Full range) porque o user escolheu v3 — concentrated liquidity é o ponto (9). No fim do Step 2, o botão diz Review (não Submit) — sinalizando que há mais um passo (13). No modal, diz Create (não Confirm) — vocabulário do LP, não do trader (16). Padrão a herdar: CTA primário herda a intenção do funil; label de CTA reflete a consequência, não o verbo técnico.
Decisão de copy aparentemente pequena mas com impacto real: conversões bidirecionais 1 WETH = 2,359 USDC + 1 USDC = 0,0004239 WETH na pool detail (2) eliminam inversão mental. Min/Max em quote token (WETH/wTAO) no card de posição (5) é convenção saudável de par heterogêneo. Equivalente USD ao lado de todos os token amounts — ($1.000,00) / (~$487,10) no Step 2 (13) e $0.67 de gás na wallet (17) — ancora o usuário em fiat em todos os momentos críticos. Padrão a herdar pra Kotai: quando uma razão pode ser lida em duas direções, mostrar ambas; todo token amount exibe equivalente USD ao lado.
Decisões críticas têm múltiplas vias de entrada sem poluir UI, porque coexistem na mesma tela e compartilham estado bidirecional. Fee tier: badge resumido (7) → 4 cards expandidos com label + TVL + share (8). Range: tab Full/Custom (9) → presets (10) → drag no chart → inputs textuais (11). Deposit: editar Min price no input numérico recalcula ETH no campo de depósito (13) — estado único, zero dessincronização (14). Padrão a herdar: decisão crítica com múltiplas vias de input, cada perfil tem caminho, todas as vias convergem no mesmo estado.
Em nenhuma transição o flow destrói o estado do user. Edit no header do Step 2 volta ao Step 1 sem limpar o range configurado (9). Reset está disponível pra desfazer range e zoom (12). Modal de review mantém o Step 2 visível por trás em overlay translúcido (16) — user pode cancelar e voltar com tudo preenchido. A Tela 16 confirma que o user explorou múltiplas configs de range antes de chegar no Review (16) — sinal de que o flow suporta exploração não-linear. Padrão a herdar: flows multistep preservam estado em toda etapa e oferecem re-entry contextual (Edit), não Back/Cancel.
Quando o produto pré-seleciona, o critério é fato observável, não julgamento editorial. Fee tier default = tier de maior TVL no par (7). Badge Highest TVL em vez de Recommended ou Best — descritivo, não prescritivo (8). Distribuição completa de share (77,985% select / 16,685% / 5,715% / 0,007%) devolve agência ao user — ele vê a convenção, decide se segue. Padrão a herdar: quando produto pré-seleciona por popularidade, mostrar a distribuição completa (não só o vencedor) preserva escolha informada.
O flow apresenta múltiplos APRs — todos calculados corretamente, todos com semântica inaplicável à decisão que o user está prestes a tomar.
Total APR 47,16% em fonte gigante na pool detail (1) é média ponderada da pool inteira. Em v3 (concentrated liquidity), o APR real de uma posição depende fortemente do range escolhido: LP tight pode ganhar 10× o APR médio se ficar in-range; LP full range ganha menos que a média. O number 47% não promete nada a uma posição específica — mas a fonte gigante induz FOMO no iniciante. Na Tela 5, APR 40,06% no card de posição (5) ignora impermanent loss — posição pode ter ganhado $1.142 em fees e perdido $2.000 em IL. No Step 1, o fee tier default 0,05% é o de maior TVL (7), mas 0,05% é o tier de menor fee por trade — ideal pra LP full range, subótimo pra LP tight. O default "correto" em TVL é incorreto em APR para a estratégia de range que o iniciante provavelmente vai escolher. Na expansão dos fee tiers (8), o APR histórico por tier está ausente — o user vê TVL e share, mas não retorno.
Nota: os blocos das telas 5 e 8 são 🟡 (oportunidade) nos drafts de origem — a fricção de APR opaco emerge do contexto das oportunidades identificadas nessas telas; a atribuição cruzada é intencional.
Raiz comum: produto apresenta APR como métrica isolada, mas APR em v3 é uma função de três variáveis acopladas — range, fee tier e capital. Apresentar qualquer das três sem as outras duas é entregar número correto com semântica errada.
Solução estrutural: substituir Total APR na pool detail por par de numbers — "APR full range: X% / APR tight (±1%): Y%" (1). No card de posição, acrescentar IL estimado ao APR (5). No Step 1, vincular a sugestão de fee tier à estratégia de range que o user vai escolher no Step 2 (7). Trade-off: cálculo de APR por range exige pricing engine client-side + caveat de variabilidade. Aceitar com caveat explícito. Perfil afetado: iniciante (principal — único alvo direto de FOMO por número opaco) + intermediário sem heurística de concentrated liquidity.
A fricção de maior frequência do flow, com 4 manifestações cross-lote e raiz única: produto valida sintaxe (min < max, valor > 0) mas nunca valida semântica ("essa config faz sentido financeiramente?").
Manifestações em sequência: (1) clicar em preset Stable (±3 ticks) estando na tab Full range muda a tab para Custom silenciosamente (10); (2) range assimétrico -1,85% / +124% — bound inferior muito tight (preço sai em horas), bound superior absurdo (124% acima) — aceito sem comentário (11); (3) aumentar Max price aumenta o capital necessário em ETH silenciosamente — user tinha $1.487, agora precisa de $2.082, sem alerta de delta (14); (4) Max price = 26.071.406 (ETH a $26M, provavelmente typo) aceito com Review ativo — depositaria capital que nunca alcançaria o lado-ETH (15).
Em produto financeiro com transações on-chain irreversíveis, validação semântica não é detalhe de UX — é guard-rail essencial. O custo de um warning indevido (usuário power confirmando config intencional) é mínimo; o custo de ausência de warning (iniciante travando capital em range absurdo) é o capital em si.
Solução estrutural: Sanity Layer — sistema de warnings inline contextuais, ativados por heurísticas específicas: Max > 100× preço atual; range assimétrico > 10×; fee tier desalinhado com range (0,05% + tight = subótimo); capital a depositar > 80% do saldo da wallet; APR estimado < 0 (IL > fees projetadas). Cada warning com explicação + ação sugerida + override disponível. Trade-off: heurísticas podem ter falsos positivos em apostas legítimas (aceitar com toggle "Não mostrar de novo"). Perfil afetado: iniciante (crítico — único que comete typos e aceita configs quebradas sem perceber) + intermediário descuidado. Avançado: override sempre disponível, impacto nulo.
O padrão estrutural de maior peso analítico do flow. Fee, range, APR, denominação e capital são variáveis matematicamente acopladas — mudar uma muda todas. O produto as apresenta como decisões sequenciais independentes.
Fee tier é escolhido no Step 1 (7) sem que o user saiba ainda qual será o range. Mas 0,05% (default) é subótimo para range tight; 0,3% é melhor para moderate; 1% para tight. Decisão de fee feita antes de decisão de range = acoplamento invertido. A denominação default no Step 2 (USDC ✓, mostrando 0,00045 WETH/USDC) é contraintuitiva para iniciante que pensa em $/ETH — confirmado empiricamente: o user trocou para ETH ✓ dentro do próprio flow (9), o que reflete em USDC/WETH = $2.233 na Tela 11 (11). Os markers de range são exibidos em % relativo (11) enquanto os inputs Min/Max price são em $ absoluto (12) — dois sistemas de coordenada na mesma tela. Ao ajustar Max price, o capital necessário muda (14) e a relação range↔deposit é exibida em sections visuais separadas (13) — user precisa olhar dois lugares ao mesmo tempo para entender o acoplamento.
Raiz arquitetural: o flow é herdado da semântica matemática de v3 (fee tier é propriedade da pool; range é propriedade da posição — são layers diferentes). O produto os expõe na mesma sequência da construção técnica, não da intenção do user.
Solução estrutural: inverter a ordem do Step 1 — perguntar estratégia (Full range / Moderate / Tight) primeiro, derivar fee tier como consequência. Denominação default = stablecoin-as-quote em pares com stablecoin (regra de roteamento). Markers com dual-label $ primário + % secundário. Sticky footer com total dinâmico + delta à cada mudança de range. Trade-offs: quebra paridade com Uniswap; requer regra de "stablecoin detection" para denominação. Perfil afetado: iniciante (principal) + intermediário sem heurística de concentrated liquidity.
Padrão recorrente em todas as transições do flow. Continue no Step 1 não diz o que falta para habilitá-lo — botão cinza silencioso (6). Review no Step 2 não mostra resumo do que está sendo levado para revisão — user clica sem ter certeza do total (13). Create no modal não antecipa que abrirá um prompt externo de wallet — usuário se assusta com a mudança de contexto (16). A wallet recebe o user com vocabulário diferente (Simulation Results, Add Token 1, unknown NFT) sem mapeamento explícito do que ele configurou na Uniswap (17).
Raiz comum: produto trata cada tela como unidade autônoma em vez de etapa de uma cadeia com promessa implícita. CTAs avançam sem antecipar consequências.
Solução estrutural: label dinâmico no Continue descrevendo o que falta (Selecione o segundo token → / Escolha o fee tier →) (6); sticky footer com total + APR estimado antes do Review (13); Create position (1 wallet signature required) como label do CTA no modal (16); microcopy de bridge semântica antes do Create — "Sua carteira mostrará 'Add Liquidity', 'Simulation Results' e 1 NFT representando sua posição" (17). Perfil afetado: iniciante (principal em todas as manifestações).
O produto empurra conceitos de versão (v2/v3/v4) sem dar contexto para decidir. Tab Liquidity na pool detail (1) aparece como peer visual das tabs Volume e Price, sem badge "Exclusivo de v3" — usuário de v2 não sabe que está entrando em território novo. No flow de criação, o dropdown v4 position no header global compete com o stepper Step 1: Select token pair como "primeiro passo" (6) — dois sistemas de navegação no mesmo nível visual, sem hierarquia. Trocar de v4 para v3 remove affordances silenciosamente: + Add a Hook (Advanced) some sem microcopy explicando a perda de capacidade (7).
Solução: onboarding contextual na primeira vez que o user clica em Liquidity (tooltip com 1 frase + link "Saiba mais") (1); card-comparador de versões no início do flow de criação em vez de dropdown nu (6); microcopy dinâmica embaixo do dropdown descrevendo o que cada versão inclui ou perde (7). Perfil afetado: iniciante (principal) + intermediário vindo de v2.
Produto reutiliza label único para estados semanticamente diferentes, transferindo o custo de decodificação para o user. Total APR não qualifica se é APR médio da pool ou APR de posição específica (1). Active tick range na curva de liquidez (3) pode significar (a) tick atual da pool (correto nessa captura — user sem posição) ou (b) range ativo da posição do user (quando user tem posição) — a análise prévia do canvas diagnosticou errado por exatamente essa ambiguidade, confirmando o problema. + New no header da seção de posições (5) diz apenas "Novo" — nova posição? novo pool? nova carteira? Em outro ponto do mesmo produto (/pool/nova) o label é + Nova posição. Na wallet, +1 unknown com badge NFT (17) rotula como desconhecido o NFT que é a posição LP — causa raiz na wallet, mas mitigável por antecipação no modal de review.
Solução: label dinâmico por estado (Active tick range → Preço atual quando user sem posição; Sua posição (in-range) / Sua posição (fora do range) quando user tem posição); + New position completo com movimentação de filtros para ícone colapsado; antecipação do NFT no modal de review. Perfil afetado: iniciante (principal).
O Step 2 abre com toggle USDC ✓ como default (9), mostrando 0,00045 WETH/USDC — i.e., quantos WETH por 1 USDC. Em par com stablecoin, a direção convencional cripto-nativa é $X por ETH (stablecoin como quote), que o toggle ETH ✓ entregaria como $2.233 USDC/WETH. Essa fricção não é hipótese: o user trocou o toggle dentro do próprio flow — a Tela 11 (11) mostra ETH ✓ ativo e USDC/WETH ($2.233,08) como denominação, evidência observacional direta de que o default era contraintuitivo. Raiz: produto usa token0 do contrato (USDC) como referência padrão — decisão arquitetural correta internamente, semanticamente confusa para usuário.
Solução: default de denominação = stablecoin-as-quote em pares com stablecoin; regra de roteamento detecta stablecoin no par e inverte automaticamente. Trade-off: requer detecção de stablecoin no client; ganho: iniciante vê o preço que ele conhece desde a Tela 1. Perfil afetado: iniciante (principal) + intermediário em pares heterogêneos.
Família de fricções com raiz comum: produto não faz layer de tradução de terminologia técnica para o mental model do usuário-alvo. Toda a pool detail está em inglês (1) enquanto o flow de criação aparece em PT-BR — inconsistência de locale que quebra a âncora "estou no mesmo produto". % select nos cards de fee tier (8) é número preciso (4 casas decimais) sem unidade definida — % de posições? de TVL? de fluxo recente? As 3 interpretações existem e levam a decisões diferentes. Preset Stable: ±3 ticks (11) usa unidade tick — conceito de discretização de preço em v3 que iniciante nunca encontrou; os outros presets usam % humano (inconsistência de unidade entre peers visuais). Input de Max price sem separador de milhar (15) cria ambiguidade entre 26.071.406 e 2.607,1406 — ambiguidade que não se resolve visualmente e que o analista do próprio benchmark não conseguiu dirimir.
Solução: garantir locale consistente (ambos EN ou ambos PT-BR); % select → dos LPs escolhem este tier (explícito); ±3 ticks → ±0,03% com tooltip "equivalente a ±3 ticks"; formatação numérica on-blur com separadores de milhar conforme locale. Perfil afetado: iniciante (principal para jargão e locale) + todos (formatação numérica).
Em dois pontos o produto usa o rodapé como confessionário. Na pool detail (3), a seção Links mostra só o endereço do pool sem os tokens individuais — enquanto em VisualizarPool #3 mostra pool + token A + token B. Provavelmente inconsistência de template v2 vs v3. Na hub de posições (5), caption pequena no rodapé admite "Some v3 positions aren't displayed automatically" + link "Import V2 positions" — dois problemas misturados (v3 com discovery automática falha; v2 exige import manual) sem ação concreta para o user entender se a posição dele está completa. Iniciante lê e perde confiança no dashboard: "será que falta algo?".
Solução: padronizar seção Links em todos os pool details (pool + token A + token B); separar as duas mensagens da caption em banners condicionais com contexto explícito e ação direta. Perfil afetado: iniciante (principal).
0,45830405644617936 ETH (14) e 0,27425424248181698196… ETH (15) em contexto de exploração de range. Diferente da Tela 13 (finalização — onde precisão honesta é trust signal), aqui o user está em modo iterativo, ajustando range e vendo o ETH dançar com 17+ casas. Distração visual em momento crítico. Solução: display truncado (5 casas) por default com expand-on-hover para precisão completa + "Copiar valor exato". Perfil afetado: iniciante + intermediário em modo exploratório.
Reset em Full range (10) é inerte (já está no máximo) mas presente — affordance que não faz nada quebra contrato implícito. No zoom-out (12) com range custom configurado, Reset pode resetar só o zoom, só o range, ou ambos — nenhuma das três é óbvia. Solução: Reset com dropdown inline ao clicar: [Resetar zoom] / [Resetar range] / [Resetar tudo]. Desabilitar em Full range com tooltip. Perfil afetado: todos os perfis.
Padrão atual da indústria: Uniswap, PancakeSwap, KyberSwap, Curve — em todos, a simulação de APR/IL/probabilidade de in-range acontece depois do commit ou não acontece. APR estimado por range só existe dentro do flow de criação, nunca na pool detail. Presets de range são nomeados por forma geométrica (Stable/Wide/One-sided), não por resultado esperado. O chart histórico é estático — leitura passiva, não interação exploratória.
Por que afeta nosso target: o iniciante e intermediário tomam a decisão de range com base em "parece largo o suficiente?" — heurística que falha em par volátil. A sub-utilização de v3 (full range em pool concentrada) é endêmica e resulta em "v3 não rende como diziam". Ninguém resolveu porque exige investimento em modelo de volatilidade + engine de simulação client-side.
As 8 peças do sistema:
A1 — APR estimado por range na pool detail (1): slider de range embutido na sidebar de Stats da pool detail, com APR estimado atualizando ao deslizar. User compara full range → 8% vs ±2% → 45% sem entrar no flow. Diferenciação desde o entrypoint.
A2 — Anotações pedagógicas inline na curva de liquidez (2): sobre a curva, 3–4 badges discretos — "Tick atual: $2.359" / "Range mais populado: ±0,5%" / "Cauda com pouca competição: $2.500–3.500". Cada badge clicável vira filtro de exploração. Transforma visualização passiva em mapa de decisão.
A3 — Brushable curve / Simulador na curva (3): drag horizontal sobre a curva define range candidato; popover mostra APR estimado + capital necessário + chance de in-range nas próximas 24h (baseado em volatilidade). Botão "Criar essa posição" pré-preenche o flow. Converte leitura em exploração.
A4 — Presets probabilísticos de range (9): substituir presets por forma (Stable/Wide) por presets por risco — Conservador (95% in-range 24h) / Equilibrado (80%) / Agressivo (50%). Range como decisão de risco, não de geometria.
A5 — Slider probabilístico com tooltip vivo (11): ao arrastar marker de range, popover mostra em tempo real: Probabilidade in-range (24h) + APR estimado + IL estimado no pior cenário. Cada adjusto tem consequência quantificada.
A6 — Backtest visual do range contra histórico (12): botão Simular nesse histórico no chart — roda backtest do range escolhido contra a janela visível. Resultado: fees acumuladas, IL final, % in-range, número de reposicionamentos necessários. Validação passada antes do commit.
A7 — Capital efficiency vs full range (13): linha extra abaixo do total — "Capital efficiency: 10× vs full range" + mini-bar comparando capital escolhido ($1.487) vs equivalente full range ($14.000). User entende v3 em número concreto no momento de commitment.
A8 — Modo "Capital fixo" (14): toggle Por range (avançado) vs Por capital (sugerido). User define $X total + perfil de risco, sistema sugere range ótimo. Inverte o paradigma para quem pensa em fiat, não em ticks.
Passa nas 4 perguntas-teste (cada peça individualmente): (1) ✓ todos os concorrentes adiam simulação para o flow ou omitem completamente; (2) ✓ afeta iniciante e intermediário diretamente; (3) ✓ razão = investimento em modelo de volatilidade + engine client-side; (4) ✓ ganho perceptível — user vê probabilidade e APR estimado antes de clicar "Create".
Trade-off: todas as peças dependem de pricing engine client-side; APR estimado carrega risco de promessa quebrada (aceitar com caveat "baseado em últimos 30 dias"). Implementação incremental recomendada: A1 (slider na pool detail) primeiro — menor custo, maior visibilidade de diferenciação.
Leverage estrutural máximo — define o posicionamento "Kotai te deixa simular antes de aportar" como tese de produto. Junto com o Sistema II, forma a narrativa "Kotai é o DeFi que te diz a verdade".
Padrão atual da indústria: Uniswap, PancakeSwap, Balancer — cards de posição exibem fees acumuladas e APR sem IL (5). O comparativo LP vs hold está ausente em todas as plataformas (10). Razão não-técnica: mostrar que "talvez hold seja melhor" reduz TVL — conflito de interesse sistêmico.
B1 — Health Score de posição (5): score 1–10 no card de posição agregando in-range %, fees acumuladas, IL atual e adequação do range para a volatilidade observada. Tooltip detalhando componentes. Score baixo dispara CTA "Otimizar posição →" com sugestão de range corrigido. Converte dado bruto em julgamento acionável.
B2 — Comparativo LP vs hold (10): mini-tabela abaixo dos presets — 3 linhas: Hold simples ETH+USDC 50/50, LP Full range, LP Custom (sugerido) — com APR estimado e % chance de perder vs hold. Honestidade radical: produto admite que LP não é sempre a resposta.
Passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes evitam o comparativo (conflito comercial); (2) ✓ afeta iniciante e intermediário; (3) ✓ razão = conflito de interesse, não impossibilidade; (4) ✓ ganho perceptível e diferencial reputacional enorme.
Trade-off: B1 exige custódia de preço de entrada para calcular IL (dados históricos do user). B2 é estrategicamente perigoso (produto recomenda não usar o produto quando não vale a pena) mas reputacionalmente diferencial — mesma jogada do Vanguard contra fundos ativos.
Leverage estrutural alto — define posicionamento "Kotai é o único DEX que te diz quando não vale a pena ser LP".
Padrão atual da indústria: Uniswap, PancakeSwap, KyberSwap — validam sintaxe de inputs, fazem recap de inputs no review, delegam simulação para a wallet. Ninguém faz guard-rails semânticos ou antecipa o conteúdo da wallet dentro do produto.
C1 — Sanity Layer (validação semântica de inputs) (15): sistema de warnings inline ativados por heurísticas: Max > 100× preço atual; range assimétrico > 10×; fee tier desalinhado com range; total > 80% do saldo; APR estimado < 0. Cada warning com explicação + ação sugerida + override sempre disponível. Último guard-rail antes do commit on-chain irreversível.
C2 — Modal de review como "contrato visual" com expectativas calibradas (16): acrescentar ao modal de review uma seção "What to expect" — APR estimado, fees esperadas (30d), % chance de in-range — e 3 cards de cenário (preço estável / +20% / −20%) mostrando valor final da posição + ganho/perda. User assina com mental model calibrado.
C3 — Pré-simulação da tx dentro do produto (17): antes de chamar a wallet, Uniswap chama RPC e mostra o mesmo conteúdo de Simulation Results + decode da call que a wallet mostrará — gás estimado, NFT explicado ("representa sua posição, não é colecionável"), Price Diff. Produto controla a expectativa; wallet vira mero assinador sem surpresa.
Passa nas 4 perguntas-teste: (1) ✓ todos os concorrentes validam só sintaxe e fazem recap no review; (2) ✓ afeta iniciante e intermediário; (3) ✓ razão = investimento em heurísticas + custo de RPC; (4) ✓ ganho perceptível — zero capital travado em range absurdo, zero choque cultural na transição para wallet.
Trade-off: C1 pode ter falsos positivos em apostas legítimas (aceitar com override e "não mostrar de novo"). C3 tem custo de RPC e risco de divergência de gás (aceitar com caveat).
Leverage estrutural alto — define posicionamento "Kotai é o DEX que não te deixa cometer erros caros".
Padrão da indústria: Uniswap, PancakeSwap, Curve — múltiplas versões/tipos via dropdown nu (label + label + label), sem contexto comparativo (6). Iniciante não sabe que v4 = hooks + custom logic, v3 = concentrated liquidity, v2 = full range.
Hipótese de diferenciação: modal "Escolha sua versão" no início do flow — 3 cards lado a lado com 1 frase resumo + caso de uso + indicador de complexidade (1–3 estrelas). Default pode continuar v4, mas com escolha informada.
Passa nas 4 perguntas-teste: (1) ✓ todos usam dropdown nu; (2) ✓ afeta iniciante e intermediário; (3) ✓ razão = produto trata versão como detalhe técnico; (4) ✓ ganho perceptível.
Trade-off: mais 1 step antes do flow real. Risco editorial de "qual versão recomendar" (Uniswap empurra v4; Kotai pode empurrar v2 ou v3 como mais seguro para iniciante).
Padrão da indústria: Uniswap, PancakeSwap, KyberSwap — fee tier escolhido no Step 1, antes do range, via TVL ou share (7). Decisão de fee feita antes de decisão de range inverte a dependência real.
Hipótese de diferenciação: inverter o Step 1 — perguntar "Qual estratégia?" com 3 cards (Full range — fee 0,05% / Moderate — fee 0,3% / Tight — fee 1%). Fee como consequência da estratégia, não escolha primária. Override "Custom fee tier" para avançado.
Passa nas 4 perguntas-teste: (1) ✓ todos separam fee de range; (2) ✓ afeta iniciante e intermediário; (3) ✓ razão = arquitetura herdada de v3 launch; (4) ✓ ganho perceptível.
Trade-off: quebra paridade com Uniswap; risco de ancorar usuários em 3 estratégias rígidas. Aceitar com escapatória para power user.
Padrão da indústria: Uniswap, PancakeSwap, KyberSwap — cards de fee tier mostram TVL e share, não APR histórico (8). Decisão de fee por proxy (liquidez) em vez de retorno direto.
Hipótese de diferenciação: 4ª linha em cada card — "APR médio (30d): X%" usando mediana de posições de cada tier. CTA "Simular APR no meu range →" no card.
Passa nas 4 perguntas-teste: (1) ✓; (2) ✓; (3) ✓ razão = APR depende de range, custo de cálculo; (4) ✓ com caveat — o "APR médio por tier" carrega a mesma armadilha do "Total APR" da Tela 1 (número único mascara variabilidade por range). Esta é a pergunta mais fraca — aceitar com caveat explícito + entrada para simulação personalizada.
Trade-off: risco de reintroduzir a Fricção 1 ("APR opaco") em outro nível. Aceitar somente se acompanhado de caveat visível e link pra simulação por range.
Highest TVL com badge descritivo (não prescritivo) — default sensato sem mentira editorial.0,20528138691144813 ETH em 17 casas decimais ao finalizar — honestidade sobre precisão de cálculo; user sabe que o produto não arredondou o que cobra.0 UNI / Rewards earned sem valor para o user com 0 rewards. Inversão condicional: quando user tem 0 rewards E posição existente, Your positions vira hero e card de rewards colapsa para linha de descoberta ("Você pode ganhar UNI em algumas pools — explorar →"). Quando user tem rewards (1 UNI+), card retoma slot prime. Perfil afetado: iniciante + intermediário com posição populada.Migrate to v4 quantificado com APR atual vs estimado v4 + custo de gás + payback. Leverage médio-alto, temporário (só enquanto v4 é nova).Create explicando os 4 campos que a wallet mostrará, só para wallets sem histórico de add liquidity. Leverage médio, exclusivo para iniciante.Drafts de lote em analises/uniswap/_consolidado/_drafts/posicao-populada-lote-1.md, -lote-2.md, -lote-3.md — mantidos como audit trail.




Função: Step 2 com chart histórico, presets de estratégia e inputs de preço Min/Max. User define a faixa de preço dentro da qual sua liquidez será ativa. Decisão central de v3 — onde concentrar capital.
Componentes
Etapa 1 ✓ (concluída) / Etapa 2 ✓ (ativa) — Definir faixa de preço e valores de depósito.Jan 17 / Jan 19 / Jan 21 / Jan 23 (4 datas visíveis).1 dia / 1 semana ✓ / 1 mês / Todo o período + zoom in/out + Redefinir.Estratégias de preço com 4 cards horizontais:Estável ± 3 ticks — "Indicado para estabelecer ou pares de baixa volatilidade".Ampla -50% — +100% — "Indicado para pares voláteis".Unilateral inferior -50% — "Fornecer liquidez se o preço cair".Unilateral superior +100% — "Fornecer liquidez se o preço subir".Preço mínimo: 0,85 + (-0,45%) em vermelho + botões +/-.Preço máximo: 1,0707927 + (+25,20%) em verde + botões +/-.Depositar tokens + microcopy "Especifique os valores de token para sua contribuição de liquidez" + chips de % do saldo (0% / 25% / 50% / 75% parcialmente visíveis).Regras de negócio
± 3 ticks é unidade técnica v3 (≈ ±0,03% em pool 0,01%).0,85 ≈ -0,45% do preço atual; 1,07 ≈ +25,20%).+/- ajustam preço em 1 tick.🟢 Insight 1 — 4 presets traduzem tese de mercado em geometria de range. User com tese ("acho que ETH vai subir") encontra Unilateral superior direto. Sem preset, decisão de range seria abstrata. Padrão a herdar pra Kotai — preset deve falar a língua da tese ("se o preço cair"), não da mecânica ("range one-sided lower").
🟢 Insight 2 — Cor + % delta no input dá ancoragem dupla. 0,85 (-0,45%) permite ler em preço absoluto OU em % relativo ao preço atual. Iniciante lê o number; intermediário usa o %. Padrão a herdar — input financeiro deve carregar 2 representações (absoluto + relativo).
🟢 Insight 3 — Chart histórico acoplado ao input de range materializa decisão geométrica. User vê "meu range cobre janeiro inteiro?" diretamente no chart. Sem visualização, decisão de range é cega. Padrão a herdar — input numérico crítico deve ter representação gráfica adjacente.
🟢 Insight 4 — Estratégias de preço como section dedicada (não dropdown) eleva presets a affordance principal. User vê os 4 simultaneamente, compara. Padrão a herdar — opções editoriais críticas devem competir em paralelo, não em dropdown sequencial.
🔴 Fricção 1 — Estável: ±3 ticks mistura unidade técnica com unidades % dos outros presets (estrutural — inconsistência de unidade entre presets do mesmo conjunto)
-50% / +100%); apenas Estável usa ticks. User compara ± 3 ticks (incompreensível pra iniciante) com -50% — +100% (compreensível) e fica perdido. "Tick" é unidade de discretização do pool — implementation detail vazando pra UI. Iniciante não decoda; intermediário sabe que tick existe mas não sabe quanto vale em %.±0,03% perde a precisão de "boundary tick" (range precisa cair em tick boundary); manter ticks confunde majoritariamente.Estável: ±0,03% como label visível + tooltip "Equivalente a ±3 ticks (unidade mínima do pool)" pra avançado. Unidade % uniforme entre presets. Trade-off: perde tecnicidade em label; ganho: comparabilidade.Stable: ± 3 ticks da PosPop #11 — mesma raiz, mesma alternativa.🔴 Fricção 2 — Microcopy dos presets Unilateral inferior/superior invertem mental model do user (estrutural — copy técnica contra-intuitiva)
Acumular cripto (se cair) / Vender em alta (se subir) — descreve o resultado da posição, não a geometria. Iniciante entende imediatamente. Trade-off: labels mais longos; cabem se o card crescer 1 linha.🔴 Fricção 3 — Preço mínimo / Preço máximo em unidades brutas (0,85 / 1,07) sem indicar denominação ativa (cosmética — labels sem unidade explícita do par)
0,85 é USDC por VIRTUAL ou VIRTUAL por USDC? Pra par VIRTUAL/USDC com preço de mercado ~$0,85, o number 0,85 faz sentido como "USDC por VIRTUAL". Mas em pares ETH/USDC (preço $2000+), o user precisa decidir se o range é em ETH/USDC ou USDC/ETH — produto não exibe a denominação no label. Erro de denominação inverte a estratégia inteira (range que cobre alta de ETH vira range que cobre baixa).Preço mínimo (USDC por VIRTUAL) polui visualmente; tooltip é dismissado.USDC/VIRTUAL cinza pequeno abaixo do input + toggle pra inverter denominação no header da section. Trade-off: mais 1 linha; ganho: zero ambiguidade.🟡 Oportunidade competitiva — Presets com probabilidade in-range estimada exibida no próprio card
Ampla -50% — +100% sem saber se "ampla" significa "95% de chance in-range" ou "60%".Ampla mostra "~85% chance in-range (30d) / APR esperado: 18%" vs Estável mostra "~40% chance in-range / APR esperado: 60%".P(in-range 30d): X% / APR esperado: Y%. User compara presets em retorno esperado vs risco. Combinado com 🔴 Fricção 2 (renomear pra tese), card vira "escolha de tese × probabilidade × retorno".Observação adicional — Redefinir do header reset o chart pra estado default, distinto do Redefinir da Tela 3 (que reseta par + tier). Mesmo label com escopo diferente entre telas — sutil mas pode confundir user que esperava reset global. Vale unificar semântica ou diferenciar label por escopo (Redefinir chart vs Redefinir tudo).
Função: Step 1 do fluxo Nova posição com par VIRTUAL/USDC já pré-preenchido via deeplink da Tela 2 (Pool detail). User escolhe (ou confirma) o nível de tarifas antes de avançar pra configuração de range.
Componentes
Suas posições / Nova posição.Nova posição + Redefinir + dropdown Posição de v3 ⚙ (versão do protocolo).Etapa 1: Selecionar par de tokens e tarifas ✓ (ativa, círculo preenchido).Etapa 2: Definir faixa de preço e valores de depósito (inativa, círculo vazio).Selecionar par + microcopy "Escolha os tokens para os quais deseja fornecer liquidez. É possível selecionar tokens em todas as redes com suporte."VIRTUAL ▼ + USDC ▼ (logos + ticker + dropdown).Nível de tarifas + microcopy "O valor ganho por oferecer liquidez. Escolha um valor compatível com sua tolerância a risco e estratégia."Nível de tarifas 0,3% + badge TVL máximo + microcopy "A porcentagem que você ganhará em tarifas" + botão Mais v (expandir).Continuar (ativo, rosa primário).Regras de negócio
0,3% selecionado por ser o tier com maior TVL do par (badge TVL máximo).Mais v expande pra exibir os 4 tiers v3 canônicos (0,01% / 0,05% / 0,3% / 1%) com TVL e share por tier.Redefinir no header limpa par + tier (volta a estado vazio).Posição de v3 ⚙ permite trocar pra v2 (sem fee tier configurável) ou v4 se disponível.Continuar só fica ativo com par + tier selecionados (ambos presentes via deeplink).🟢 Insight 1 — Pre-fill via deeplink elimina re-trabalho de seleção. User veio da Tela 2 com decisão tomada; o produto carrega o contexto. Sem isso, user teria que re-selecionar 2 tokens + 1 tier — 3 decisões redundantes. Padrão a herdar pra Kotai — toda transição entre telas críticas deve preservar contexto via deeplink, nunca obrigar re-input.
🟢 Insight 2 — Stepper vertical com numeração + descrição completa de cada etapa funciona como sumário do fluxo. Etapa 1: Selecionar par e tarifas / Etapa 2: Definir faixa e depósito — user sabe o que vem depois antes de clicar Continuar. Sem stepper, user opera no escuro. Padrão a herdar — flows multi-step devem expor todas as etapas, não só o passo atual.
🟢 Insight 3 — Microcopy de cada section ("O valor ganho por oferecer liquidez...") é didática sem ser invasiva. Cor cinza, fonte menor, fica subordinada ao número. Iniciante lê; intermediário pula. Padrão a herdar — microcopy explicativa deve ter peso visual menor que a decisão que ela explica.
🟢 Insight 4 — Badge TVL máximo no card de fee tier comunica recomendação sem prescrever. Não diz "recomendado", diz "este tem mais TVL" — user decide se TVL alto importa pra ele. Padrão a herdar — produto deve mostrar o critério da recomendação, não a recomendação opaca.
🔴 Fricção 1 — Posição de v3 no header expõe escolha de versão de protocolo como decisão do user (estrutural — convenção técnica vaza pra UI sem tradução)
v3 vs v2 é decisão técnica com consequências massivas — v2 = full-range automático, v3 = concentrated liquidity com range manual. Iniciante não sabe diferença e o dropdown não explica. Default v3 empurra todo iniciante pra configuração complexa de range (Etapa 2) sem entender que v2 seria mais simples e adequado pra primeira posição.v2 exclui user avançado que prefere fire-and-forget; explicar a diferença em modal toda vez é fricção.v3) + intermediário sem familiaridade com versionamento Uniswap.🔴 Fricção 2 — Card Nível de tarifas 0,3% não mostra a distribuição dos outros tiers até clicar Mais v (estrutural — prova social escondida atrás de clique)
TVL máximo afirma "este é o maior" mas não mostra por quanto. 0,3% poderia ter 51% do TVL (escolha contestável) ou 98% (escolha óbvia) — comportamento de produto é o mesmo (pré-selecionar), mas leitura do user é radicalmente diferente. User aceita default cego sem saber o quão concentrada é a adoção. Resolver isso exige clicar Mais v — atrito que iniciante não paga.78% do TVL no card único pode ser leído como tag aleatória.0,05% (12%) · 0,3% (78%) · 1% (10%) (3 valores, separados, dominante destacado). Sem expandir cards, mas com distribuição visível. Clique na linha leva pro detalhe (equivalente ao Mais v). Trade-off: mais 1 linha de altura; ganho: zero ambiguidade sobre o quão dominante é o default.TVL máximo mas quer saber margem) + iniciante atento.Nível de tarifas sem distribuição) — mesma raiz: produto pré-seleciona sem mostrar a distribuição que justificou a escolha.🔴 Fricção 3 — Botão Redefinir no header sem confirmação destrói o pre-fill silenciosamente (cosmética — affordance destrutiva sem fricção protetora)
Redefinir (por curiosidade, "o que faz isso?") apaga o contexto e força reseleção. Sem modal "Tem certeza?" — apenas executa.Redefinir com tooltip on-hover "Limpa par e nível de tarifas selecionados" + undo inline por 5s ("Redefinido. Desfazer →"). Sem modal, mas com reversibilidade. Trade-off: exige toast de undo; ganho: zero perda acidental de contexto.🟡 Oportunidade competitiva — Wizard com sugestão de tier baseado em perfil de risco declarado, não em TVL agregado
0,05% exige range muito tight pra render fees — fora do range em horas). Intermediário quer otimização explícita.0,3% ou 1% recomendado com microcopy "range largo, menor concentração, menor IL".Conservador / Equilibrado / Agressivo. Cada perfil pré-seleciona tier + range default (Etapa 2). Default sem toggle = Equilibrado. Avançado ignora.Observação adicional — banner X Layer está disponível agora segue presente. Mesmo cross-promo da Tela 1, persistente no flow. Não fricção da tela em si, mas registra-se como padrão de produto que prioriza growth de outra rede em telas críticas de conversão LP — decisão a desafiar pra Kotai (não competir com nosso próprio funil de aporte).
Função: página da pool específica com métricas históricas, transações e entry points pra ação. Aprofundamento após escolha na Tela 1 — user inspeciona TVL, volume, APR e decide entre Fazer swap (usar a pool como trader) ou + Adicionar liquidez (virar LP da pool).
Componentes
Pools / VIRTUAL / USDC 0x529d...07fC (endereço encurtado + copy icon).VIRTUAL / USDC com logos dos 2 tokens + badge v3 + badge 0,3%.583,7 mil US$ + label Há um dia (volume da janela selecionada do chart).Fazer swap (rosa secundário) / + Adicionar liq... (rosa primário, truncado por largura do container).$0–$80K, ~20 barras visíveis.1D / 1S / 1M / 1A / ALL.Preço / Volume ✓ / Liquidez.Estatísticas:APR total: 35,26% (destacado, fonte grande).Saldos do pool: 779,4 mil VIRTUAL / 196,3 mil USDC com barra horizontal visualizando proporção.TVL: 858,9 mil US$ (com delta +1,0% em verde).Volume de 24 horas: 276,5 mil US$.Tarifas de 24 h: 829,61 mil (provável bug — vide Observação adicional).Links abaixo (Etherscan etc., parcialmente visível).Transações no rodapé com colunas Horário / Tipo / USD / VIRTUAL / USDC / Carteira — exibe Vender VIRT... em vermelho.Regras de negócio
Transações é live feed — última transação 4min atrás.Fazer swap e + Adicionar liquidez levam pra flows com par pré-preenchido (VIRTUAL/USDC herdado do contexto).583,7 mil US$ é volume da janela ativa do chart (não 24h — Volume 24h está na sidebar como 276,5 mil).🟢 Insight 1 — Entry point + Adicionar liquidez direto da pool > "Nova posição" do zero. User chega pela tabela da Tela 1 já com decisão ("essa pool aqui"); clica e o par + fee tier vêm pré-preenchidos na Tela 3 (Nova posição com VIRTUAL/USDC, 0,3% selecionado). Sem esse contexto, user teria que recriar a escolha de zero. Padrão a herdar pra Kotai — fluxos críticos devem carregar contexto de origem como deeplink.
🟢 Insight 2 — Saldos do pool com barra de proporção horizontal materializa imbalance. 779,4K VIRTUAL / 196,3K USDC em texto seria abstrato; barra horizontal mostra que pool está ~80% em VIRTUAL (preço de VIRTUAL caiu ou demanda comprou USDC). Iniciante vê de cara que pool não é 50/50 e entende sem ler. Padrão a herdar — proporções devem ter representação visual + numérica simultânea.
🟢 Insight 3 — Coexistência de Fazer swap e + Adicionar liquidez reconhece 2 personas na mesma página. Trader chega via descoberta de token; LP chega via descoberta de pool. Mesma page serve os 2 sem fragmentar o produto. Padrão a herdar — pool detail deve servir trader e LP, não forçar página por persona.
🟢 Insight 4 — Toggle Preço / Volume / Liquidez no chart permite leitura tripla sem mudar de tela. Trader olha Preço; LP olha Volume (proxy de fees) e Liquidez (concorrência). 3 lentes num único chart. Padrão a herdar — visualização principal deve permitir múltiplas projeções dos mesmos dados.
🔴 Fricção 1 — APR total exposto como número único sem decomposição (estrutural — APR isolado mascara componentes)
35,26% é APR "total" — mas total do quê? Inclui só fees ou inclui também appreciation/IL? É calculado sobre que janela (7d, 30d, 90d annualized)? Não há tooltip nem caveat. Iniciante lê "35% ao ano" e mentaliza retorno garantido — não sabe que: (a) IL pode comer 20%+ do retorno; (b) APR é trailing, não forward; (c) só é realizado se range cobrir todo o trading. Tela vende retorno; realidade entrega yield menos IL.APR total por APR de fees (30d, full range) + microcopy abaixo "não inclui Impermanent Loss; seu APR real depende do range que você escolher". Mantém o number mas devolve precisão semântica. Trade-off: texto extra na sidebar; ganho: zero ilusão de "retorno garantido".🔴 Fricção 2 — Big stat 583,7 mil US$ — Há um dia é ambíguo entre "volume da janela" e "volume de 24h" (estrutural — métrica principal sem rótulo claro)
Volume de 24 horas: 276,5 mil US$, metade do big stat. Os 2 numbers não batem. Provavelmente big stat é volume da janela ativa do chart (default mais largo) e "Há um dia" é caption do ponto final da série, não rótulo do total. User vê dois numbers de volume conflitantes na mesma tela e não sabe qual usar pra decisão.Volume (período: 30d): 583,7 mil US$ com atualização ao trocar o toggle 1D / 1S / 1M / 1A / ALL. Caption "Há um dia" some (ou vira tooltip do ponto final). Trade-off: big stat muda dinamicamente, exige redraw; ganho: zero conflito entre numbers da mesma tela.🔴 Fricção 3 — + Adicionar liq... truncado por largura do container (cosmética — label crítico cortado)
+ Adicionar liq...). User precisa hover ou intuir que liq... = liquidez. Iniciante pode ler como botão de outra coisa ("adicionar líquido"? "liquidação"?). É o CTA principal da página — não pode estar incompleto.+ Liquidez (mais curto, sem truncamento) ou + Adicionar (com ícone gota d'água). Trade-off: perde clareza de "adicionar liquidez" pra quem decoda; ganho: CTA inteiro visível sempre.🟡 Oportunidade competitiva — Pool detail com simulador inline "se eu aportar $X num range Y, qual meu retorno esperado?"
$500 + range ±10% e vê APR estimado: 28% / IL estimado em pior cenário 30d: 4% / Probabilidade de ficar in-range: 71%.APR total — inputs Aporte $ e Range % com 2–3 numbers vivos (APR esperado, IL pior cenário, probabilidade in-range). Default usa preset Wide. Botão Configurar → leva pra Tela 3 com inputs pré-preenchidos.Observação adicional — Tarifas de 24 h: 829,61 mil é provavelmente bug ou rendering quebrado. Number é maior que a TVL inteira (858,9 mil) e ~3× o volume de 24h (276,5 mil). Fees teóricas de 24h ≈ volume × fee tier = 276,5K × 0,3% ≈ $830. O number exibido (829,61 mil) é 1000× maior — provavelmente unidade trocada (deveria ser $829,61 mostrado como 829,61 com unidade auto-formatada erroneamente como "mil US$"). Não é fricção de UX (é defeito de implementação), mas é erosão direta de trust — iniciante atento percebe que o number não fecha contra TVL e perde confiança no resto dos numbers da página. Vale registrar e reportar como issue de qualidade analítica, não como fricção de design.
Função: hub de descoberta de pools da rede Base com filtros e métricas comparativas em tabela. Entry point para o flow "criar nova posição de liquidez" — user chega aqui pra escolher em qual pool aportar capital antes de configurar range e fee.
Componentes
Tokens / Pools ✓ / Transações (Pools selecionado).+ Adicionar liquidez (CTA primário, rosa) + dropdown rede (Base ✓) + dropdown Protocolos + busca por token/pool.# / Pool / Protocolo / Nível de tarifas / TVL / Vol anual da pool / PR de recompensa / Vol. 1 dia / % 1 dia / TVL.v3 0,3%, ORB/ETH v3 1%, ETH/SURGE v2 1%, VIRTUAL/REPPO v3 0,3%, BYTE/ETH v3 0,3%, ZORA/ETH v3 0,3%, VIRTUAL/USDC v3 0,3%, CLANKER/ETH v3 0,3%, REPLY/VIRTUAL v3 0,3%, BUDDY/ETH v3 1%, VIRTUAL/STAR v3 0,3%, VIRTUAL/MUTE v3 0,3%.X Layer está disponível agora — Saber mais (cross-promo de outra L2).0x486f...) — wallet conectada.Regras de negócio
$110,3M no topo; pools menores no fim).v2 e v3 na mesma lista — protocolo é coluna, não filtro pré-aplicado.% 1 dia / TVL = yield rate diário = (volume × fee tier) / TVL. Linhas visíveis: 3,00 / – / – / 0,54 / – / 0,42 / 0,51 — várias com hífen (sem dado ou volume zero).PR de recompensa aparece como – em todas — coluna provisionada pra incentivos LP (programa não ativo na Base).0,3% (8 pools), 1% (3 pools), 0,05% (raro).0,3%); v3 lista o tier escolhido pelo criador da pool.🟢 Insight 1 — Coluna % 1 dia / TVL é métrica única decisora superior a APR isolado. APR mistura yield + IL + janela temporal arbitrária; vol diário / TVL é dado bruto, sem suposição: "capital nessa pool girou X% no último dia". User compara linha-a-linha sem precisar entender modelo de retorno. Padrão a herdar pra Kotai — expor métrica bruta de utilização antes de derivar APR.
🟢 Insight 2 — Mistura v2/v3 com coluna Protocolo evita filtro duplicado. Se v2 e v3 fossem listas separadas, user inexperiente teria que escolher protocolo antes de descobrir as pools — decisão técnica empurrada pra cima. Mistura na mesma tabela permite descobrir pelo par e ver versão como atributo. Padrão a herdar — convenção técnica vira coluna, não filtro de entrada.
🟢 Insight 3 — CTA + Adicionar liquidez no header dá saída direta sem precisar escolher pool primeiro. User que já sabe o par que quer ("vim aqui pra criar pool USDC/X") não precisa scrollar lista — entra pelo CTA com par em branco. Dois caminhos coexistindo: "descobrir pool" (tabela) e "criar com par decidido" (CTA). Padrão a herdar — listagem deve permitir bypass pra user com decisão pronta.
🔴 Fricção 1 — Coluna % 1 dia / TVL sem unidade explícita nem âncora de comparação (estrutural — métrica decisora exposta sem contexto)
3,00 na coluna; linha 4 mostra 0,54. É 3,00% ou 3,00 (decimal)? E 3% é bom ou ruim? Iniciante não tem referência — não sabe se 3,00 é "excelente", "normal" ou "warning de pool sem TVL". Sem benchmark, métrica vira ruído numérico. Mesmo intermediário que entende a fórmula precisa estimar mentalmente se 3% diário ≈ 1000% anualizado é sustentável (provavelmente não — pool nova ou ilíquida).< 0,1% cinza (pool dormida), 0,1–1% neutro, > 1% destaque amarelo com microcopy "yield alto = volatilidade ou TVL baixo, verificar". User vê 3,00 em amarelo com warning e não confunde com pool sólida. Trade-off: exige calibração das faixas por categoria de par (stable vs volátil); aceitar com faixa única no MVP.🔴 Fricção 2 — Coluna PR de recompensa vazia (–) em todas as linhas polui scan sem entregar valor (cosmética — coluna provisionada sem uso ativo)
– em 100% das linhas visíveis. Iniciante pensa "o que é PR? por que está vazio? é problema da minha rede?". Custo cognitivo alto pra zero informação. Provavelmente reservada pra programa de incentivos LP (UNI farming) — ativo em outras redes, dormente na Base.– — render condicional por rede. Em Base, a coluna some; em mainnet, aparece. Tabela fica mais densa e legível. Trade-off: user que troca de rede vê layout mudar (mas a mudança é melhoria, não regressão).🔴 Fricção 3 — Nível de tarifas mostrado sem distribuição visual entre tiers do mesmo par (estrutural — fee tier crítico exposto como número solto)
0,3%, 1%, etc., mas não indica se aquele é o tier dominante do par (concentração de TVL) ou marginal. VIRTUAL/USDC 0,3% aparece, mas o user não sabe se existe também VIRTUAL/USDC 0,05% com TVL muito maior — escolher essa linha pode levar à pool errada. Decisão de fee fica desinformada já na escolha da linha.Nível de tarifas mostra 0,05% / 0,3% (78%) / 1% com o dominante destacado. Clique expande a linha pra ver TVL/volume por tier. Trade-off: aumenta complexidade visual do row default; ganho: zero ambiguidade entre pools do mesmo par.🟡 Oportunidade competitiva — Ranking por "adequação ao perfil do user" em vez de TVL absoluto
Conservador / Moderado / Agressivo e vê lista reordenada com pools alinhadas à tese.Conservador (stablecoins, IL ≈ 0), Moderado (large-cap correlacionado, IL moderado), Agressivo (par volátil, alto yield/risco). Cada chip aplica filtro + reordena por % 1 dia / TVL dentro da categoria. Default = Todos. Avançado ignora os chips e usa colunas como hoje.Observação adicional — banner X Layer está disponível agora no canto inferior-esquerdo compete com a CTA primária + Adicionar liquidez. Banner de cross-promo de L2 numa tela onde a decisão é "escolher pool" gera dispersão de foco. User pode clicar e sair do flow. Não é fricção da tela em si (decisão de growth é legítima), mas vale registrar como competição entre objetivos de produto — descoberta de pool vs adoção de nova rede.
O fluxo Posição Populada Base é o mais longo e tecnicamente denso do Uniswap analisado: 11 telas cobrindo a jornada completa de LP — pool discovery (1) → pool detail (2) → seleção de fee tier (3) → configuração de range (4) → aporte com erro de saldo (5, 6) → verificação externa de token (7) → review e assinatura (8, 9) → gestão pós-criação (10, 11).
O produto acerta sistematicamente em progressive disclosure, representação gráfica acoplada a decisões críticas, e preservação de contexto entre telas. Onde falha é estrutural: o produto expõe matemática de protocolo sem traduzir consequência e aceita configurações subótimas silenciosamente — sem guarda-rail quando a config é financeiramente irracional.
O perfil mais afetado é o iniciante em ambos os eixos: quem não sabe decodar "v2 vs v3", "±3 ticks", ou "uint256 max"; quem desiste na terceira assinatura sem entender por quê; quem sai do Portfolio acreditando ter perdido $11 porque a posição LP some do big stat (11).
Padrão mais recorrente e mais forte do fluxo: toda vez que o produto pede decisão crítica, o número não aparece sozinho. Na configuração de range, o chart histórico mostra graficamente onde floor e ceiling estão em relação à volatilidade passada (4). Quando o ratio muda por saldo insuficiente, a cor do campo muda em tempo real junto com o number (5, 6). No modal de confirmação, o mini-chart com range em verde serve de sanity check visual antes de assinar (8). No card de posição pós-criação, o mini-chart inline mostra se o preço está dentro ou fora do range sem nenhum clique (10).
Diretriz a herdar: qualquer input ou confirmação financeira crítica deve ter representação gráfica adjacente — number cru sem contexto visual é fricção de leitura.
Pool detail carrega par + fee tier pré-selecionados ao abrir Nova Posição via deeplink (2 → 3). Sem isso, user teria que re-selecionar 2 tokens + 1 tier — 3 decisões redundantes após já tê-las tomado na tela anterior.
Diretriz a herdar: toda transição entre telas críticas deve preservar contexto como deeplink; nunca obrigar re-input de decisão já tomada.
Toggle Preço / Volume / Liquidez no chart da pool detail oferece 3 lentes sobre os mesmos dados sem mudar de tela (2). O card de fee tier exibe tanto o percentual quanto o badge TVL máximo como critério da recomendação (3). Os inputs de preço Min/Max exibem valor absoluto e delta percentual simultâneos — iniciante lê o number, intermediário usa o % (4).
Diretriz a herdar: dados financeiros críticos devem carregar duas representações simultâneas — a que o usuário conhece e a que o protocolo conhece.
Na lista de pools, + Adicionar liquidez no header serve o user que já sabe o par enquanto a tabela serve o user em descoberta (1). Na pool detail, Fazer swap e + Adicionar liquidez coexistem porque trader e LP chegam pela mesma tela por caminhos diferentes (2).
Diretriz a herdar: telas de produto complexo devem permitir bypass para user com decisão pronta sem ocultar o path de descoberta.
O stepper vertical "Etapa 1 / Etapa 2" na configuração da posição deixa claro o que vem antes de clicar Continuar (3). O modal de confirmação exibe badge "Etapa 2 de 3" e microcopy "Você precisa aprovar 2 tokens" antes do primeiro popup da wallet (8, 9).
Diretriz a herdar: qualquer flow multi-step ou multi-tx deve expor todas as etapas antes de começar e o progresso durante.
A fricção mais recorrente do fluxo e a mais pesada para o iniciante: produto expõe número de retorno sem nível de referência, sem janela explícita, sem decomposição de componentes.
Na lista de pools, % 1 dia / TVL mostra 3,00 sem unidade explícita nem âncora — iniciante não sabe se 3,00 é bom, ruim ou alarme (1). Na pool detail, APR total: 35,26% aparece sem indicar janela de cálculo nem separar fees de IL — iniciante lê como "retorno garantido de 35% ao ano" (2). No card de posição recém-criada, APR: 36,42% coexiste com Tarifas: 0,00 US$ — APR trailing positivo numa posição que não acumulou um centavo de fee (10).
Por que a solução óbvia falha: decompor APR em "Fees + IL implícito" exige escolher uma janela de IL que depende do range individual — número fica frágil e disputável.
Direcionamento Kotai: (a) na lista de pools, classificar % 1 dia / TVL em 3 faixas visuais — < 0,1% cinza / 0,1–1% neutro / > 1% amarelo com "yield alto = volatilidade ou TVL baixo, verificar"; (b) no APR da pool detail e do card de posição, trocar label para APR de fees (30d, full range) com microcopy "não inclui Impermanent Loss; retorno real depende do range escolhido". Trade-off: faixas exigem calibração por categoria de par; aceitar com faixa única no MVP.
Perfil afetado: iniciante (principal — único que toma APR como retorno literal).
O padrão mais amplo do fluxo — implementation details do protocolo aparecem como elementos primários de UI sem tradução de consequência.
O dropdown Posição de v3 força iniciante a escolher entre v2 e v3 sem saber que v2 = full-range automático e v3 = concentrated liquidity com range manual (3). O preset Estável: ± 3 ticks usa unidade de discretização interna enquanto os outros 3 presets usam percentagem — o preset mais conservador fica ilegível para o iniciante (4). O display de 1070,326180990420357 VIRTUAL expõe 15 casas decimais de BigNumber — parede numérica que o cérebro rejeita, pior em vermelho (5). O popup da wallet exibe Approve token: 115,792,089,237,316,... (uint256 max) sem microcopy explicando que é "aprovação infinita padrão" — número que parece catastrófico e que o user aprende a ignorar, hábito que será explorado pela próxima dApp maliciosa (9). O prompt Migrar para v4 aparece sem explicar o que é v4 (10).
Por que a solução óbvia falha: traduzir cada conceito em profundidade cria tooltips longos ignorados; esconder completamente retira controle do avançado.
Direcionamento Kotai: nome técnico + sub-label de consequência em uma linha — Avançado (v3): você escolhe a faixa de preço, retorno maior, exige manutenção / Estável: ±0,03% com tooltip "equivalente a ±3 ticks" / display de 2–4 casas com precisão completa on-hover / toggle no modal antes do popup de aprovação infinita. Trade-off: copy de manutenção contínua; ganho: consentimento real sobre o que está sendo aprovado.
Perfil afetado: iniciante (principal), intermediário sem familiaridade com versionamento.
Padrão de produto que compete contra seu próprio funil de conversão LP em três pontos. O banner X Layer está disponível agora — Saber mais aparece tanto na lista de pools (1) quanto no flow de Nova Posição (3), onde o objetivo deveria ser converter o user em LP, não levar para outra L2. Pós-criação, a sidebar de Pools com recompensas exibe pools com APR maior que a posição recém-criada — induzindo FOMO em user que deveria gerir o capital que acabou de aportar (10).
Por que a solução óbvia falha: remover cross-promo perde mecanismo de growth; manter erode conversão LP e tempo de gestão.
Direcionamento Kotai: segregar objetivos por contexto — em telas de criação de posição, zero cross-promo; no dashboard de posição, substituir sidebar de "Outras pools" por Saúde do seu portfólio LP. Discovery de novas pools fica no tab Pools principal — já existe. Trade-off: perde crescimento via cross-sell; ganho: retenção e gestão do capital já investido.
Perfil afetado: iniciante (principal — mais vulnerável a FOMO e dispersão).
Fricções com mesma raiz e mesma solução, tratadas juntas. Ajuste de 0,012 no floor do range (0,852 → 0,840) gera queda de 50× no VIRTUAL exigido (de 1070 para 21). O comportamento é matematicamente correto — a curva de liquidez v3 é altamente não-linear próxima do preço atual — mas completamente invisível na UI (5, 6). Simultaneamente, "Saldo de VIRTUAL insuficiente" aponta para a solução errada: user lê "preciso comprar mais VIRTUAL" quando a causa raiz é o range tight — alargar 0,012 resolveria sem comprar nada (5). Na tela seguinte, a mesma mensagem persiste quando o gap caiu de 50× para 2-3×, sem nenhum feedback de progresso (6).
Por que as soluções óbvias falham: exibir a derivada da curva é técnico demais; warning "range muito tight" constante vira ruído; mensagem de erro composta cresce o footer.
Direcionamento Kotai: (a) gradient bar de sensibilidade abaixo do chart — zonas vermelhas próximas do preço atual (alta sensibilidade ao capital), zonas verdes longe; (b) mensagem de erro composta com 2 saídas — "Saldo insuficiente. Você pode: [Alargar o range] (recalcula com seu saldo) ou [Reduzir aporte] (mantém range)"; (c) footer dinâmico com gap absoluto durante resolução — "Faltam ~13 VIRTUAL ($11,50)". Trade-off: (a) nova visualização exige cálculo client; (b)+(c) footer cresce 2 linhas; leverage pedagógico alto.
Perfil afetado: iniciante e intermediário.
Em 6, o USDC digitado pelo user (5) é reescrito automaticamente para 0,1 ao mover o floor do range — sem highlight, sem microcopy, sem aviso. User pode achar que digitou errado ou não perceber que o aporte caiu de ~$969 para ~$19,50. Em 9, o USDC no popup da wallet vai de 0,53968 (modal review) para 0,562854 — re-quote por movimento de preço nos segundos entre clicar Criar e o popup abrir, diferença de 4%, sem aviso.
Por que a solução óbvia falha: travar input quebra bidirecionalidade; cancelar tx por qualquer mudança gera abandono.
Direcionamento Kotai: highlight temporário no campo recalculado (fade in/out amarelo por 1,5s) + microcopy contextual — "USDC ajustado para manter ratio do range" no overwrite (6) / "Valores atualizados: +4% por movimento de preço" no re-quote (9). Trade-off: animação de estado; trivial de implementar.
Perfil afetado: iniciante (principal), intermediário desatento.
Após criar posição com ~$12 em VIRTUAL/USDC, o user vai ao Portfolio e encontra 1,53 US$ como big stat (11). A posição LP de $11,72 existe e está visível no dashboard de posições (10), mas como NFT (ERC-721) não entra no cômputo da Visão geral. Reação natural do iniciante: pânico — "cadê meu dinheiro?". Sem saber que deve ir ao tab NFTs ou voltar para Suas posições, interpreta perda.
Por que a solução óbvia falha: somar LP ao big stat exige valuation em tempo real com risco de erro em momentos de volatilidade; caveat quebra a simplicidade do número.
Direcionamento Kotai: big stat segmentado — Total: $13,25 (Tokens $1,53 + Posições LP $11,72) com toggle para ocultar LP se o user preferir, e microcopy "Valor de LP é estimado pela cotação atual". Trade-off: cálculo adicional + caveat; ganho: zero pânico + visão real de patrimônio.
Perfil afetado: iniciante (principal — sofre pânico), intermediário (paga custo de agregação mental).
Na lista de pools, a coluna Nível de tarifas lista 0,3% ou 1% sem indicar se aquele é o tier dominante do par — user pode escolher a linha errada do mesmo par (1). Na seleção de tier da Nova Posição, o badge TVL máximo pré-seleciona 0,3% sem mostrar por quanto margem — 0,3% poderia ter 51% ou 98% do TVL; o comportamento de produto é idêntico nos dois casos, mas a leitura do user é radicalmente diferente (3).
Direcionamento Kotai: (a) na tabela, agregar pools do mesmo par em linha única com mini-stack de tiers — 0,05% / 0,3% (78%) / 1% com dominante destacado, clique expande; (b) no card de seleção, adicionar linha de distribuição — 0,05% (12%) · 0,3% (78%) · 1% (10%). Trade-off: maior complexidade visual do row default; ganho: zero ambiguidade sobre dominância do default.
Perfil afetado: iniciante e intermediário.
1070,326180990420357 VIRTUAL com 15 casas decimais no campo de depósito (5); 13 VIRTUAL sem decimais vs 0,53968 USDC com 5 casas no mesmo bloco de confirmação (8). Raiz: BigNumber/uint256 como precisão de leitura. Fix: 2–4 casas por padrão, precisão completa on-hover.
+ Adicionar liq... (2) e Atividade re... (11). Labels não testados em container final. Fix: testar em breakpoints. Trivial.
Segurança de token delegada integralmente a terceiros — 7
O user abre 4–5 abas externas (CoinMarketCap, Etherscan, X do projeto, página de migração) para verificar se VIRTUAL é legítimo antes de criar posição (7). Uniswap não oferece nenhum sinal de trust inline. Iniciante que não conhece o ritual depositaria num token homônimo com contrato maliciosa sem nenhuma barreira. Direcionamento Kotai: ver 🟡 Camada nativa de verificação e trust de token abaixo.
Fricção de protocolo ERC-20 (3 popups) transferida integralmente ao user — 9
ERC-20 obriga transação de approval separada por token antes do mint da posição — 3 assinaturas sequenciais obrigatórias (9). Custo cognitivo idêntico em redes baratas e caras: 3 momentos de "e se eu assinar a coisa errada?". Principal causa de abandono em criação de posição LP. Solução exige decisão de produto, não só redesign de interface (ver 🟡 Smart wallet nativa abaixo).
PR de recompensa exibe – em 100% das linhas — render condicional por rede, ocultar quando sem dados.Redefinir apaga pre-fill sem undo — toast de undo por 5s.Preço mínimo / Preço máximo sem sufixo de denominação do par — em pares ETH/USDC, erro de denominação inverte a estratégia inteira.0,54 US$ abaixo da taxa de rede sem label claro no modal — ambiguidade de o que o número representa.0 UNI Recompensas ganhas ocupa 30% do espaço quando zerado — colapsar para 1 linha quando saldo = 0.0,001 ETH como único token visível parece que o saldo sumiu — badge Gas no nativo abaixo de $5.Padrão atual da indústria: em todos os concorrentes (Uniswap, PancakeSwap v3, KyberSwap), pool detail é página descritiva de dados históricos (2); presets de range são labels geométricos sem retorno esperado nem probabilidade (4); erros de saldo bloqueiam sem sugerir ajuste (5); chart de range não visualiza sensibilidade de capital (6); modal de review é descritivo, não prospectivo (8); card de posição é passivo, não prescreve ação (10).
Por que afeta nosso target: iniciante decide range, fee tier e aporte por intuição — sem modelo, sem probabilidade, sem alternativa calculada quando erro aparece. Intermediário itera manualmente. Avançado usa planilha externa. Ninguém tem ferramenta nativa integrada ao momento de decisão.
Hipótese de diferenciação Kotai: sistema acoplado de 6 pontos de contato:
Aporte $ + Range % → APR esperado, IL pior cenário, % in-range. Default usa preset Wide.P(in-range 30d): X% / APR esperado: Y%. User compara em retorno esperado vs risco, não em geometria.Ajustar para meu saldo recalcula floor mínimo viável e aplica com 1 clique.Ver cenários (3) — preço cai 10%: posição vira 100% VIRTUAL, para de render; preço fica: fees acumulam; preço sobe 30%: ainda dentro do range.fees > 10× gas: sugere recolher; price < min + 5%: sugere ajustar; out_of_range > 24h: sugere fechar/migrar. 1 clique para executar.Trade-off: cada ponto exige modelo probabilístico com risco de erro quando volatilidade muda; aceitar com caveat "baseado em volatilidade 30d; resultados reais podem variar" em todos os pontos.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes carecem de simulação nativa (2) ✓ afeta iniciante e intermediário nos 6 pontos (3) ✓ razão = exige modelo client-side + design; falta de investimento (4) ✓ diferença perceptível máxima — user não precisa de planilha externa para tomar decisão informada.
Leverage estrutural máximo — converte Kotai de "DEX que mostra dados" em "DEX que raciocina junto com o user".
Padrão atual da indústria: Uniswap, PancakeSwap, KyberSwap — autocomplete por ticker sem badge de verificação, sem rank, sem backers, sem aviso de rebrand/migração (7). Segurança delegada 100% ao user via CoinGecko, CMC, Etherscan e X.
Por que afeta nosso target: iniciante é o alvo principal de scam — token homônimo com contrato malicioso engana exatamente quem não conhece o ritual de verificação. Intermediário sabe verificar mas paga custo de tab-switching.
Hipótese de diferenciação Kotai: "Trust card" ao buscar ou selecionar token — painel inline com: ID verificado em CoinGecko/CMC, rank de mercado, contratos por rede com badge Verificado on-chain, backers nomeados, age do contrato, aviso de rebrand/migração quando identificado, link para audit se houver. Tokens novos recebem Token novo, sem verificação — não bloqueia, alerta.
Trade-off: dependência de feeds externos — rate limit, custo de API, fallback degradado. Curadoria contínua para rebrands. Aceitar como custo recorrente — o custo de um scam bem-sucedido do target é infinitamente maior.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes delegam verificação integralmente (2) ✓ afeta iniciante diretamente — mais exposto ao risco de perda total (3) ✓ razão = integração com feeds externos + UI de trust; falta de investimento (4) ✓ ganho perceptível máximo — user não precisa de 4-5 abas e não cai em scam de ticker.
Leverage estrutural crítico — não é otimização de UX, é pré-requisito de segurança para o target. DEX que protege o iniciante sem que ele precise saber de proteção.
Padrão atual da indústria: Uniswap, PancakeSwap, KyberSwap assumem wallet EOA (MetaMask, Rabby, Coinbase clássica) e empurram 3 transações sequenciais para o user (9). Smart wallets existem mas não são default; produto não as trata como cidadão de 1ª classe.
Por que afeta nosso target: iniciante é quem mais abandona no fluxo de 3 popups. Smart wallet resolveria com 1 clique. Quem resolver o trilema — adoção de smart wallet × simplicidade de onboard × UX nativa — ganha o iniciante.
Hipótese de diferenciação Kotai: Kotai-as-smart-wallet — onboarding cria smart wallet ERC-4337 por default; toda interação vira userOp única; gas pago em USDC (não ETH nativo); approvals consolidados via Permit2 + multicall; recuperação social via guardians (não seed phrase). EOA continua suportada como modo "avançado". Resultado: criação de posição LP = 1 clique do ponto de vista do user.
Trade-off: abandona compatibilidade nativa com MetaMask como default. Custo de operar paymaster (sponsored gas inicial). Responsabilidade arquitetural sobre fundos — mitigada se smart wallet for self-custody. Investimento técnico altíssimo.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes assumem EOA e empurram 3 popups (2) ✓ afeta iniciante diretamente — é quem abandona (3) ✓ investimento técnico significativo mas factível (4) ✓ "15 segundos com 1 clique" vs "5 minutos com 3 popups".
Meta-oportunidade — se implementada, todas as outras oportunidades (simulação, trust card, portfolio unificado) ficam mais acessíveis porque o bottleneck da wallet desaparece. A diferenciação de UX vai bater no teto da carteira do user — Kotai pode decidir que a decisão mais importante não é "fazer DEX melhor" mas "fazer onboard de smart wallet melhor que tudo no mercado, e construir o DEX em cima dela".
Padrão atual da indústria: Uniswap, MetaMask, Rabby, Coinbase Wallet — Portfolio mostra ERC-20 como cidadão de 1ª classe (11). LPs, lending, staking ficam em abas separadas ou fora do app. User precisa abrir 3–5 telas para somar patrimônio total.
Por que afeta nosso target: iniciante "perde dinheiro de vista" — $11,72 de LP invisível vira pânico de perda. Intermediário usa planilha ou DeBank para agregar.
Hipótese de diferenciação Kotai: big stat que agrega tudo on-chain — Patrimônio: $13,25 (Tokens $1,53 / Posições LP $11,72). Cada categoria expansível para detalhes. Multi-chain agregado por default (toggle Todas as redes já existe).
Trade-off: integração com dezenas de protocolos é custo perpétuo; valuation aproximada exige caveat. Aceitar ambos — o custo alternativo é o user acreditando ter perdido dinheiro após cada aporte.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes fragmentam patrimônio por tipo (2) ✓ afeta iniciante e intermediário (3) ✓ razão = integração com múltiplos protocolos + modelo de valuation; falta de investimento (4) ✓ diferença perceptível imediata — zero pânico de "cadê meu dinheiro".
Padrão atual da indústria: Uniswap, PancakeSwap, Curve ranqueiam pools por TVL absoluto e selecionam fee tier pelo tier de maior TVL — critério cego ao perfil do user (1, 3).
Por que afeta nosso target: iniciante chega sem saber qual perfil de risco quer. Default por TVL leva a stablecoins (yield baixíssimo) ou pares meme (IL devastador). Não existe filtro nativo "qual perfil você quer?".
Hipótese de diferenciação Kotai: 3 chips de perfil acima da tabela — Conservador (stablecoins, IL ≈ 0), Moderado (large-cap correlacionado, IL moderado), Agressivo (par volátil, alto yield/risco). Cada chip reordena a lista por % 1 dia / TVL dentro da categoria. Na seleção de fee tier, toggle de perfil pré-seleciona tier + range default alinhados à tese. Avançado ignora os chips.
Trade-off: classificação automática pode errar para tokens novos sem histórico; aceitar com badge "Sem histórico" e categoria default = "Agressivo". Curadoria da taxonomia é custo recorrente.
Passa nas 4 perguntas-teste? (1) ✓ default por TVL/popularidade é universal (2) ✓ afeta iniciante e intermediário (3) ✓ razão = produto evita opinar sobre risco; falta de investimento editorial (4) ✓ user seleciona Conservador e vê lista completamente diferente.
Leverage moderado — família com o sistema de simulação; juntos formam a camada de "decisão informada desde o início".
Protocolo evita forçar escolha técnica antes da descoberta do par.TVL máximo comunica o critério da recomendação sem prescrever — user decide se o critério importa pra ele.Pedir ajuda no header do modal de confirmação — admite que confusão é estado válido no momento de "última chance"; postura de produto a herdar como princípio.Interacted before na wallet como sinal de trust vindo do contexto de segurança mais próximo do user.✓ Dentro do intervalo como semáforo binário — user entende saúde da posição sem decodar numbers.Migrar para v4 como prompt contextual discreto — aparece na coisa migrável, não em banner global.Visão geral / Tokens / NFTs / Atividade organizam holdings por tipo de objeto — estrutura transferível.Tarifas de 24h: 829,61 mil (~1000× maior que o correto) — erosão de trust, não fricção de UX.583,7K US$ conflita com Volume de 24h: 276,5K US$ na sidebar — dois números de volume sem rótulo de janela.Unilateral superior +100% pode ser lido como "+100% de retorno" pelo iniciante — nomeação do preset engana o target mais crítico.Criar (modal) e Analisar (tela de fundo) competem visualmente como primários — clique acidental tem consequências diferentes.A sequência Tela 10 → Tela 11 é a evidência empírica mais forte do problema de fragmentação de patrimônio em DeFi: mesmo user, mesma carteira, mesma hora — $11,72 LP visível em uma tela, invisível na outra. Vale congelar essas duas telas como caso-âncora para design reviews internas: todo flow de criação de holding deve ser seguido por visualização que agrega o novo holding ao saldo total, não o esconde em outra aba.
A observação da Tela 9 é estratégica: "a diferenciação de UX vai bater no teto da carteira do user". Kotai pode decidir que a decisão mais importante não é "fazer DEX melhor" mas "fazer onboard de smart wallet melhor que tudo no mercado, e construir o DEX em cima dela".
Os drafts de lote estão preservados em analises/uniswap/_consolidado/_drafts/posicao-populada-base-lote-1.md e posicao-populada-base-lote-2.md como audit trail da cadeia de raciocínio.






Função: dropdown Protocolo aberto exibindo 3 versões do protocolo Uniswap (v4 / v3 / v2) com checkboxes pra filtrar a listagem. Tela revela que versão é dimensão de filtragem de primeira classe, ao lado de Status e Network.
Componentes (diff em relação à Tela 1)
Protocolo v agora aberto.v4 ✓.v3 ✓.v2 ✓.Regras de negócio
v4 + v3 + v2 = mostrar tudo (filtro só restringe quando user desmarca).x*y=k) sem range; v3 = concentrated liquidity; v4 = v3 + hooks.+ Novo > Nova posição de vX (este filtra exibição; aquele escolhe criação).🟢 Insight 1 — v4 + v3 + v2 todos ativos por default = mostrar tudo, filtro é opt-in. User não precisa configurar pra ver suas posições. Filtro existe pra restringir, não pra exigir setup. Padrão a herdar pra Kotai — filtros devem default a "mostrar tudo" e só restringir por intenção explícita.
🟢 Insight 2 — Filtro Protocolo em pé de igualdade com Status reconhece que user multi-versão é caso real. Power user pode ter v2 (legado), v3 (atual), v4 (experimental). Filtrar por versão facilita auditoria. Padrão a herdar — quando uma dimensão técnica afeta comportamento, ela merece filtro de 1ª classe.
🟢 Insight 3 — Dropdown enxuto (só v4 / v3 / v2, sem microcopy) é decisão coerente pra esta tela. Diferente do dropdown + Novo da Tela 1 (onde versão decide flow), aqui versão é filtro de visualização — risco zero. Mantém UI limpa pra usuário power. Padrão a herdar — peso de explicação deve ser proporcional ao impacto da decisão.
🔴 Fricção 1 — Filtro Protocolo é redundante pro iniciante (só tem 1 versão ou nenhuma) e útil só pra power user (estrutural — UI pra power user ocupando espaço de iniciante)
Protocolo é literalmente inútil pra ele — desmarcar versões só esconde a única posição que tem. Mas o filtro ocupa mesmo peso visual que Status (útil pra todos). Iniciante olha, tenta usar, vê que não faz sentido, abandona com confusão.Protocolo filtro apenas quando user tem posições em ≥ 2 versões. Conditional render trivial. Iniciante com 1 ou 0 posição não vê o filtro; intermediário com v2+v3 vê. Trade-off: lógica condicional; ganho: toolbar adapta-se ao perfil real.🔴 Fricção 2 — Labels v4 / v3 / v2 sem microcopy assumem que user entende versionamento de protocolo (estrutural — versão de protocolo exposta como label sem tradução)
v4 / v3 / v2. User iniciante: "qual é v3 mesmo? a com range?". Sem nada que diga o que cada versão é. Em dropdown de filtro (estado momentâneo), tooltip não dá conta — user fecha o tooltip e perde a info de novo. Inconsistente com a Tela 1 onde o split button + Novo faria sentido ter microcopy (e também não tem).v3 (concentrated liquidity)); fica longo.v3 mostra "concentrated liquidity, range manual" enquanto mouse fica em cima. Sem aumentar tamanho do dropdown. Trade-off: depende de hover (não-touch); aceitar pra desktop.🔴 Fricção 3 — Filtro Protocolo e split button + Novo > Nova posição de vX usam vocabulário inconsistente (cosmética — mesmo conceito com dois nomes)
Nova posição de v4 (com de); filtro fala simplesmente v4 (sem de). Mas o conceito é o mesmo — versão do protocolo. Inconsistência menor mas mina coerência do produto.v4 em ambos os lugares (criação: Nova posição em v4; filtro: v4). Trade-off: trivial; ganho: coerência.🟡 Oportunidade competitiva — Esconder versão de protocolo como conceito de user-facing — substituir por outcome ("range manual / simples / hooks")
Range completo / Range manual / Customizadas (hooks). Versão técnica vira tooltip de detalhe. Power user que quer ver "v3" pode habilitar modo técnico nas configurações.Observação adicional — v4 / v3 / v2 em ordem cronológica reversa (mais novo no topo) embute hierarquia editorial implícita. Sugere "v4 é melhor". Mas verdade técnica: cada versão tem use case válido (v2 é mais simples, v3 é mais eficiente em capital, v4 é mais flexível mas mais complexo). Ordenação alfabética/cronológica é editorial — vale tornar ordenação por adequação ao user se Kotai for personalizar ("a versão certa pra você está no topo").
Função: hub de gestão LP em estado empty (carteira conectada 0xd09B...618a sem nenhuma posição). User clicou na seta v do split button + Novo pra escolher qual versão do protocolo usar antes de criar a posição. Tela revela arquitetura de produto onde versão é decisão do user antes mesmo de escolher o par.
Componentes
0 UNI + Recompensas ganhas + Recolher recompensas (disabled).Suas posições com toolbar:+ Novo: botão rosa (cria com default) + seta v (dropdown de versão).Status v + Protocolo v + toggle de view.Novo aberto (esta tela) com 3 itens:Nova posição de v4.Nova posição de v3.Nova posição de v2.Nenhuma posição encontrada.Explorar pools (secundário) + Nova posição (rosa primário).Maiores pools por TVL: WISE/ETH 0,00% APR, ETH/USDC 89,52% APR, USDC/ETH 14,05%, ETH/USDC 4,89%, ETH/USDT 45,55%, WBTC/ETH 14,05% — todos com badge de versão + fee tier.Saiba mais sobre provisão de liquidez + "Fornecer liquidez em protocolos diferentes".Regras de negócio
+ Novo é split button — click no botão = criar com versão default (v3 provavelmente); click na seta v = escolher versão antes.Nova posição user entra (v2 sem fee tier, v3 com fee tier + range, v4 com hooks).Maiores pools por TVL lista pools de outras versões misturadas (v2 0,3%, v3 0,05%, etc.) — coluna versão visível em cada linha.Explorar pools (descoberta) e Nova posição (criar direto).🟢 Insight 1 — Split button + Novo com dropdown de versão respeita 2 personas: default-aceptor e versão-escolhedor. Avançado clica no v pra escolher; iniciante clica no botão direto e vai pro default. Ambos completam a ação. Padrão a herdar pra Kotai — affordances de produto devem servir os 2 níveis sem fragmentar UI.
🟢 Insight 2 — Empty state com 2 CTAs (Explorar pools vs Nova posição) reconhece 2 mental models. "Não sei o que quero" vai explorar; "sei o par/versão" cria direto. Padrão a herdar — empty state crítico deve oferecer caminhos distintos pra graus diferentes de prontidão.
🟢 Insight 3 — Sidebar Maiores pools por TVL em empty state cumpre função de inspiração legítima. Diferente da sidebar da Tela 10 (com user já ativo, distrai gestão), aqui a sidebar substitui a posição inexistente como gatilho de ação. Sidebar é certa pro contexto. Padrão a herdar — discovery side-panels devem ser contextuais ao estado da tela principal, não constantes.
🔴 Fricção 1 — Dropdown Nova posição de v4 / v3 / v2 força user a decidir versão de protocolo antes de saber o que cada versão faz (estrutural — convenção técnica é primeira decisão sem decode)
Atrito real: dropdown apresenta v4 / v3 / v2 em ordem cronológica reversa (mais nova primeiro), implicando "v4 é melhor". Mas iniciante não sabe:
Iniciante que clica v4 por estar no topo entra em flow com complexidade incompatível. Não há microcopy explicando o que cada versão faz pra você (só nome técnico).
Por que a solução óbvia falha: explicar diferenças em modal toda vez é fricção; descartar versões antigas exclui user com posição legada.
Alternativa: renomear itens com microcopy de outcome — Nova posição de v4 — Hooks customizáveis (avançado), Nova posição de v3 — Range manual + fees concentradas (recomendado), Nova posição de v2 — Range completo, simples. Default v3 marcado com badge Recomendado. Trade-off: labels mais longas (cabem); ganho: zero seleção cega.
Perfil afetado: iniciante (principal — único que não decoda versão) + intermediário sem familiaridade.
Família com 🔴 "Posição de v3 no header" (Tela 3 da PP Base) e 🔴 "Migrar para v4 →" (Tela 10 da PP Base) — versionamento de protocolo vaza pra UI em 3 lugares distintos no produto. Família estrutural confirmada.
🔴 Fricção 2 — 0 UNI Recompensas no topo aparece em carteira nova/empty sem contexto (cosmética — header com info irrelevante pra empty state)
0 UNI. O bloco inteiro do header 0 UNI / Recompensas ganhas / Recolher recompensas (disabled) ocupa 30% do espaço útil pra dizer "você não tem nada porque não interagiu". Em estado empty, esse bloco é ruído puro.posições == 0, substituir bloco UNI por mensagem de boas-vindas mais ativa ("Primeira posição em LP? Comece com Nova posição ou explore pools recomendadas."); se posições > 0, manter UNI rewards. Trade-off: renderização condicional; ganho: tela empty serve como onboarding em vez de status report vazio.0 UNI aparece em contextos onde não aplica.🔴 Fricção 3 — Explorar pools (secundário) e Nova posição (primário) no empty state estão lado a lado sem hierarquia clara de "o que fazer primeiro" (cosmética — CTAs com força visual similar criam paralisia)
Nova posição rosa, Explorar pools outline), mas a hierarquia não traduz recomendação. Iniciante hesita: "qual eu deveria clicar primeiro?". Realidade pedagógica: 99% dos iniciantes deveriam clicar Explorar pools (descobrir antes de criar), não Nova posição (criar cego). Mas o produto destaca Nova posição por convenção (primário = ação principal).🟡 Oportunidade competitiva — Empty state como tutorial guiado com primeira posição low-stakes
Nova posição cai no mesmo flow técnico que avançado: par, range, fee tier, deposit. Curva de aprendizado é cliff.-50% de IL em primeira posição mal calibrada é normal).Começar tutorial.Primeira posição? Comece com $5 que executa: par stable (USDC/USDT), range wide, v2 (sem decisão de tier), aporte mínimo ($5). User aprende mecânica sem risco real. Ao fim, oferta de "agora crie posição real". Avançado ignora o modo e vai direto.Observação adicional — split button + Novo com dropdown de versão é decisão de UI que delata maturidade técnica do produto (e dos users assumidos). Uniswap mantém 3 versões coexistindo em produção e força user a escolher. Para Kotai mirar iniciante, decisão equivalente é single button com versão escondida atrás de uma escolha de outcome — "Quero posição simples (full range)" / "Quero posição customizada (range manual)". Versão de protocolo vira implementation detail, não decisão de produto.
Função: dropdown Status aberto exibindo 3 estados possíveis de uma posição LP (Dentro do intervalo / Fora do intervalo / Fechado) com checkboxes pra filtrar a listagem. Tela revela taxonomia de estados que o produto reconhece pra posições — vocabulário central do mental model LP.
Componentes (diff em relação à Tela 1)
Status v agora aberto (chevron rotated).Dentro do intervalo ✓ (dot verde — selecionado por default).Fora do intervalo ✓ (dot vermelho — selecionado por default).Fechado ☐ (dot cinza — desmarcado por default).Regras de negócio
Dentro do intervalo = preço atual está entre Min/Max do range → posição rendendo fees.Fora do intervalo = preço saiu do range → capital 100% num lado, parou de render fees, mas ainda existe on-chain.Fechado = user removeu liquidez → posição encerrada, sem capital ativo.Fechado — decisão razoável pra reduzir ruído.🟢 Insight 1 — Semáforo visual antes do label (● verde / ● vermelho / ● cinza) elimina necessidade de decode textual. User scan rapidamente "3 estados" sem ler. Padrão a herdar pra Kotai — qualquer dropdown de status binário/ternário deve ter affordance visual antes do label.
🟢 Insight 2 — Default In + Out (e não In só) reconhece que Out é estado que exige atenção, não que deve ser escondido. User precisa ver posições problemáticas pra agir. Esconder Out por default mascararia problemas. Padrão a herdar — defaults de filtro devem priorizar visibilidade de problemas, não limpeza visual.
🟢 Insight 3 — Fechado como estado nomeado separado de Removido/Excluído preserva histórico sem confundir com posição ativa. Posição existe on-chain pra sempre (NFT); fechada apenas significa "sem capital ativo". Vocabulário preciso. Padrão a herdar — posições/holdings que persistem on-chain devem ter taxonomia de estado, não dicotomia ativo/inexistente.
🔴 Fricção 1 — Microcopy do empty state (Nenhuma posição encontrada) NÃO se relaciona ao filtro ativo (estrutural — empty state ambíguo entre "não tem posição" e "filtro escondeu tudo")
In + Out selecionados; empty state diz "Você não tem nenhuma posição de liquidez". Mas a mensagem é a mesma se: (a) user de fato não tem posições; (b) tem posições mas todas em estado Fechado (desmarcado por default). Iniciante que tem posição fechada pensa "sumiu" — só descobre se desfizer o filtro por curiosidade.Fechado ocultas. [Mostrar todas]". Sem ambiguidade. Trade-off: lógica condicional + cálculo de total ignoring filter; trivial.🔴 Fricção 2 — Dentro / Fora do intervalo é tradução técnica de "in/out of range" — corretamente literal, mas distante do mental model do user (cosmética — vocabulário precisa de tradução pra consequência)
● Dentro do intervalo (rendendo) / ● Fora do intervalo (parado, ação sugerida) / ● Fechado (sem capital). Pareia label técnica com consequência. Trade-off: labels mais longas; cabem no dropdown.🔴 Fricção 3 — Dropdown de filtro sem indicador no botão de quantos filtros estão ativos (cosmética — affordance fraca de "filtro aplicado")
Status v volta ao estado neutro. User que esqueceu de re-selecionar Fechado (ou desmarcou In por engano) não vê pela toolbar que o filtro está "reduzido". Pode atribuir lista vazia a "não tenho posições" sem perceber que o filtro está restrito.Status: 2/3) polui toolbar.Status (2) quando filtro != default; Status puro quando default. Mostrar mudança em relação ao default protege user de auto-engano. Trade-off: adiciona contador; trivial.🟡 Oportunidade competitiva — Filtro de status com inteligência sobre "ação recomendada" por posição
Out of range > 24h, fees acumuladas > X, range desbalanceado, etc.⚠ Precisa de ação (3) no topo da toolbar lista posições urgentes.Ação recomendada acima de Status — agrupa por urgência (Out > 24h, Fees > 10× gas, Range desbalanceado). User vê "o que cuidar" antes de "como está cada posição".Observação adicional — Fechado desmarcado por default é decisão de produto coerente, mas pode esconder "posições zumbi" que ainda mantêm allowances ativos do contrato Permit2. Posição fechada não tem capital, mas o approval do token pode continuar válido (uint256 max). Em produto que mire iniciante, vale acoplar revisão de allowances pendentes ao filtro Fechado — "você tem 3 posições fechadas com aprovações ativas. Revogar?". Não é fricção desta tela, mas é gap arquitetural revelado pelo design do filtro.
O fluxo "Suas Posições" cobre três estados de entrada: usuário sem wallet (#5), carteira conectada sem histórico (#1–#4, #6), e sistema de filtros tridimensional (Status × Protocolo × Rede). O produto acerta em defaults que respeitam o modelo mental do usuário — filtros chegam pré-configurados para mostrar tudo, split button + Novo em #1 serve iniciante e avançado sem fragmentar UI — e no uso de empty states como espaço editorial em vez de placeholder mudo (#5, #6). O atrito concentra em quatro eixos sistêmicos: versionamento de protocolo exposto como primeira decisão sem nenhum decode (#1, #3); empty state que não distingue "nunca tive posição" de "o filtro escondeu tudo" (#2, #6); conteúdo editorial voltado a power user nas exatas telas onde o público é 100% iniciante (#5, #6); e header de rewards zerado sem condicional de estado, ocupando 30% do espaço útil de onboarding (#1, #6). O perfil mais prejudicado é o iniciante pré-primeira-posição: chega ao hub central do produto e encontra sistema de filtros pensado para power user, empty state ambíguo que pode simular perda de posições, APR de 87% sem caveat de IL, e cards educacionais sobre hooks. As oportunidades de maior leverage são sistêmicas — embedded wallet nativa, empty state prescritivo por saldo e substituição de versão por outcome formam um arco de diferenciação que nenhum concorrente entregou.
Padrão mais consistente do fluxo: toda interface de controle chega configurada para o menor esforço cognitivo possível, e a granularidade fica disponível sem obrigar. O split button + Novo em #1 é o exemplo mais limpo — clique direto leva pro default (v3), clique no chevron abre escolha de versão. O iniciante nunca vê o dropdown; o avançado nunca perde a opção. O mesmo princípio aplica aos filtros: Status chega com In + Out ativos em #2 — iniciante vê tudo o que precisa agir, sem precisar configurar; Protocolo em #3 chega com todas as versões marcadas (filtro que não filtra nada por default é filtro opt-in correto); Rede em #4 chega em Todas as redes, agregando patrimônio cross-chain automaticamente.
Diretriz a herdar para Kotai: affordances de poder devem existir e ser acessíveis, mas nunca estar no caminho padrão. Default = menor fricção; customização = opt-in explícito.
Em vez de placeholder mudo, o produto usa os três estados vazios como superfície de valor. Em #1, a sidebar Maiores pools por TVL substitui funcionalmente a lista de posições inexistente — pool discovery onde não há posição para mostrar. Em #5, sem wallet conectada, dois cards educacionais (Fornecer liquidez em protocolos diferentes e Hooks no v4) ensinam enquanto o usuário decide se conecta. Em #6, o layout de três zonas (header UNI / toolbar + lista / sidebar) preserva a arquitetura de informação mesmo com lista vazia — iniciante aprende a estrutura da tela sem precisar de posição para isso.
Diretriz a herdar: telas pre-conexão e empty states devem servir conteúdo contextualmente relevante. O vazio é oportunidade editorial, não ausência de UI.
Decisão arquitetural correta que aparece nas duas telas: sidebar de discovery (Maiores pools por TVL) funciona igual com wallet conectada (#6) e sem wallet (#5). Discovery não exige identidade. Esquerda da tela = patrimônio + ações (privado, requer identidade); direita = mercado + educação (público, independente de quem é o usuário). O layout de #6 deixa essa hierarquia visualmente clara.
Diretriz a herdar: separar explicitamente UI de discovery (pública) de UI de gestão (privada). Nunca bloquear descoberta por ausência de login.
O produto força o usuário a decidir versão de protocolo em dois momentos distintos antes que qualquer posição seja criada ou filtrada. Em #1, o dropdown + Novo apresenta Nova posição de v4 / v3 / v2 como primeira decisão de criação — em ordem cronológica reversa, implicando editorial "v4 é melhor". Em #3, o filtro Protocolo expõe v4 / v3 / v2 sem microcopy. Em nenhum dos dois lugares há tradução de o que cada versão faz para o usuário: v2 = full-range, simples, sem decisão de tier; v3 = concentrated liquidity com range manual; v4 = v3 + hooks customizáveis. Iniciante que clica v4 por estar no topo entra em flow com complexidade incompatível. Iniciante que usa o filtro Protocolo não sabe o que está filtrando.
Por que a solução óbvia falha: explicar diferenças em modal de onboarding é fricção; tooltip sai no próximo clique e não persiste no mental model.
Alternativa concreta: renomear em todo o produto por outcome, não versão técnica — Range completo, simples (v2) / Range manual + fees concentradas (v3) — Recomendado / Customizável com hooks (v4) — Avançado. No dropdown de criação, badge Recomendado em v3 resolve a decisão pra 90% dos iniciantes. No filtro, o nome por outcome elimina a necessidade de decode. Trade-off: vocabulário paralelo ao da indústria; resolver com glossário bridge na ajuda.
Família sistêmica confirmada: esta fricção aparece em 5 pontos no produto total (esta tela #1, filtro #3, header "Posição de v3" na PP Base, "Migrar para v4" na PP Base, dropdown Nova Posição). Torna-se alvo de diferenciação sistêmica, não correção pontual.
Perfil afetado: iniciante (decisão incompatível com mental model) + intermediário sem familiaridade com versionamento.
A mensagem Nenhuma posição encontrada é invariante, independentemente da causa. Em #2, com filtros In + Out ativos e Fechado desmarcado por default, usuário que tem posições fechadas vê empty state e pode concluir que "as posições sumiram". Em #6, essa é a tela canônica da fricção: a presença do banner "Quer ver suas posições fechadas? Use o filtro" é um patch que admite o problema sem resolvê-lo — o usuário já precisou ler o banner para entender que há algo oculto.
Por que a solução óbvia falha: banner pós-fato (como em #6) funciona apenas para usuários que leem microcopy; usuário ansioso com posição "sumida" já foi ao Discord antes de ler.
Alternativa concreta: empty state condicional ao filtro — se count(posições, ignorando filtro) > 0 e count(posições, com filtro) == 0, mostrar "Nenhuma posição corresponde aos filtros. Você tem 3 posições Fechado ocultas. [Mostrar todas]". Se count(posições, ignorando filtro) == 0, manter a mensagem atual. Diferenciação elimina ambiguidade. Trade-off: lógica condicional + query de count sem filtro; implementação trivial.
Perfil afetado: iniciante e intermediário com histórico de posições fechadas.
Os dois cards educacionais fixos no produto — Fornecer liquidez em protocolos diferentes e Hooks no v4 — aparecem em #5 (sem wallet conectada) e em #6 (carteira conectada, 0 posições). Esses são exatamente os estados onde o público é 100% iniciante/novato: quem chega em #5 sem wallet nunca usou DeFi; quem está em #6 com zero posições está na primeira visita à seção. Ambos os cards pressupõem familiaridade com o conceito de liquidez e com o ecossistema de versões. O iniciante lê Hooks no v4 e não tem frame de referência para processar a informação — o card não converte nem educa.
Por que a solução óbvia falha: trocar os cards inteiramente perde o usuário intermediário que retorna para ler material técnico. Duplicar conteúdo aumenta carga de curadoria.
Alternativa concreta: dois cards por nível de familiaridade — Primeira vez? Como funciona provisão de liquidez (3 min) (iniciante, link para guia com linguagem de outcome) e Fornecer liquidez em protocolos diferentes (intermediário). Ambos visíveis; hierarquia visual coloca iniciante em primeiro. Trade-off: curadoria de 2 cards; ganho: serve os 2 perfis em vez de exclusivamente o intermediário.
Perfil afetado: iniciante (principal — framing técnico é barreira imediata).
0 UNI Recompensas sem condicional de estado — telas 1, 6O bloco 0 UNI / Recompensas ganhas / Recolher recompensas (disabled) ocupa o topo da página e aparece tanto em #1 (dropdown aberto, empty state) quanto em #6 (tela canônica de empty state conectado). Em carteira sem posição, o bloco inteiro comunica: "você não tem nada porque não interagiu". Consome cerca de 30% do espaço útil pra dizer informação que o usuário já sabe. Para o iniciante, a primeira impressão da seção Pool é um painel de status de rewards zerados — sinalizando produto projetado para quem já tem histórico, não para quem está chegando.
Por que a solução óbvia falha: esconder condicionalmente requer detecção de count(posições) == 0; manter polui o empty state de onboarding.
Alternativa concreta: header condicional ao estado — se posições == 0, substituir bloco UNI por mensagem de boas-vindas ativa: "Primeira posição em LP? Comece aqui ou explore pools recomendadas."; se posições > 0, manter o bloco de rewards. Trade-off: renderização condicional; ganho: estado empty passa a servir como onboarding, não como status report vazio.
Família confirmada: 5 aparições no produto total (1, 6 deste fluxo + 3 aparições em PP Base). Dívida arquitetural: header global reusado sem condicional de estado da view.
Perfil afetado: iniciante (primeira impressão da seção Pool).
Em #1, o empty state apresenta Explorar pools (secundário, outline) e Nova posição (primário, rosa) com dimensões similares. O produto destaca Nova posição por convenção de UI (primário = ação principal), mas a realidade pedagógica é que 99% dos iniciantes deveriam explorar pools antes de criar — ver APRs, entender pares, comparar fee tiers. O CTA que mais beneficia o iniciante tem aparência de secundário. Em #5, sem wallet conectada, o par é Nova posição (outline) e Conectar carteira (branco/primário suave). Usuário exploratory não sabe qual escolher.
Por que a solução óbvia falha: inverter a hierarquia visual frustra o avançado que já sabe o que quer e espera o CTA de criação em destaque.
Alternativa concreta: microcopy entre os CTAs que devolvem recomendação sem mudar hierarquia visual — "Novo em LP? Explore pools primeiro. Já sabe o par? Crie a posição." Cada frase vinculada ao CTA correspondente. Em #5, acrescentar debaixo do Conectar: "Ainda explorando? Continue sem conectar →" destaca o caminho correto para o explorador sem alterar o primário. Trade-off: mais 1 linha de microcopy; ganho: iniciante recebe nudge correto sem mudar affordance visual.
Perfil afetado: iniciante (principal — sem guidance, paralisia de escolha).
Em #2, após fechar o dropdown Status, o botão retorna ao visual neutro sem mostrar quantos estados estão ativos. Usuário que desmarcou In range por engano não tem sinal visual na toolbar de que o filtro está restrito. Em #4, o filtro de rede é o único da toolbar sem label textual — só ícone composto + chevron. Os outros três filtros têm label (Status v, Protocolo v); o de rede não. Usuário que olha pela primeira vez pode não reconhecer o ícone como filtro de rede.
Alternativa concreta: para o filtro Status: badge numérico discreto no botão — Status (2) quando difere do default; Status quando default. Para o filtro de rede: adicionar label Rede v ao lado do ícone composto, ou Todas as redes v quando default ativo. Trade-off: mais espaço na toolbar; ganho: paridade de affordance entre os quatro filtros.
Perfil afetado: todos os perfis; iniciante demora mais para identificar o problema.
Padrão atual da indústria: Uniswap (esta tela), PancakeSwap, KyberSwap, 1inch — todos iniciam o fluxo em "Conectar carteira". Nenhum oferece criação de carteira dentro do produto. Onboarding começa após pré-requisito externo cumprido: wallet EOA instalada, seed phrase salva, carteira financiada.
Por que afeta nosso target: iniciante absoluto — o maior pool de usuários potenciais — não tem wallet. Cada DEX atual exige jornada externa (instalar MetaMask, backup de seed, comprar crypto em exchange, transferir) antes da primeira interação. Esse funil elimina a maioria dos candidatos antes do produto ter qualquer chance de retê-los. O microcopy "Para visualizar posições e recompensas, conecte sua carteira" em #5 pressupõe que o usuário já concluiu essa jornada.
Hipótese de diferenciação Kotai: CTA primário Entrar com email ou Google ao lado de Conectar carteira existente. Email cria smart wallet self-custody via Privy ou Dynamic (passkeys, social recovery), sem seed phrase. On-ramp integrado (Moonpay, Transak) permite aporte fiat direto. Usuário não-cripto vira usuário DeFi sem sair do produto, em menos de 5 minutos.
Trade-off: custo de embedded wallet provider (~$0,05/MAU via Privy); responsabilidade de UX de recuperação (passkeys, social recovery); comunicar clareza de custódia ("seus fundos, não nossos"). Mitigação: smart wallet self-custody = Kotai nunca detém fundos.
Passa nas 4 perguntas-teste? (1) ✓ Nenhum DEX incorpora criação de wallet (2) ✓ Afeta iniciante absoluto, target principal (3) ✓ Embedded wallets (Privy, Dynamic, Coinbase Smart Wallet) existem e são maduras; razão de ninguém ter implementado é investimento de produto, não impossibilidade técnica (4) ✓ Ganho imediatamente perceptível — usuário sem cripto usa DeFi sem sair do produto.
Leverage: estruturalíssima — converte produto cripto-nativo em produto de massa. Família com 🟡 "Modo tutorial" (1) e 🟡 "Empty state prescritivo" (6).
Padrão atual da indústria: Uniswap (telas #1 e #6), PancakeSwap — empty state é convite genérico ("Crie uma nova posição para começar a ganhar tarifas"). Não considera o que o usuário tem na carteira, qual par seria mais óbvio, ou qual configuração seria conservadora para uma primeira posição.
Por que afeta nosso target: iniciante com $1000 USDC + $500 ETH na carteira tem um caminho ideal de primeira posição baseado nos ativos que já possui. O empty state genérico ignora essa informação e força a jornada de descoberta completa (explorar pools → escolher par → escolher fee tier → configurar range). Específico converte; genérico não.
Hipótese de diferenciação Kotai: leitura on-chain de saldos da wallet ao conectar. Empty state em #6 passa a mostrar: "Você tem $1.000 USDC e $500 ETH. Pool sugerida: USDC/ETH 0,05% fee com range largo — segura para primeira posição. APR médio 30d: 4,89%. [Criar essa posição]". CTA Criar essa posição pré-configura par + range conservador + fee tier dominante. Avançado ignora a sugestão e vai direto para configuração manual. Em #1 sem posições mas com saldo, o mesmo padrão substitui o empty state genérico.
Trade-off: opinião editorial sobre par e range sugeridos; aceitar com critérios transparentes (par mais líquido com os ativos existentes + range de ±20% como conservador). Exige leitura on-chain de saldos ao conectar.
Passa nas 4 perguntas-teste? (1) ✓ Todos os concorrentes têm empty state genérico (2) ✓ Afeta iniciante diretamente (3) ✓ Razão = leitura on-chain + regras editoriais de recomendação; factível (4) ✓ Ganho perceptível — empty state passa de placeholder para assistente de primeira posição.
Leverage: alta — converte estado de maior abandono (vazio, sem direção) em assistente de onboarding. Família com 🟡 "Modo tutorial guiado" (1) e 🟡 "Card prescritivo" (PP Base Tela 10).
Padrão atual da indústria: Uniswap (tela #1 e #3), PancakeSwap v3, 1inch — versão de protocolo é decisão visível para o usuário em múltiplas telas. Implementation detail vaza para a UI como conceito de primeira classe.
Por que afeta nosso target: iniciante não tem mental model para "versão de protocolo". Aprende decorando ("v3 é a boa") sem compreender por quê. Cada DEX tem versões com semântica diferente — "v3 do Uniswap" não ajuda no PancakeSwap v3. O conhecimento não transfere; o usuário está sempre decodando siglas sem base semântica.
Hipótese de diferenciação Kotai: substituir versão por outcome em toda a UI. Filtros: Range completo / Range manual / Customizadas (hooks). Dropdown de criação em #1: Posição simples (full range) / Posição com range (concentrada) / Posição com hooks (avançado). Versão técnica (v2/v3/v4) fica disponível como tooltip de detalhe ou em modo técnico opt-in nas configurações.
Trade-off: glossário paralelo ao da indústria (Kotai usa "Range manual", mercado usa "v3"); custo de coerência com documentação externa. Mitigação: "Range manual (v3)" como label bridge durante período de transição.
Passa nas 4 perguntas-teste? (1) ✓ Todos os concorrentes expõem versão técnica (2) ✓ Afeta iniciante e intermediário (3) ✓ Curadoria + reescrita de toda referência à versão = investimento de produto; não impossibilidade técnica (4) ✓ Ganho perceptível — usuário vê "Range completo" e entende sem precisar decorar v2/v3/v4.
Leverage: alta e sistêmica — 5 ocorrências no produto, todas elegíveis para a mesma correção. Família com 🔴 Fricção 1 deste consolidado (1, 3) + fricções de versão em PP Base.
Padrão atual da indústria: Uniswap (tela #2), PancakeSwap v3 — filtro de status é descritivo (mostra onde geometricamente a posição está: dentro ou fora do range). Não há filtro que agrupe por urgência de ação: "posição fora de range há mais de 24h", "fees acumuladas maiores que X× o custo de gas para coletar", "range desbalanceado com risco de conversão total".
Por que afeta nosso target: iniciante e intermediário com múltiplas posições não sabem qual cuidar primeiro. O filtro atual os ajuda a categorizar ("quantas estão fora de range?") mas não a priorizar ("qual precisa de ação hoje?"). A diferença entre filtro descritivo e filtro prescritivo é exatamente a diferença entre ferramenta de power user e assistente de gestão.
Hipótese de diferenciação Kotai: chip ⚠ Precisa de ação (N) na toolbar, acima dos filtros de Status/Protocolo/Rede. Clicar mostra apenas as posições com critério de urgência ativo (fora de range há >24h, fees acumuladas > 5× gas, ou exposição unilateral >80%). Cada posição no resultado exibe o motivo da urgência inline.
Trade-off: modelo editorial de urgência requer regras transparentes para o usuário — "o que faz uma posição aparecer aqui?". Aceitar com critérios visíveis nas configurações.
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 + regras editoriais = falta de investimento (4) ✓ Ganho perceptível — usuário abre hub de gestão e vê imediatamente "3 posições precisam de ação" sem precisar ler cada posição.
Leverage: média-alta — converte painel de gestão passivo em assistente ativo. Família com 🟡 "Card prescritivo" (PP Base Tela 10) — sistema Kotai de assistência ativa em gestão de posições.
In + Out (não só In) reconhece que posição fora de range exige atenção, não deve ser escondida — visibilidade de problemas por default.Novo em chains recém-integradas sinaliza produto vivo e atualizado — construção de confiança com power user.Protocolo é redundante para iniciante com posições em apenas 1 versão — ocupa espaço de toolbar sem entregar valor. Correção via conditional render: mostrar o filtro apenas quando count(versões distintas nas posições) ≥ 2.Novo em Tempo aumenta atratividade sem entregar informação — usuário curioso clica e não recebe contexto (TPS, gas, maturidade). Correção via tooltip on-hover com 1 frase contextual por rede.Importar posições v2 relegado a microcopy de rodapé — usuário com posição v2 legada vê empty state e pode concluir que perdeu a posição. Solução via detecção on-chain: se wallet tem NFT v2, exibir banner amarelo no topo ao conectar.Rápidas e baratas / Ethereum / Outras) em vez de lista plana — PASSA nas 4 perguntas-teste; leverage menor que as oportunidades principais por ser decisão pouco frequente.
Função: dropdown do 4º filtro (ícone multi-rede) aberto exibindo lista completa de chains suportadas pra filtrar posições por rede. Tela revela amplitude do produto cross-chain do Uniswap — 9+ redes em produção, incluindo nova chain Tempo com badge Novo.
Componentes (diff em relação à Tela 1)
Todas as redes (selecionado por default).Ethereum (ícone Ξ).Unichain (ícone Uniswap rosa).Base (ícone azul).Arbitrum (ícone azul claro).Tempo + badge Novo (rosa).Monad (ícone roxo).Polygon (ícone roxo).X Layer (ícone preto).OP Mainnet (ícone vermelho).Regras de negócio
Todas as redes = agregação automática de posições cross-chain.+ Novo — criar posição na rede selecionada).Novo em Tempo indica lançamento recente — sinal de mídia/produto pra promover adoção.🟢 Insight 1 — Default Todas as redes agrega patrimônio cross-chain sem exigir setup. User com posições em Base e Arbitrum vê tudo junto. Sem isso, user teria que trocar manualmente entre redes — fricção de power user transferida pra default. Padrão a herdar pra Kotai — multi-chain deve ser default agregado, restrição é opt-in.
🟢 Insight 2 — Ícones coloridos por rede + label = identificação por reconhecimento, não leitura. User experiente reconhece Base pelo azul, Arbitrum pelo logo. Padrão a herdar — listas de redes devem ter affordance visual de marca, não só texto.
🟢 Insight 3 — Badge Novo em Tempo é sinal de produto vivo e atualizado. Comunica que o produto integra novas chains em ritmo — sinal de saúde da plataforma pra power user. Padrão a herdar — flags Novo / Beta / Deprecated em itens de catálogo aumentam confiança.
🔴 Fricção 1 — Lista de 9+ redes sem categorização semântica (L1/L2/app-chain) força user a saber o que é cada uma (estrutural — catálogo plano onde hierarquia ajudaria)
Ethereum (L1, gas alto), Base (L2, gas baixo), Polygon (L2 EVM), Unichain (app-chain Uniswap), Monad (L1 alternativo), Tempo (??). Iniciante não sabe diferença e o produto não explica. User pode escolher Ethereum por nome familiar e pagar 50× mais gas que faria na Base equivalente. Pior: cada rede tem custos, latências, segurança e ecossistema diferentes — escolha cega tem consequência real.L1 / L2 / App-chain) é tecnicamente correto mas usa vocabulário que iniciante não decoda; descrição inline por rede polui.Redes rápidas e baratas (L2s: Base, Arbitrum, OP Mainnet, Polygon) / Outras redes (Ethereum, Unichain, Tempo, Monad, X Layer). Ou: badge inline ~$0.01 gas / ~$15 gas ao lado de cada item. Trade-off: opinião editorial sobre rede; aceitar com base em mediana de gas observada.🔴 Fricção 2 — Ícone do filtro de rede (mix de logos sobrepostos) é affordance fraca de "filtrar por rede" (cosmética — affordance icônica sem label)
Status v, Protocolo v) têm label textual. O filtro de rede é só um ícone composto + chevron. User que olha pela primeira vez não sabe que é filtro de rede — pode achar que é "carteiras conectadas" ou "chains ativos". Iniciante não clica por incerteza; intermediário clica por curiosidade.Rede v aumenta largura da toolbar.Rede v (ou Todas as redes v quando default ativo) compactando ícone. Toolbar fica com 4 botões com label, não 3 + 1 puramente icônico. Trade-off: mais espaço; ganho: paridade de affordance entre filtros.🔴 Fricção 3 — Tempo aparece sem contexto do que é a chain — badge Novo aumenta atratividade sem entrega de informação (estrutural — produto promove rede nova com badge sem explicar por que escolher)
Novo é gatilho de curiosidade — "o que é Tempo?". User clica esperando descobrir. Mas a tela só restringe a listagem (que já está vazia). Não há contexto: TPS? gas? backers? Comparação com outras chains? Decisão de escolher Tempo vira aposta cega.Tempo mostra "L2 de alta performance, lançada 2026, gas ~$0.005". Disponível em todas as redes (não só novas). Trade-off: curadoria contínua.🟡 Oportunidade competitiva — Seletor de rede com "agregação por finalidade" em vez de catálogo plano
Para iniciantes (gas barato, alta confiabilidade): Base 🥇 / Arbitrum 🥈 e escolhe com critério.Iniciante / Equilibrada / Avançada baseado em gas médio + maturidade + liquidez. Mostra recomendação top dentro de cada categoria.Observação adicional — Uniswap lista Unichain como uma rede entre outras, sem destaque editorial. Sendo a app-chain proprietária do Uniswap, faria sentido empurrá-la (Coinbase faz isso com Base). Decisão de mantê-la neutra é product-political — não "empurrar nossa rede". Vale registrar como observação de postura de produto: cross-promo é seletivo (X Layer cross-banner sim, Unichain destaque não). Inconsistência interna do produto.







Função: Dashboard principal do portfólio após conexão de carteira EVM sem fundos. Entry point pós-onboarding: o produto precisa converter o estado vazio em decisão de funding (comprar, receber transfer ou puxar de CEX). É a tela mais delicada do flow inteiro — se aqui o usuário não souber o próximo passo, a sessão morre.
Componentes
Negociar / Explorar / Pool / Portfólio ✓), search bar Pesquisar tokens, pools e carteiras, badge da wallet 0xd09B…618a no canto direito.0xd09B…618a + microcopy +1 a mais (multi-wallet). Direita: CTA Compartilhar + seletor Todas as redes ▾.Visão geral ✓ / Tokens / NFTs / Atividade.0,00 US$ em cinza-claro.1 hora / 1 dia ✓ / 1 semana / 1 mês / 1 ano / Tudo — todos clicáveis.Regras de negócio
Todas as redes agrega saldo cross-chain (escopo do número 0,00 US$).+1 a mais indica que existem outras wallets vinculadas — agregação multi-wallet sem expor todos os endereços.🟢 Insight 1 — Empty state convertido em 3 paths de funding explícitos. O estado mais doloroso do produto ("como coloco dinheiro aqui") é dissolvido em 3 cards nomeados por fonte de origem, não por jargão. Diferente de empty state genérico (ilustração + "nada aqui ainda"), este vira interface de decisão. Padrão a herdar para Kotai — toda tela com saldo zero precisa entregar caminho concreto de funding, não decoração.
🟢 Insight 2 — Microcopy descreve a modalidade, não o produto. "Cartão de débito ou conta bancária" (não "Moonpay"), "de outra carteira" (não "deposit address"), "de uma plataforma de negociação" (não "CEX"). Iniciante reconhece o conceito antes do nome do parceiro. Padrão a herdar — copy de empty state deve falar a língua da pergunta mental do user, não a do backend.
🔴 Fricção 1 — Gráfico placeholder com controles temporais ativos não faz sentido em saldo zero (estrutural — controle morto polui affordance)
1 hora / 1 dia / 1 semana ...) sugerem que há série temporal pra explorar. Iniciante clica 1 mês, nada acontece — saldo sempre foi 0. Controle interativo morto erode confiança no resto da UI ("o que mais não funciona?").🔴 Fricção 2 — Todas as redes no header sem informar quais redes (estrutural — agregação opaca afeta confiança no número)
0,00 US$ é agregado cross-chain, mas o user não sabe sobre quantas/quais redes. Se ele tiver token em rede não suportada (ex: Avalanche, BSC), o número mostra 0 e ele conclui que perdeu fundos quando na verdade só está fora do escopo. Risco de pânico falso e churn no momento mais frágil.Todas as redes (18) + tooltip no hover com a lista completa. Iniciante percebe que existe um escopo definido (não é "todo o universo cripto"); avançado decoda direto. Trade-off: mais um número no header.🔴 Fricção 3 — Hierarquia entre os 3 cards de funding é plana (cosmética — recomendação implícita ausente)
Compre criptos em destaque (rosa). Wallet com transações em outra chain → Receber criptos em destaque. Os outros dois ficam como secundários, não ocultos. Trade-off: exige heurística + risco de errar; aceitar com fallback neutro.🟡 Oportunidade competitiva — On-ramp local-first como primeiro card de funding (alta leverage no target BR/LatAm)
Comprar com cartão via on-ramp global (Moonpay, Transak, Ramp) com fee de 3–7% e UX desconectada da geografia. Para usuário BR, isso significa cobrança em USD, conversão cambial opaca, taxa alta vs alternativa local (PIX → CEX BR → wallet sai mais barato e mais rápido).Compre criptos e cai em fluxo Moonpay com fee 6% + KYC internacional abandona a sessão. O empty state "perde" o user antes dele tocar no produto.Compre criptos mostra inline via PIX (BR) — taxa estimada 1,5% como default; cartão internacional vira fallback dentro do modal. Fee exibida ANTES do clique, não escondida no flow Moonpay.Observação adicional: +1 a mais no avatar é progressive disclosure correta para multi-wallet, mas não há indicação do que acontece ao clicar (lista? troca de wallet ativa? agregação?). Não é fricção desta tela, mas é nota pra checar consistência do flow multi-wallet — o número é affordance que precisa cumprir o que sugere.
Receber criptosFunção: Modal de funding por transferência. Acionado pelo card Receber criptos da tab Visão geral. Entrega os endereços de depósito da wallet do user, organizados por família de chain (EVM agregado + Solana separada) + atalho De uma conta pra puxar de CEX. É o modal mais sensível do flow inteiro — endereços errados/redes erradas custam dinheiro real e irreversível.
Componentes
📧 Pedir ajuda (suporte contextual) à esquerda + X fechar à direita.Receber criptos.0xd09B…618a + caption Ethereum +17 redes + 2 botões à direita (📋 Copiar | ▦ QR).EQp4…BDxK + caption Solana + 2 botões idênticos (📋 Copiar | ▦ QR).De uma conta.Coinbase (sem CTA secundário; clique navega).Regras de negócio
Coinbase) é deeplink pra Coinbase Onramp/transfer — pré-preenche endereço da wallet + sugere envio na rede correta. Não é endereço, é integração de aplicativo.🟢 Insight 1 — Agregação EVM num endereço único é decisão arquitetural correta. Listar Ethereum, Arbitrum, Base etc. como cards separados (cada um repetindo o mesmo endereço) seria poluição vazia — o endereço é o mesmo. Caption Ethereum +17 redes comunica o escopo sem repetir o endereço. Padrão a herdar — quando o protocolo subjacente é o mesmo, agregar; quando é diferente (Solana), separar.
🟢 Insight 2 — 📧 Pedir ajuda no header do modal é affordance de suporte exatamente no momento mais sensível. Transfer de cripto é o ponto de não-retorno; ter suporte 1 clique de distância (não enterrado no footer da app, não em chatbot lateral) é decisão consciente de segurança. Padrão a herdar — affordance de ajuda deve viver dentro de modais de ação irreversível, não global na app.
🟢 Insight 3 — De uma conta — Coinbase como caminho não-onchain reconhece a realidade do funding. Maioria do user iniciante não tem "outra wallet" pra puxar — tem CEX. Diferenciar visualmente "De uma carteira" (endereços) vs "De uma conta" (CEX integration) educa sem precisar de jargão. Padrão a herdar.
🟢 Insight 4 — QR Code + Copy como ações pareadas. Cobre os dois caminhos reais: copy pra colar em app desktop, QR pra escanear no celular. Padrão correto.
🔴 Fricção 1 — +17 redes sem listar quais redes (e quais NÃO estão) (estrutural — vetor #1 de perda de fundos)
Ethereum +17 redes e assume que sua rede está incluída — copia endereço, envia, fundos somem em chain não suportada (ou pior: chegam em chain suportada mas o produto não detecta o token, então user vê wallet "vazia" e entra em pânico). "+17" oculta exatamente a informação que evita perda: quais são as 17 e quais não são.Ethereum +17 redes ▾ expandível que abre a lista completa inline; alternativamente, tooltip no hover. Mais importante ainda: separar a lista em "redes suportadas" e "redes populares NÃO suportadas" (ex: "Avalanche não está incluída — não envie"). Trade-off: lista negativa é decisão delicada (pode ofender ecossistemas), mas é a única que evita erro silencioso.🔴 Fricção 2 — Modal entrega endereço sem nenhuma proteção de token-rede mismatch (estrutural — vetor #1 de perda real em DeFi)
De uma conta — Coinbase, integração já pré-seleciona token+rede e o problema some por construção. Trade-off: 1 clique a mais; ganho: zero perda silenciosa.🔴 Fricção 3 — Ícone ampulheta cinza pra Solana é semanticamente errado (cosmética — signal visual contradiz atributo da chain)
🟡 Oportunidade competitiva — Receber como fluxo guiado token-rede-first em vez de endereço-first (alta leverage no target)
De uma conta — Coinbase permanece como fast-path para quem está em CEX (integração já resolve token+rede automaticamente). Modo "endereço cru" sobrevive como toggle "avançado" no canto.Observação adicional: Coinbase é a única CEX listada — exclusão deliberada de Binance, Kraken, OKX, MercadoBitcoin etc. Pode refletir parceria comercial (Coinbase Onramp API), pode refletir geografia do target (Coinbase é forte em US/UE, fraco em LatAm/Ásia). Para iniciante BR a integração "Coinbase" é praticamente inútil — vetor de exclusão geográfica não-óbvio. Vale registrar como decisão estratégica do Uniswap (não fricção desta tela) e mapear como Kotai pode capturar o caminho que falta: integração local-first (Mercado Bitcoin/Bitso/Notus pra BR/LatAm) na mesma posição visual do Coinbase aqui.
Função: Sub-página da tab Tokens (URL /portfolio/tokens) no estado em que a carteira não tem nenhum token detectado pelo indexer. Função primária: confirmar ausência sem alarmar e direcionar pra ação concreta de funding.
Componentes
0xd09B…618a, +1 a mais, Compartilhar, Todas as redes ▾).Visão geral / Tokens ✓ / NFTs / Atividade.0,00 US$ + linha secundária ▲ 0,00% · 0 tokens (seta verde, texto cinza).Procurar tokens (input ativo mesmo no empty).Nenhum token ainda + subtítulo Transfira tokens de outra carteira para começar.Regras de negócio
/portfolio/tokens — cada tab é estado URL-able.▲ 0,00% é calculado sobre janela default (1d) — verde+seta vêm do template do estado populado.🟢 Insight 1 — Copy do empty state é instrução imperativa e específica. "Transfira tokens de outra carteira para começar" diz exatamente o que fazer e de onde (outra carteira). Não usa jargão ("deposit address", "on-chain transfer") nem genericidade ("adicione fundos"). Iniciante sai com instrução acionável. Padrão a herdar — empty state nunca como decoração; sempre instrução acionável em verbo no imperativo + objeto específico.
🟢 Insight 2 — Search bar visível mesmo com lista vazia. Comunica implicitamente que a lista pode crescer e será buscável quando crescer. É affordance "escala-pronta" — o user entende que esta tela escala sem ele precisar imaginar como. Padrão a herdar — controles que farão sentido depois devem permanecer visíveis (não escondidos) no empty.
🔴 Fricção 1 — Instrução do empty state sem CTA correspondente inline (estrutural — gap entre dizer e fazer)
Receber criptos, com endereços por rede + QR) existe — mas só na tab Visão geral, como card lateral. Aqui na tab Tokens, o user lê a instrução e não tem botão. Cenário típico: abre Etherscan/MetaMask manualmente, faz transfer com endereço copiado de outro lugar — desnecessariamente fora do produto, com risco de copiar endereço errado.Receber criptos inline abaixo da copy, abrindo o mesmo modal que existe na Visão geral. Um CTA alinhado a uma instrução. Trade-off: mais um botão na tela; ganho: zero gap entre dizer "transfira" e dar a ferramenta de transfer.🔴 Fricção 2 — Delta ▲ 0,00% · 0 tokens em verde sugere performance positiva onde não há nada pra medir (estrutural — métrica nonsense renderizada como signal positivo)
Sem variação para medir. Mantém o slot, remove o falso signal. Trade-off: regra extra de renderização por estado; ganho: zero leitura ambígua e transição visual proporcional quando popular.🔴 Fricção 3 — Big stat 0,00 US$ ambíguo entre "total tokens" e "total portfólio" (estrutural — escopo do número não está rotulado)
0,00 US$ aparece grande, idêntico ao da Visão geral. No vazio coincide; quando o portfólio for misto (tokens + NFTs + posições em pool), o número da tab Tokens será subset do número da Visão geral. Sem rótulo, user que troca de tab vê o saldo "cair" e não entende — "perdi algo?". É bomba-relógio: a fricção aparece quando o produto for usado de verdade, não no empty.Total em tokens na tab Tokens, Patrimônio total na Visão geral. Hierarquia clara: o number é do escopo da tab, não do portfólio inteiro. Trade-off: label adicional consome vertical; ganho: zero confusão quando o portfólio for misto.Todas as redes: mesma raiz — produto exibe agregados sem rotular o escopo da agregação.🟡 Oportunidade competitiva — Distinguir valor declarado × valor recuperável por token (média-alta leverage no target)
100 US$ · saída estimada 14 US$ e ajusta expectativa antes de tentar vender.Valor: 100 US$ · Saída estimada: 14 US$ (calculado com slippage real da melhor rota de venda em USDC/ETH). Na hero do portfólio, dois numbers — Patrimônio declarado e Patrimônio recuperável. Toggle pra avançado esconder.Observação adicional: a URL muda corretamente pra /portfolio/tokens (deeplink por tab) — padrão a herdar. Permite compartilhar a aba específica e voltar via histórico do browser. Pequeno detalhe técnico que sustenta navegação séria; vale checar se as outras tabs (NFTs, Atividade) também são URL-able com o mesmo rigor.
Função: Tab Atividade (URL /portfolio/activity) em estado sem histórico, com o popover Compartilhar (acionado a partir do botão do header) aberto sobre a UI. Tela serve dois objetivos simultâneos: confirmar ausência de transações e expor o vetor social do produto (compartilhar wallet pública).
Componentes
0xd09B…618a, +1 a mais, CTAs Compartilhar + Todas as redes ▾).Visão geral / Tokens / NFTs / Atividade ✓.Todos os tipos ▾, dropdown Todo o período ▾, search bar Procurar atividade (à direita).Nenhuma atividade ainda + subtítulo "Quando você fizer transações, elas aparecerão aqui."Compartilhar aberto, ancorado abaixo do botão direito, com 3 itens:Copiar link do portfólioCopiar link do portfólio (label idêntico ao anterior — só o ícone diferencia)Compartilhar no TwitterProcurar atividade.Regras de negócio
Todos os tipos e Todo o período ativos mesmo no empty — clicar abre dropdown mas não tem efeito sobre a lista vazia.🟢 Insight 1 — Empty state com copy causal supera empty state imperativo. "Quando você fizer transações, elas aparecerão aqui" descreve a causa (fazer transação) E o efeito (aparecer aqui), sem ordem imperativa nem instrução acionável que não pertence à tela. Diferente da tab Tokens (que pede transferência), a tab Atividade não pode ser "populada por ação direta" — só populates como consequência de outras ações. A copy reconhece isso. Padrão a herdar — empty state declarativo onde não há ação local, imperativo onde há.
🟢 Insight 2 — Compartilhamento de portfólio como objeto público é vetor DeFi nativo. Wallets são públicas on-chain — o produto não "esconde" isso, materializa como compartilhável. Reconhece o etos do espaço (transparência radical) e abre vetor orgânico de crescimento (amigo manda link → conversão). Padrão a herdar.
🔴 Fricção 1 — Dois itens Copiar link do portfólio com label idêntico, diferenciados apenas por ícone (estrutural — ambiguidade no momento da ação)
Copiar link (Ethereum) e Copiar link (Solana). Ou consolidar em um link único que abre uma página pública mostrando ambos os endereços. Trade-off: labels ficam mais longos; ganho: zero ambiguidade no clique.🔴 Fricção 2 — Compartilhar exposto no header com peso primário mesmo em estado vazio (estrutural — affordance social desalinhada com o estado do produto)
0,00 US$, zero atividade, zero NFTs. O CTA Compartilhar permanece no header como botão de destaque equivalente a Todas as redes. Compartilhar o quê? Quem recebe o link vê wallet vazia — signal social negativo ("esse user não tem nada", "o produto é vazio"). A affordance está convidando uma ação que prejudica o user que aceita.Compartilhar até existir saldo — perde flexibilidade (dev wallet, wallet de teste, wallet recém-criada de propósito).Compartilhar para botão secundário/ícone enquanto saldo = 0; promover quando houver atividade. Ou adicionar microcopy de aviso no popover ("Seu portfólio está vazio — talvez você queira adicionar fundos primeiro") com link pros 3 caminhos de funding. Trade-off: hierarquia muda dinamicamente; ganho: zero auto-sabotagem social.🔴 Fricção 3 — Popover obstrui a search bar Procurar atividade (cosmética — sobreposição entre controles da mesma tela)
Compartilhar (não para baixo direito) ou usar dropdown vertical mais curto que termine antes da linha da search. Trade-off: anchoring extra; ganho: zero sobreposição.🟡 Oportunidade competitiva — Compartilhamento de portfólio com contexto + atribuição (média leverage no target)
no Twitter gera preview card com saldo agregado (sem expor números individuais por privacidade).Observação adicional: o popover está funcionalmente acoplado à página inteira (não à tab Atividade) — o mesmo botão Compartilhar aparece nas 4 tabs. Faz sentido como ação de wallet, não de tab. Mas, ao posicioná-lo no header e mantê-lo ativo em qualquer tab, o produto está dizendo "compartilhar é tão importante quanto navegar entre tabs". Vale checar se a prioridade implícita bate com o roadmap social do produto — se compartilhar é estratégico, fica; se é feature secundária, rebaixar para menu de ações da wallet.
O fluxo de Portfólio do Uniswap é, na prática, um mapa de estados vazios — quase todas as telas analisadas mostram a wallet antes de ter qualquer ativo. As melhores decisões do produto estão exatamente aqui: empty states que viram instruções acionáveis (1), microcopy que fala a língua do usuário sem jargão (2), suporte contextual posicionado no momento de maior risco (4). O atrito se organiza em três vetores estruturais: (1) agregações que escondem escopo e criam risco de erro (4, 11); (2) affordances que fingem funcionar em estados onde não funcionam (1, 8); (3) ausência de capacidade contábil/fiscal — log bruto onde o target BR/LatAm precisa de instrumento de declaração (8, 10). Iniciante BR é o perfil mais afetado em praticamente todos os vetores — o produto trata funding como problema global quando é problema local, e trata o portfólio como dashboard de vaidade quando deveria ser instrumento contábil.
Em nenhuma das telas o estado vazio é decoração. A tela 1 entrega 3 cards de funding nomeados por fonte de origem (1) — "Cartão de débito ou conta bancária", "de outra carteira", "de uma plataforma de negociação". A tab Tokens (2) e a tab NFTs (7) usam imperativo direto com objeto específico ("Transfira tokens / NFTs de outra carteira para começar"). A tab Atividade (8) diferencia: como não pode ser populada por ação direta, usa copy causal — "Quando você fizer transações, elas aparecerão aqui" — reconhecendo que o gatilho está em outra tela. Padrão a herdar integralmente — cada empty state precisa entregar instrução na língua do ato que o usuário precisaria fazer, não do produto que executa por trás.
Quatro pontos distintos do flow evitam jargão de forma consistente: "Cartão de débito ou conta bancária" (não Moonpay) e "de uma plataforma de negociação" (não CEX) na visão geral (1); "Transfira tokens de outra carteira" (não "deposit address") na tab Tokens (2); "quando você fizer transações" (não "on-chain activity") na tab Atividade (3); "Plataforma de negociação" no modal de Transferência (6). O padrão é deliberado e consistente — o produto fala o conceito mental do usuário, não o termo do protocolo. Padrão a herdar — copy de empty states e modais de funding sempre pelo conceito do usuário, não pela nomenclatura técnica.
A tab Tokens mantém search bar ativa mesmo sem nenhum token detectado (2). A tab Atividade exibe os dropdowns Todos os tipos e Todo o período + search bar mesmo sem histórico (8), e a estrutura de 11 categorias (9) e 4 janelas temporais (10) estabelece o modelo mental futuro. User aprende a arquitetura de filtros antes de precisar dela — quando o portfólio crescer, ele já sabe onde recortar. Padrão a herdar — controles que farão sentido depois devem ser visíveis no empty (mas ver abaixo a ressalva crítica sobre estado enabled/disabled).
A tab Atividade usa copy causal que explica o gatilho sem fingir ação disponível (3). A tela de gráfico com erro mantém o widget cinza com tooltip Dados do gráfico ausentes (5) — preserva o slot e declara o que faltou, em vez de ocultar silenciosamente. Ambos priorizam honestidade visual. Padrão a herdar — error/empty declarativo supera silêncio; suprimir o widget é pior que explicá-lo.
Ambos os modais de funding — Receber criptos (4) e Transferência (6) — têm 📧 Pedir ajuda no header, não no footer global da app. Affordance de ajuda posicionada no momento de maior risco (transferência irreversível). Decisão consciente e consistente. Padrão a herdar — ajuda contextual dentro de modais de ação irreversível, não global.
Diagnóstico do atrito real: o produto expõe controles clicáveis que não produzem nenhum efeito útil no estado em que estão. As timeframe pills 1 hora / 1 dia / 1 semana... são clicáveis no empty state limpo (1) e também no estado de erro do gráfico (5). Os dropdowns Todos os tipos e Todo o período abrem, permitem selecionar categorias, mas a lista de Atividade continua vazia sem nenhum feedback de "0 resultados" (8). A search bar de Atividade aceita input mas retorna sempre o mesmo empty, sem mensagem de "0 resultados" (9). Cada clique morto erode confiança na UI — o usuário conclui "o que mais não funciona aqui?". No contexto de erro (5), é pior: as pills de timeframe são interpretadas como "talvez clicando em outro período resolva o problema".
Por que a solução óbvia falha: desabilitar os controles completamente destrói o padrão "controles visíveis no empty" (Insight 3 acima) — eles têm valor pedagógico real.
Alternativa: manter visíveis + desabilitados no estado inativo — chevron cinza, sem dropdown, com tooltip "Disponível após a primeira transação" (ou "Aguardando dados"). Restaurar ao estado ativo quando há conteúdo. É a única solução que preserva o valor pedagógico sem o custo do clique morto.
Trade-off: dois estados visuais por controle (disabled empty / enabled populated); ganho: zero clique sem resposta, zero confiança erodida. Perfil afetado: iniciante (principal).
Diagnóstico do atrito real: o produto exibe números e listas agregadas sem declarar o escopo da agregação em quatro pontos distintos do flow. O 0,00 US$ da Visão geral é cross-chain, mas Todas as redes não informa quais redes estão incluídas (1). O mesmo número na tab Tokens é subset do portfólio total, mas visualmente idêntico ao da Visão geral — quando o portfólio for misto, o user verá o saldo "cair" ao trocar de tab sem entender por quê (2). O modal Receber criptos exibe Ethereum +17 redes sem listar quais são as 17 nem quais estão excluídas — o user envia token em rede não suportada e perde os fundos (4). O seletor Todas as redes tem 18+ opções sem indicar quais o user usa e sem listar redes populares não suportadas (11).
Consequência de segunda ordem: a instância mais grave é a tela 4 — mesma raiz estrutural (agregação opaca), consequência irreversível (perda de fundos). Resolver essa em primeiro lugar.
Alternativa por instância: (1) Todas as redes (18) com tooltip de lista completa; (2) label explícito Total em tokens vs Patrimônio total; (3) +17 redes ▾ expandível + aviso de redes populares NÃO suportadas; (4) dropdown em 3 seções — "Suas redes", "Outras suportadas", "Não suportadas". A raiz é uma só — resolver em design system como princípio: todo agregado rotula o escopo da agregação.
Trade-off: cada instância tem implementação distinta; o esforço é distribuído. Perfil afetado: iniciante e intermediário multi-chain; perda irreversível na instância do modal (tela 4).
Diagnóstico do atrito real: a tab Tokens diz "Transfira tokens de outra carteira para começar" — o modal que executa exatamente isso (Receber criptos) existe, mas só é acessível pela tab Visão geral; na tab Tokens não há botão (2). A tab NFTs replica o mesmo gap (7), com a complicação adicional de que o iniciante pode não saber se o endereço EVM vale para NFTs. Dois empty states que ordenam uma ação e não entregam a ferramenta para executá-la.
Por que a solução óbvia falha: replicar os 3 cards de funding completos abaixo do empty duplica navegação e dilui o foco da instrução.
Alternativa: botão único alinhado à instrução — Receber tokens / Receber NFTs — abrindo o modal correspondente. A variante de NFTs confirma no header que o endereço EVM é válido para ERC-721/1155.
Trade-off: variação de modal para NFTs; ganho: zero gap entre "o que fazer" e "como fazer". Perfil afetado: iniciante (principal).
Diagnóstico do atrito real: o card Compre criptos aponta para on-ramp global (fee 3–7% em USD + KYC internacional) sem alternativa local (1). O card Transferência lista exclusivamente Coinbase — CEX praticamente irrelevante para BR/LatAm/Ásia — sem fallback para quem não a usa (6). Os dois pontos de entrada de funding são, na prática, teatrais para o target BR: o iniciante clica, não reconhece nenhum caminho, fecha a tela antes de tocar no produto.
Família: esta fricção e a 🟡 On-ramp/CEX local-first (abaixo) compartilham raiz — o produto usa localization de língua (PT-BR) sem localization de infraestrutura de funding.
Perfil afetado: iniciante e intermediário BR/LatAm (principal para o target Kotai).
Diagnóstico: o modal entrega endereço cru sem guiar o usuário por token + rede. Para iniciante, isso transfere a ele o risco de um erro irreversível: enviar USDT-TRC20 para endereço EVM perde os fundos para sempre. Uma única tela, mas com a consequência mais alta do fluxo. Família direta com a 🟡 Receber guiado (abaixo).
Perfil afetado: iniciante (principal). (Estrutural, 1 tela — peso máximo.)
Diagnóstico: 24h / 7d / 30d / Todo o período sem range customizado por data. Declarar IR no Brasil exige filtro por ano civil específico — o usuário exporta tudo e filtra fora do produto, anulando a utilidade do log nativo. Família direta com 🟡 Atividade como instrumento fiscal (abaixo).
Perfil afetado: iniciante e intermediário BR em jurisdição com IR cripto obrigatório. (Estrutural, 1 tela — peso alto para target BR.)
Diagnóstico: o seletor Todas as redes fica no header da página com escopo global (filtra saldo + gráfico + tokens + NFTs + atividade simultaneamente), enquanto os filtros da tab ficam na linha abaixo — dois níveis de filtragem sem hierarquia visual explícita. Agravado: o label do botão não muda ao selecionar uma rede específica (11, continua "Todas as redes"), então o usuário pode estar com Ethereum selecionado, ver o portfólio "reduzido", e não entender por quê.
Perfil afetado: iniciante (principal). (Estrutural, 1 tela — peso médio-alto.)
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch usam on-ramp global (Moonpay/Transak, fee 3–7%) e integração de CEX com Coinbase como único parceiro. Ambos assumem usuário US/EU como base geográfica.
Por que afeta nosso target: no Brasil, Coinbase é praticamente irrelevante (6); on-ramp global cobra em USD com conversão opaca e fee 6× maior que PIX → CEX BR (1). O iniciante BR que clica em Compre criptos ou Transferência não encontra nenhum caminho funcional — abandona antes de tocar no produto.
Hipótese de diferenciação Kotai: detectar região por IP/locale e priorizar: card Compre criptos mostra via PIX (BR) — taxa estimada 1,5% como default; card Transferência lista Mercado Bitcoin / Binance BR / Bitso no topo, Coinbase como fallback internacional. Fee exibida antes do clique, não enterrada no flow do parceiro.
Trade-off: integração + manutenção por jurisdição (compliance KYC local, APIs de múltiplos parceiros). Custo recorrente real — mas é o vetor competitivo mais direto contra Uniswap no target BR/LatAm.
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 (infraestrutura existe: Mercado Bitcoin, Bitso, Notus, Transfero) (4) ✓ ganho diretamente perceptível — PIX em segundos vs cartão internacional com 6% de fee.
Padrão atual da indústria: Uniswap, Zerion, Zapper, Phantom, Rabby — todos entregam endereço como artefato principal. Token e rede ficam por conta do usuário lembrar. O risco é transferido para quem não tem ferramenta para gerenciá-lo.
Por que afeta nosso target: mismatch token-rede é o maior vetor de perda não-maliciosa em DeFi para iniciante. Não é hack, não é scam — é usabilidade. Endereço cru sem contexto transforma uma decisão técnica complexa em ação de 1 clique sem rede de segurança.
Hipótese de diferenciação Kotai: fluxo guiado de 2 passos — (1) usuário escolhe token + rede (lista filtrada pelas redes onde aquele token tem liquidez); (2) modal mostra apenas o endereço daquela rede com aviso reforçado e ícone token+rede no topo. Modo "endereço cru" sobrevive como toggle "avançado" opcional. O caminho via Transferência – Coinbase (e futuros parceiros locais) já resolve esse risco por construção — integração deve ser o caminho destacado para iniciante.
Trade-off: 1–2 cliques a mais no caminho receber; exige mapa atualizado de "em quais redes cada token existe". Aceitar — custo de UX trivial vs custo de perda real do usuário.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes entregam endereço cru (2) ✓ afeta iniciante — é O vetor de perda (3) ✓ falta de investimento, não impossibilidade (4) ✓ ganho perceptível e mensurável — diferença entre perder $500 e não perder.
Padrão atual da indústria: Uniswap, Zerion, Zapper, DeBank — Atividade é log cronológico bruto. Sem cálculo de ganho/perda por operação, sem conversão cambial baseada em data, sem agrupamento por categoria fiscal, sem exportação fiscal-ready. Usuário que precisa declarar IR paga R$300–500/ano em serviço terceiro (Koinly, Coinpanda).
Por que afeta nosso target: no Brasil, declarar cripto no IR é obrigatório para operações > R$30k/mês ou ganhos tributáveis. A ausência de date picker (10) e de exportação fiscal são sintomas da mesma raiz: o produto não reconhece o "ano fiscal" como unidade de medida relevante (8).
Hipótese de diferenciação Kotai: tab Atividade gera relatório fiscal exportável (PDF + CSV padrão IR) com cálculo de ganho/perda, conversão cambial em moeda local na data da transação, agrupamento por categoria fiscal. Filtro de primeira classe Período fiscal 2025 ao lado dos existentes. As 11 categorias do dropdown Todos os tipos já mapeiam para classes fiscais — a base técnica existe.
Trade-off: regras fiscais variam por jurisdição; modelo precisa ser mantido por país. Custo recorrente alto — mas diferencial competitivo direto e sem concorrente no segmento DEX.
Passa nas 4 perguntas-teste? (1) ✓ nenhum DEX tem capacidade fiscal nativa (2) ✓ afeta iniciante e intermediário — IR é obrigação legal (3) ✓ falta de investimento (catálogo de causas + classes fiscais existe, problema estabelecido) (4) ✓ ganho perceptível e mensurável (R$ economizados/ano, risco fiscal mitigado).
Padrão atual da indústria: Uniswap, Zapper, DeBank, Zerion — saldo exibido usa preço de tela (last-trade ou oracle). Não informa se o token tem liquidez suficiente para realizar aquele valor. Usuário com shitcoin de baixo volume vê "100 US$" e tenta vender — recebe 12 US$ por slippage devastador.
Por que afeta nosso target: iniciante e intermediário avaliam patrimônio pelo número da tela. Se o número é ficção (declarado mas não recuperável), o portfólio inteiro vira ilusão contábil — exatamente o vetor por trás de "essa cripto não vale o que diz".
Hipótese de diferenciação Kotai: segunda linha por token — Valor: 100 US$ · Saída estimada: 14 US$ (calculado com slippage real da melhor rota de venda). Na hero do portfólio: Patrimônio declarado e Patrimônio recuperável como dois numbers. Toggle para avançado esconder. Copy neutra para tokens com liquidez limitada ("saída limitada pela liquidez do pool").
Trade-off: cálculo on-demand por token (cota de RPC, cache de rotas); risco de "classificar tokens como ilíquidos" gera atrito político — mitigar com copy neutra.
Passa nas 4 perguntas-teste? (1) ✓ todos usam preço de tela como valor (2) ✓ afeta iniciante diretamente (3) ✓ exige cálculo de saída via rota + slippage; falta de investimento (4) ✓ ganho perceptível — user ajusta expectativa antes de tentar vender.
Padrão atual da indústria: Uniswap, Zerion, DeBank, MetaMask Portfolio — "Dados indisponíveis", "Algo deu errado", "Tente novamente mais tarde". Sem causa, sem ação, sem tempo estimado.
Por que afeta nosso target: iniciante não diferencia "erro temporário de uma sub-feature" de "produto quebrado". Em DeFi essa percepção é amplificada pela desconfiança de base. Cada error state genérico é vetor de abandono.
Hipótese de diferenciação Kotai: catálogo declarativo — cada falha mapeia para (causa, ação, tempo estimado). Dados do gráfico ausentes vira "Indexador da rede X atrasado · ~30s · [Recarregar]". Banner global se múltiplas redes falharem. Status page linkável.
Trade-off: custo de mapeamento (cada feature nova precisa do seu error state declarado); risco de diagnóstico errado assustar mais que mensagem genérica. Aceitar — investimento se paga em retenção.
Passa nas 4 perguntas-teste? (1) ✓ todos usam copy genérica de erro (2) ✓ afeta iniciante diretamente (3) ✓ exige catálogo de causas + UI condicional; falta de investimento (4) ✓ ganho perceptível — converte "produto quebrado" em "problema localizado e endereçável".
Padrão atual da indústria: todos os concorrentes listam apenas redes suportadas, sem hierarquizar por uso do usuário e sem indicar redes populares não suportadas. O usuário multi-chain navega lista plana sem hierarquia útil.
Por que afeta nosso target: iniciante BR multi-chain tem token em 2–3 redes e rola lista de 18+ para encontrar as suas (11). Mais grave: usuário que tenta receber token em rede não listada entre as 17 EVM só descobre o problema depois de enviar (4).
Hipótese de diferenciação Kotai: dropdown em 3 seções — "Suas redes" (com saldo inline, ordenadas por valor decrescente), "Outras redes suportadas", "Não suportadas" (lista mínima com copy neutra "não suportada nesta versão"). Família direta com Receber guiado — mesma raiz: todo contexto de rede sempre declara o escopo.
Trade-off: curadoria da lista "não suportadas" é decisão delicada (pode parecer cross-promo negativa); aceitar com lista mínima e revisão trimestral.
Passa nas 4 perguntas-teste? (1) ✓ todos listam só suportadas sem hierarquia por uso (2) ✓ afeta iniciante e intermediário (3) ✓ falta de investimento — dado de saldo por rede o produto já tem (4) ✓ ganho perceptível — user vê Ethereum · $42 no topo + nota "Avalanche: não suportada".
Transferência com 1 única opção é overhead sem valor — dois cliques para começar uma ação que não filtra nada. Resolver integrando mais opções (justifica o modal) ou eliminando o nível intermediário.Todo o período ótimo para wallet nova, inadequado para wallet madura com 2 anos de histórico. Default contextual (wallet > 30 dias → padrão 30 dias) resolve sem perda para novos usuários.Consistência URL por tab (telas 2, 3, 7, 8): cada tab tem URL própria (/portfolio/tokens, /portfolio/nfts, /portfolio/activity) — deeplink por tab correto. Padrão a herdar integralmente.
Família "produto US-first com tradução PT-BR": on-ramp global (t1), Coinbase única (t6), i18n incompleta no dropdown (t9), ausência de período fiscal (t10) — todos são sintomas da mesma decisão de produto. Para Kotai, a aposta é produto BR-first, não produto global traduzido. A diferença aparece exatamente no funding, na linguagem e na contabilidade.
Família "portfólio como instrumento contábil": valor recuperável vs declarado (t2), atividade como ferramenta fiscal (t8, t10), multi-select de tipos de transação (t9) — todos convergem para a mesma visão: portfólio não como dashboard de vaidade, mas como ferramenta que ajuda o usuário a entender o que tem, o que pode realizar, e o que precisa declarar.
Botão Compartilhar como gatilho de referral futuro (3): o ponto de gatilho natural de um futuro programa de referral já existe — é o botão Compartilhar do portfólio. A oportunidade real é o sistema de incentivos (dashboard + recompensa + badge), não o botão em si. Sem esse sistema, o ref-code embutido no link é invisível ao usuário-alvo iniciante — o ganho perceptível é condicional à existência de um produto de growth/loyalty que vai além desta tela. Não passa nas 4 perguntas-teste no escopo deste fluxo (Q4 ⚠ condicional → padrão CLAUDE.md: defaultar pra convenção válida).
Revogar aprovação inline em Aprovações (Observação adicional de portfolio-09): quando o log de Atividade for populado, vale incluir affordance [Revogar] direto na linha da categoria Aprovações — converte log passivo em ação de segurança DeFi (revoga approve() antigas, evita drain attacks). Nenhum DEX expõe isso nativamente. Leverage média — afeta mais intermediário e avançado que iniciante. (Origem: Observação adicional de portfolio-09, sem bloco formal — tela declara "Sem 🟡".)
Os drafts de lote estão em analises/uniswap/_consolidado/_drafts/ como audit trail — portfolio-lote-1.md (telas 1–6) e portfolio-lote-2.md (telas 7–11).
Função: versão sem wallet conectada da página Suas posições. Em vez do bloco 0 UNI Rewards / toolbar de filtros / lista, exibe CTA de conexão como gatekeeper. Tela revela arquitetura: até o user conectar wallet, produto não tem identidade pra mostrar nada relevante.
Componentes (diff em relação às Telas 1–4)
Conectar (rosa primário, canto superior direito) — substitui o endereço encurtado.Negociar / Explorar / Pool ✓ / Portfólio (Pool selecionado).Suas posições.Conectar carteira (título).Nova posição (secondary outline — permite criar sem conectar? provavelmente leva pra Connect).Conectar carteira (primary branco — ação esperada).Fornecer liquidez em protocolos diferentes (ícone rosa de gráfico).Hooks no v4 (ícone livro com badge v4).Maiores pools por TVL igual às outras telas.Regras de negócio
Nova posição sem conexão) e caminho "acessar" (Conectar carteira).Fornecer liquidez, Hooks no v4) substituem o conteúdo dinâmico — produto usa empty state como espaço editorial.Maiores pools por TVL) é idêntica com ou sem wallet — discovery não depende de identidade.🟢 Insight 1 — Empty state sem wallet é usado como espaço editorial em vez de tela vazia. Cards Fornecer liquidez em protocolos diferentes e Hooks no v4 ensinam enquanto user decide se conecta. Padrão a herdar pra Kotai — telas pre-conexão devem servir conteúdo educacional, não placeholder mudo.
🟢 Insight 2 — Sidebar Maiores pools funciona igual com/sem wallet — discovery não exige identidade. Decisão de produto correta: descoberta de mercado independe de quem é o user. Padrão a herdar — separar UI de discovery (público) de UI de gestão (privado/conectado).
🟢 Insight 3 — Nova posição como CTA secundário sem wallet conectada é affordance honesta. Produto admite "você pode começar a explorar sem conectar". Iniciante curioso entra no flow sem comprometer com Connect. Padrão a herdar — flows críticos devem permitir exploração sem identidade até o momento que ela é necessária.
🔴 Fricção 1 — 2 CTAs Nova posição (secundário) + Conectar carteira (primário branco) sem hierarquia clara de qual escolher (estrutural — paralisia de escolha em momento de baixa intenção)
Conectar carteira é branco/cinza claro, não rosa primário — o produto não está empurrando conexão forte como faz outros DEXes. Mas iniciante interpreta isso como ambiguidade, não respeito.Conectar agressivamente perde a postura respeitosa de "não empurra conexão"; remover Nova posição perde a opção de exploração.(1) Entenda o que é LP / (2) Veja pools de exemplo / (3) Conecte pra criar sua posição. Cada etapa avança com 1 clique. Iniciante percorre o tutorial; intermediário pula direto pra Conectar. Trade-off: mais UI; ganho: pedagógico em vez de transacional.🔴 Fricção 2 — Cards educacionais Fornecer liquidez em protocolos diferentes e Hooks no v4 têm framing de power user, não de iniciante (estrutural — conteúdo editorial mira público errado pra esta tela)
O que é LP? ou Como ganhar com fees?, não de comparações de protocolo.Primeira vez? Como funciona LP (3 min) (iniciante) e Fornecer liquidez em protocolos diferentes (intermediário). Ambos disponíveis. Trade-off: mais conteúdo; ganho: serve os 2 níveis.🔴 Fricção 3 — Microcopy "Para visualizar posições e recompensas, conecte sua carteira" assume que user já tem carteira (estrutural — onboarding pressupõe etapa anterior cumprida)
🟡 Oportunidade competitiva — DEX com onboarding integrado de wallet pra usuários sem carteira pré-existente
Observação adicional — Conectar no header está em rosa primário (CTA forte), mas Conectar carteira dentro do card está em branco (CTA suave). Mesma ação, 2 cores na mesma tela. Inconsistência minar atende a hierarquia (CTA do header é catch-all, CTA do card é contextual), mas pode confundir user que tateia. Vale unificar — ou ambos primários, ou diferenciar com cores intencionais (não acidentais).

Função: Variação do estado de Visão geral em que o saldo está em skeleton e o gráfico aparece desenhado em cinza com tooltip declarativo "Dados do gráfico ausentes". É um estado intermediário/de erro — diferente do empty state "limpo" do relatório 1 (que mostra 0,00 US$ resolvido). Aqui o produto declara não ter o que mostrar e renderiza um chart simulado para preservar o layout.
Componentes
+1 a mais, CTAs).Visão geral ✓ / Tokens / NFTs / Atividade.0,00 US$ ou número resolvido) + skeleton menor abaixo (provavelmente delta).Dados do gráfico ausentes + subtítulo "Dados de saldo do portfólio indisponíveis."1 hora / 1 dia ✓ / 1 semana / 1 mês / 1 ano / Tudo — todas clicáveis.Regras de negócio
🟢 Insight 1 — Tooltip declarativo Dados do gráfico ausentes supera ocultar o widget. Apagar o gráfico no erro tiraria o user da affordance de "aqui no futuro vai aparecer histórico". Manter o chart cinza + dizer explicitamente o que faltou é honestidade visual — preserva o slot, evita fingir dado, comunica o estado. Padrão a herdar — error/empty state declarativo > silêncio.
🟢 Insight 2 — Skeleton no saldo separa duas semânticas de loading no mesmo viewport. Saldo (number bruto) e gráfico (série temporal) carregam de fontes diferentes; o produto resolve isso renderizando dois estados separadamente — skeleton no number, mensagem explícita no chart. Reconhece que loading não é monolítico. Padrão a herdar — granularidade no loading reduz a frustração de "está tudo carregando há 10s".
🔴 Fricção 1 — Dados do gráfico ausentes é ambíguo entre "temporário" e "definitivo" (estrutural — copy de error state sem diagnóstico nem caminho de recuperação)
Recarregar, sem caveat de tempo, sem causa. Error state que descreve o sintoma mas não o caminho.🔴 Fricção 2 — Skeleton no saldo + erro declarado no gráfico = signal contraditório (estrutural — dois sub-estados que não conversam)
🔴 Fricção 3 — Timeframe pills permanecem ativas no estado de erro (cosmética — affordance morta amplifica frustração)
1 hora / 1 dia / ... como "talvez clicando em outro período resolva". Clica em 1 semana, nada muda. Clica em 1 mês, nada muda. Cada clique morto erode confiança ativamente.🟡 Oportunidade competitiva — Error states com diagnóstico + ação em vez de "indisponível" genérico (média-alta leverage, cross-cutting)
Observação adicional: vale confirmar se este estado é gatilhado por erro de carregamento ou por wallet sem histórico — visualmente são idênticos no produto atual, mas a copy ideal seria diferente nos dois casos. Se for o segundo, o tooltip deveria dizer "Sem histórico ainda" e não "dados indisponíveis" (que carrega conotação de falha).




Função: view canônica de Suas posições com wallet conectada (0xd09B...618a) e sem nenhuma posição — empty state "real" do produto. Diferente das Telas 1–4 (mesma página com dropdowns abertos), Tela 6 mostra a página sem interação, em viewport maior — captura layout default que iniciante vê quando chega aqui pela primeira vez já conectado.
Componentes
Negociar / Explorar / Pool ✓ / Portfólio + busca + endereço 0xd09B...618a.0 UNI + Recompensas ganhas (com ícone info i).Recolher recompensas (disabled).Suas posições com toolbar:+ Novo v (split button).Status v / Protocolo v / ícone-rede v.Nenhuma posição encontrada.Explorar pools (secundário) + Nova posição (branco/primário).i icon: "Quer ver suas posições fechadas? Para vê-las, use o filtro na parte superior da página." + × dismiss.Maiores pools por TVL: WISE/ETH 0,00% APR, ETH/USDC 87,74% APR, USDC/ETH 13,88%, ETH/USDC 4,8%, ETH/USDT 45,52%, WBTC/ETH 14,04%.Explorar mais pools →.Saiba mais sobre provisão de liquidez: cards Fornecer liquidez em protocolos diferentes + Hooks no v4 + link Saber mais →.Regras de negócio
count(positions) == 0 independente de filtros.Quer ver suas posições fechadas? é assumption check — produto admite que default esconde fechadas e oferece caminho pra ver.Importar posições v2 é caminho de migração — v2 NFT format precisa de import explícito.0%, ETH/USDC v3 87%) — variabilidade real de mercado, não bug.🟢 Insight 1 — Layout em 3 zonas (header UNI / toolbar+lista / sidebar discovery) cria hierarquia clara de "o seu / o do mercado". Esquerda = patrimônio + ações; direita = inspiração + educação. User não confunde "o que tenho" com "o que existe". Padrão a herdar pra Kotai — separação visual entre dashboard pessoal e descoberta de mercado.
🟢 Insight 2 — Banner dismissable Quer ver suas posições fechadas? é affordance honesta de "sei que escondi algo". Em vez de assumir que user vai descobrir o filtro, o produto antecipa a dúvida. Padrão a herdar — defaults que escondem conteúdo devem ser anunciados explicitamente (não silenciosos).
🟢 Insight 3 — Sidebar com Maiores pools + cards educacionais combina inspiração quantitativa (APRs) + educação qualitativa (Fornecer liquidez em protocolos diferentes). Iniciante lê educação; intermediário scaneia APRs. Padrão a herdar — sidebar de descoberta deve servir os 2 perfis simultaneamente.
🟢 Insight 4 — APRs na sidebar variam (0% → 87%) sem ranking artificial. Produto não esconde pools de baixo APR — mostra realidade. Padrão a herdar — discovery deve ser honesta, não curada pra otimizar conversão.
🔴 Fricção 1 — Empty state vê Nenhuma posição encontrada independente do filtro — não distingue "sem posição" de "filtro escondeu" (estrutural — mesma fricção da Tela 2 mas confirmada em estado idle)
🔴 Fricção 2 — APRs sidebar com variação 0% — 87% não tem caveat sobre IL nem janela temporal (estrutural — APR isolado já flagrado, agora em discovery)
87,74% APR como número grande, atraente. Iniciante curioso clica e entra em flow LP achando que "vou ganhar 87% ao ano". Realidade: APR isolado, sem IL, trailing — em par volátil como ETH/USDC 0,3%, IL pode comer 50% do retorno. Fricção igual à Tela 2 (PP Base) mas aqui ela serve como gatilho de discovery, com efeito amplificado.APR de fees (30d) + microcopy de IL.🔴 Fricção 3 — Importar posições v2 no rodapé é affordance escondida pra problema crítico (estrutural — fluxo de migração relegado a microcopy)
Nenhuma posição encontrada mesmo conectado com a carteira certa. Solução é clicar em Importar posições v2 — link em texto cinza pequeno, no rodapé, abaixo de todo o resto. User com posição v2 antiga pode achar que perdeu (pânico) e gastar horas no Discord do Uniswap pra descobrir o link.🟡 Oportunidade competitiva — Empty state que "recomenda primeira posição" com base no saldo da wallet
Crie uma posição). Não considera o que o user tem na carteira.$1000 USDC + $500 ETH na carteira tem caminho ideal de primeira posição baseado nos ativos. Genérico ignora; específico converte.4,89% APR com range largo. [Criar com 1 clique]".Criar essa posição cria com config recomendada. Avançado ignora.Observação adicional — 0 UNI Recompensas ganhas ainda ocupa header mesmo em wallet conectada sem posições. Já flagrado na Tela 10 PP Base e Tela 1 SuasPos — agora é a 5ª aparição deste header inadequado pra contextos sem posição. Família confirmada: produto reusa header global sem condicional pra estado da view. Vale registrar como dívida de produto: header global precisa ter modo "sem posições" + modo "com posições".

Transferência (Coinbase como única CEX)Função: Modal de funding via plataforma centralizada de negociação (CEX). Acionado pelo card Transferência da Visão geral. Reconhece que muito user vem de CEX, não de "outra carteira", e oferece atalho de integração. Mas o modal lista apenas Coinbase — a tela inteira é construída sobre a hipótese de que o user tem Coinbase, o que não cobre LatAm, Ásia, e nem todo o usuário americano.
Componentes
📧 Pedir ajuda + X fechar.Transferência.C azul) + label Coinbase + chevron implícito de navegação à direita.Regras de negócio
Coinbase provavelmente dispara OAuth + integração Coinbase Onramp/Transfer — sai do produto, autoriza, escolhe valor, retorna com transfer iniciado.🟢 Insight 1 — Single-option modal evita paradox of choice sem inflar com placeholders. Em vez de listar 8 CEX das quais 7 ainda não estão integradas, o modal mostra só a que funciona de verdade. Sem teasers ("em breve: Kraken"), sem disabled cards. É a versão honesta de "o que está disponível agora". Padrão a herdar — não fingir features futuras como se já existissem.
🟢 Insight 2 — Subtítulo educa sobre a categoria sem jargão. "Plataforma de negociação" em vez de "CEX" / "exchange" / "corretora cripto". Iniciante que nunca viu cripto entende. Padrão a herdar — sempre preferir o conceito mental do user ao termo da indústria.
🟢 Insight 3 — Pedir ajuda no header repete o pattern do Receber criptos. Consistência: ações sensíveis de funding têm sempre suporte 1 clique de distância. Pattern coerente entre modais.
🔴 Fricção 1 — Modal com 1 única opção é camada de overhead sem valor agregado (estrutural — passo intermediário sem ganho)
Transferência (Visão geral) → modal Transferência (1 item) → click Coinbase → integração. Dois cliques pra começar uma ação. Modal não filtra nada (não há opções pra comparar), não educa muito além do subtítulo, não tem CTA secundário. É puramente uma camada entre o card de entrada e a integração de saída.Transferência da Visão geral apontar direto pra Coinbase — colapsa a affordance "Transferência = categoria genérica" em "Transferência = Coinbase", perdendo espaço pra futuras integrações.🔴 Fricção 2 — Coinbase como única CEX exclui geograficamente sem caminho fallback (estrutural — vetor de churn para target BR/LatAm/Ásia)
Receber criptos". O user fecha o modal e desiste — ou pior, conclui que o produto não é pra ele.Receber criptos. Reconhece a limitação e direciona ao caminho funcional alternativo. Médio prazo: detectar geografia e priorizar integração local (vide 🟡 abaixo). Trade-off: footer mínimo extra; ganho: zero usuário preso.🔴 Fricção 3 — Card de Coinbase (aqui) e cards de endereços (Receber criptos) são visualmente idênticos, mas semanticamente diferentes (cosmética — affordance ambígua entre endereço local vs integração externa)
Receber criptos. Mas clicar em endereço copia o address (ação local); clicar em Coinbase redireciona pra OAuth da Coinbase (sai do produto). Mesma affordance visual, dois comportamentos diferentes — surpresa de UX quando user clica esperando uma coisa e recebe outra.↗) no card de integração, sinalizando "vai sair do produto". Diferencia visualmente "endereço local" de "integração externa". Trade-off: mínimo.🟡 Oportunidade competitiva — Integração de CEX local-first detectada por geografia (alta leverage no target)
Transferência é teatral pra metade do mundo.Transferência é decoração; o user vai usar o caminho "Receber criptos" e copy-paste manual (perigoso e lento).Observação adicional: o modal coexiste com o gráfico em estado de erro renderizado atrás (vide relatório 5). Modais devem ser estado isolado da página de fundo — vale checar se o erro do gráfico continua escalonando timers/retries enquanto o modal está aberto. Não é fricção desta tela, mas é nota técnica de boa higiene de estado.


Função: Sub-página da tab NFTs (URL /portfolio/nfts) sem nenhum NFT detectado pela wallet. Função primária: confirmar ausência sem alarmar e orientar pra ação de funding específica desse tipo de ativo.
Componentes
Visão geral / Tokens / NFTs ✓ / Atividade.Nenhum NFT ainda + subtítulo Transfira NFTs de outra carteira para começar.Regras de negócio
/portfolio/nfts (deeplink por tab — pattern consistente com Tokens/Atividade).🟢 Insight 1 — Ausência de big stat de saldo na tab NFTs é decisão consciente correta. Tabs Tokens e Atividade têm contexto numérico no topo (saldo, contador); NFTs não tem. Reconhece a natureza diferente do ativo — NFT não tem preço fungível, sumarizar "valor total de NFTs em USD" seria mentira contábil. Padrão a herdar — não forçar métrica única em tipos de ativo que resistem à fungibilidade.
🟢 Insight 2 — Empty state segue o pattern visual da tab Tokens. Ilustração + título + subtítulo causal-imperativo. Sistema de design coerente entre tabs com semântica parecida ("transfira X de outra carteira"). Reduz cognitive load — user que aprendeu o pattern numa tab decoda a outra sem reaprender. Padrão a herdar — empty states de tabs irmãs devem compartilhar gramática visual.
🔴 Fricção 1 — Instrução do empty sem CTA inline (mesmo problema da tab Tokens) (estrutural — gap entre dizer e fazer, família com fricção do relatório 2)
Receber criptos (que está em outra tab). Mas pior: Receber criptos é construído pra tokens fungíveis (endereço EVM + Solana). NFTs também usam endereços EVM, mas o user iniciante pode duvidar ("o mesmo endereço serve pra NFT?"). Sem botão e sem confirmação, ele fica em loop mental.Receber criptos sem ajuste — não responde à dúvida específica de NFT ("qual rede? qual contrato?").Receber NFTs que abre variação do modal Receber criptos com copy adaptada ("NFTs ERC-721/1155 em [rede] enviados pra este endereço aparecerão aqui"). Confirma para iniciante que o endereço EVM é o canal correto. Trade-off: nova variação de modal; ganho: zero dúvida sobre canal de recebimento.🔴 Fricção 2 — Ausência de search bar quebra a promessa "escala-pronta" da tab Tokens (estrutural — inconsistência cross-tab sobre descobrir conteúdo futuro)
Coleção ▾, Ordenar por ▾, Procurar NFT. User vê o futuro funcionamento; consistência com Tokens preservada na lógica, adaptada ao asset. Trade-off: mais elementos no empty; ganho: zero surpresa quando popular.🔴 Fricção 3 — Ilustração de empty pouco distinta da tab Tokens (cosmética — vocabulário visual sub-aproveitado)
Sem 🟡 nesta tela — NFT discovery/curadoria seria oportunidade interessante mas não passa nas 4 perguntas-teste pro target iniciante DeFi (NFTs não são prioridade do user iniciante que busca swap/yield). Registrar como possível observação futura quando/se o produto Kotai expandir pra NFT-first.
Observação adicional: tab NFTs poderia educar sobre a diferença entre NFTs detectados automaticamente (via indexer) e NFTs que precisam ser importados manualmente (contratos não indexados, NFTs em chains menos comuns). É vetor real de "meu NFT sumiu" quando na verdade só não foi indexado. Não é fricção desta tela específica (estado vazio), mas é nota pra quando o estado popular — vale incluir affordance "Não vê seu NFT? [Importar manualmente]".

Função: página de terceiro (cryptowatchlist.io) usada pelo user como fonte de verdade pra validar o contrato real do token VIRTUAL antes de criar a posição. Padrão anti-scam crítico em DeFi — usuário sai do Uniswap, busca o token em fonte confiável, copia o endereço do contrato e cola/compara dentro do DEX.
Componentes (página externa, fora do Uniswap)
Virtuals Protocol (VIRTUAL) + tag Blockchain Infrastructure + Rank: 95 + 4013 Watchlists.$0,850 + delta 1,33% / +0,011 + range 24h Low $0,810 — High $0,877.+ Add Alert (secundário) / Buy (primário, externo).Overview ✓ / Fundraising / Markets / Arbitrage / Analytics / Historical data / News / Team.General Info:Contracts/Explorers: 2 contratos listados — Ethereum 0x44f...bf73 + Base 0x9c2...c7eb com ícones copy + abrir explorer.Funds and Backers: DeFiance Capital + outros logos.Tags: Token / AI Agent Platform / DeFi.Description: "Virtuals Protocol is a co-ownership layer for AI agents" + More Details.Links: Website / X / Telegram.Virtuals Protocol (VIRTUAL) Chart no rodapé (TradingView-like).Regras de negócio (pattern de segurança)
cryptowatchlist.io, CoinMarketCap, CoinGecko).VIRTUAL) — ticker pode ter colisão; contrato é único.🟢 Insight 1 — Banner de rebrand/migração no agregador externo cumpre função de proteção que o DEX não cumpre. "PathDAO migrou pra Virtuals Protocol" alerta user sobre token velho que ainda circula com mesmo símbolo. Sem essa info, user com saldo do contrato antigo (PATH) tentaria aportar e veria token com 0 liquidez. Padrão a herdar pra Kotai — agregador externo virou load-bearing pro pattern anti-scam.
🟢 Insight 2 — Contracts/Explorers exibidos lado a lado (Ethereum + Base) deixam claro que existe "o mesmo token em 2 redes". User aprende que tokens são por-rede, não globais. Padrão a herdar — qualquer UI que exibe token deve carregar a rede explicitamente.
🟢 Insight 3 — Rank + Watchlists + Funds and Backers funcionam como prova social legítima. Token com Rank 95 e backers nomeados (DeFiance Capital) tem credibilidade verificável. Sem esses sinais, user iniciante usaria "se tem logo bonito é legítimo" — heurística falha. Padrão a herdar — exibir credenciais verificáveis (não badges arbitrários).
🔴 Fricção 1 — Toda essa verificação acontece FORA do Uniswap — produto não ensina nem oferece o pattern (estrutural — dependência crítica de terceiros pra segurança do user)
Rank, não tem Funds and Backers. Iniciante que não conhece esse pattern colaria endereço de scam token (com mesmo nome) e teria perda total. Avançado conhece o ritual mas paga custo de tab-switching.VIRTUAL, mostrar 3 sinais ao lado do token: ✓ Verificado (CoinGecko ID 28250) + Rank #95 + Contrato Base: 0x9c2...c7eb. Sem opinar sobre legitimidade, apenas surfaçar dados pública. Trade-off: depende de feed externo (rate limit, fallback necessário); ganho: zero scam por colisão de ticker.🔴 Fricção 2 — Banner de rebrand existe no agregador, não no DEX (estrutural — informação crítica de "este contrato está obsoleto" não vaza pro flow de aporte)
🔴 Fricção 3 — O fato do user precisar abrir 4-5 abas (Uniswap, CryptoWatchlist, Etherscan, X) pra fazer 1 swap é fricção estrutural do ecossistema DeFi inteiro (estrutural — orquestração de confiança fragmentada entre múltiplas fontes)
🟡 Oportunidade competitiva — DEX com camada nativa de verificação de contrato e prova social
✓ Verificado por CoinGecko · Rank #95 · Contrato Base · Audit OpenZeppelin direto no autocomplete e ganha confiança sem sair do produto.Verificado on-chain), backers nomeados, age do contrato (em dias/anos), top 5 holders, link pro audit (se houver). Tokens novos sem dados aparecem com badge Token novo, sem verificação (não bloqueia, alerta).Observação adicional — esta tela revela que o produto Uniswap depende implicitamente de produtos externos pra cumprir função básica de "posso confiar neste token?". É dependência arquitetural invisível: sem CoinGecko/CMC, Uniswap seria perigoso pra iniciante. Vale registrar como insight de mercado — Kotai pode posicionar-se como "DEX que não precisa de outras 4 abas pra ser usado com segurança".
Função: mesmo Step 2 com range muito tight no floor (-0,07% do preço atual) revelando que pool exige quantidade absurda de VIRTUAL pra cobrir o range. Sistema bloqueia o aporte com mensagem Saldo de VIRTUAL insuficiente.
Componentes (diff em relação à Tela 4)
Estratégias de preço colapsada no topo (4 cards ainda visíveis mas sem expansão de detalhe).Preço mínimo: 0,85249377 + (-0,07%) em vermelho — floor quase no preço atual.Preço máximo: 1,2000864 + (+40,53%) em verde — ceiling 40% acima.Depositar tokens:1070,326180990420357 VIRTUAL + 964,03 US$ — number em vermelho (saldo insuficiente).5 USDC + 5,00 US$.Saldo de VIRTUAL insuficiente (CTA disabled, fundo cinza).Regras de negócio
1070 VIRTUAL excede o saldo do user (carteira do tutorial tem ~$2).valor > saldo disponível.5 (input do user); VIRTUAL recalculado automaticamente pela math da pool.🟢 Insight 1 — Validação de saldo em tempo real evita transação que falharia na wallet. Sistema bloqueia antes do user pagar gas pra ver erro on-chain. Padrão a herdar pra Kotai — validações de saldo, allowance e slippage devem rodar no client antes de chamar wallet.
🟢 Insight 2 — Number em vermelho ancorado ao input é affordance forte de "erro neste campo". User olha o vermelho, sabe onde está o problema. Padrão a herdar — erros de validação devem manchar o campo, não só o footer.
🟢 Insight 3 — CTA disabled (não removido) com mensagem clara devolve diagnóstico. Botão visível mas inativo + mensagem Saldo de VIRTUAL insuficiente é melhor que CTA escondido — user vê que ação existe, só está bloqueada por motivo nomeado. Padrão a herdar.
🔴 Fricção 1 — Mensagem Saldo de VIRTUAL insuficiente diagnostica sintoma, não causa raiz (estrutural — erro escondendo a real decisão a tomar)
Preço mínimo pra 0,7) e o sistema pediria 50× menos VIRTUAL. Mensagem atual leva user pro caminho errado (comprar VIRTUAL) em vez do caminho certo (ajustar range).🔴 Fricção 2 — Number 1070,326180990420357 (15+ casas decimais) é ruído visual puro (cosmética — precisão técnica vazando pra UI)
1070,33 ou 1070); 15 casas viram parede de números que o cérebro rejeita. Pior: vermelho intensifica a parede.1070,326180990420357). Avançado clica pra copiar, iniciante lê limpo. Trade-off: implementação dupla precisão; trivial.🔴 Fricção 3 — Não há feedback de "o que mudou no chart" entre Tela 4 e Tela 5 (estrutural — relação range × ratio não materializada)
Preço mínimo de 0,85 (Tela 4) pra 0,85249377 (Tela 5) — diferença microscópica de 0,003. Resultado: VIRTUAL exigido pulou de razão razoável pra 1070. A causa é a sensibilidade da curva de liquidez perto do preço atual — fato matemático contra-intuitivo. Produto não mostra esse comportamento; user vê só o number vermelho final e atribui a "saldo insuficiente" em vez de "range muito sensível".🟡 Oportunidade competitiva — Validação ativa de range com sugestão automática de ajuste
Saldo insuficiente e abandona o flow ("preciso comprar mais VIRTUAL primeiro"). Intermediário entende mas perde tempo iterando manualmente.Ajustar para meu saldo abaixo da mensagem de erro — recalcula floor mínimo viável dado o saldo do user e oferece aplicar com 1 clique. Avançado ignora; iniciante usa.Observação adicional — denominação 964,03 US$ abaixo de 1070 VIRTUAL confirma que o produto sabe converter token → USD em tempo real. Capacidade subutilizada na Tela 4 (inputs de preço em token-ratio cru) e na Tela 6 (mesmo). Existe conversor USD nativo — vale acoplar conversor a TODOS inputs financeiros, não só ao display de saldo.
Função: user ajustou o Preço mínimo de 0,85249377 (Tela 5) pra 0,84 — diferença de 0,012. Resultado: VIRTUAL exigido caiu de 1070,32... pra 21,40 — redução de ~50×. Tela materializa sensibilidade extrema da curva de liquidez ao floor do range.
Componentes (diff em relação à Tela 5)
Preço mínimo: 0,84 + (-1,05%) em vermelho (era 0,85249377 / -0,07%).Preço máximo: 1,2000864 + (+40,53%) em verde (inalterado).Depositar tokens:21,4065236198084075 VIRTUAL + 19,39 US$ — number em cor normal (não mais vermelho).0,1 USDC + 0,10 US$ — USDC recalculado pra baixo (era 5).Saldo de VIRTUAL insuficiente ainda — ratio menor mas ainda excede saldo da carteira tutorial.Regras de negócio
0,012 no Preço mínimo → redução de ~50× no VIRTUAL exigido.5 pra 0,1 — sistema preservou ratio implicado pelo range, não preservou input do user.Saldo insuficiente persiste mesmo com ratio reduzido — saldo de VIRTUAL da carteira tutorial ainda menor que 21,40.🟢 Insight 1 — Bidirecionalidade input range ↔ input token preserva agência do user. User pode chegar ao mesmo aporte por 2 caminhos: definir range e ver tokens recalculados, ou definir tokens e ver range recalculado. Padrão a herdar pra Kotai — inputs acoplados devem permitir edição em qualquer lado.
🟢 Insight 2 — Cor normal do number (após vermelho da Tela 5) confirma resolução parcial. User vê que mexer no range mudou o status do campo — feedback visual imediato. Padrão a herdar — estados de validação devem responder a ajustes em tempo real, não exigir clique de "validar".
🟢 Insight 3 — Number 0,1 USDC / 0,10 US$ mostra que produto preserva precisão sub-centavo. Sem flooring/rounding agressivo. Padrão a herdar — precisão financeira em DeFi exige fidelidade, mesmo em valores pequenos.
🔴 Fricção 1 — Sensibilidade 0,012 → 50× é contra-intuitiva e não tem feedback proporcional (estrutural — não-linearidade da curva invisível pro user)
0,852 → 0,84 esperando mudança incremental ("ah, alarguei um pouco, vai pedir um pouco menos"). Sistema responde com queda de 50× no ratio. Comportamento correto matematicamente (curva tick × liquidez é altamente não-linear perto do preço atual), mas invisível: nada na UI sinaliza a sensibilidade. User pode mover o floor mais 2 ticks e ver ratio dobrar de novo — não tem mental model.🔴 Fricção 2 — USDC mudou de 5 (input do user) pra 0,1 sem aviso explícito (estrutural — overwrite de input do user sem feedback)
5 USDC na Tela 5; ao mover o range, sistema reescreveu o USDC pra 0,1 automaticamente. Sem highlight, sem mensagem "USDC reajustado pra manter ratio". User olha de novo a tela e pode achar que digitou errado, ou pior, não perceber que o aporte total caiu de ~$969 pra ~$19,50.5) seria fricção quando user quer aporte automático; perguntar toda vez é fricção.🔴 Fricção 3 — Status Saldo de VIRTUAL insuficiente persiste como mesma mensagem entre estados muito diferentes (cosmética — erro genérico não reflete proximidade da solução)
1070 VIRTUAL (50× saldo); Tela 6 exige 21,40 VIRTUAL (provavelmente 2-3× saldo). User está muito mais perto de resolver, mas a mensagem é literalmente idêntica. Sem feedback de progresso, user pode achar que está estagnado.Você tem X, precisa de Y) cresce footer.~13 VIRTUAL ($11,50)". User vê que está perto e decide se compra a diferença ou ajusta mais o range. Trade-off: footer com 1 linha extra; ganho: progresso visível.🟡 Oportunidade competitiva — Visualização de "densidade de capital exigida" no chart durante drag do range
densidade de capital exigida abaixo do chart — colorido em verde (pouco capital) a vermelho (muito capital) baseado na distância tick × liquidez. User arrasta bounds e o gradient atualiza ao vivo. Combinado com 🔴 Fricção 1 (sensibilidade invisível), resolve o gap pedagógico.Observação adicional — diferença entre Tela 5 e Tela 6 é a melhor evidência empírica do kotai-thesis "DeFi expõe matemática, esconde consequência". O mesmo flow, mesma carteira, 1 clique de diferença → ratio muda 50×. Iniciante depositaria na Tela 5 sem entender; intermediário aprende caro. Vale congelar essas 2 telas como caso-âncora pra design reviews internas — toda decisão de UX no nosso produto deve passar pelo teste "este input causa surpresa proporcional ou desproporcional ao output?".

Função: Estado base da tab Atividade (URL /portfolio/activity), sem popover aberto. É o mesmo viewport do relatório 3, mas no estado neutro — sem o Compartilhar expandido. Tela serve dois propósitos no estado vazio: confirmar ausência de histórico e expor a estrutura de filtros que existirá quando popular.
Componentes
Visão geral / Tokens / NFTs / Atividade ✓.Todos os tipos ▾ + dropdown Todo o período ▾.Procurar atividade (input ativo).Nenhuma atividade ainda + subtítulo "Quando você fizer transações, elas aparecerão aqui."Regras de negócio
/portfolio/activity — deeplink por tab consistente.Todos os tipos e Todo o período clicáveis mesmo no empty (abrem dropdown — vide relatórios 9 e 10).🟢 Insight 1 — Estrutura de filtros visível no empty estabelece o modelo mental futuro. User vê que existirá tipo de transação + período como dimensões de filtro quando a lista crescer. Aprende a arquitetura antes de precisar dela — quando os primeiros 50 swaps + envios estiverem listados, ele já sabe onde recortar. Padrão a herdar — controles que farão sentido futuramente devem ser visíveis no empty, não revelados depois.
🟢 Insight 2 — Copy causal supera imperativa onde não há ação local. Já elogiada no relatório 3 — "Quando você fizer transações, elas aparecerão aqui" descreve o gatilho (fazer transação) e o efeito (aparecer aqui) sem ordenar ação que esta tab não pode disparar. Diferente das tabs Tokens/NFTs (ação local = transferir), Atividade só popula por consequência de outras telas. Padrão a herdar.
🔴 Fricção 1 — Filtros clicáveis sobre lista vazia disparam dropdown sem efeito (estrutural — affordance morta, mesma classe de outras telas do flow)
Todos os tipos ▾. Dropdown abre (vide relatório 9). Ele seleciona Swaps. Volta pro empty — ainda vazio, agora com filtro Swaps ativo (sem nada pra filtrar). Repete com Todo o período. Cada interação é controle morto. Pior: a UI não dá feedback de que "o filtro está ativo mas não há nada que ele recorte" — só fica vazio do mesmo jeito.🔴 Fricção 2 — Search bar aceita input mas retorna sempre vazio (estrutural — input ativo que mente)
Procurar atividade. Nada acontece — nem mensagem "0 resultados", nem auto-clear. O estado original (empty) continua porque era empty antes da busca. Para o user, parece bug — "digitei e ele ignorou". Diferente da search da tab Tokens, que pode buscar em catálogo global (e portanto faz sentido manter ativa), a search de Atividade é estritamente sobre o histórico do user — histórico vazio = busca inerte por construção.🔴 Fricção 3 — Espaço entre header de filtros e empty state é desperdiçado (cosmética — superfície educacional não-explorada)
Todos os tipos). Hoje é silêncio visual.🟡 Oportunidade competitiva — Atividade como instrumento contábil/fiscal, não só log cronológico (alta leverage no target BR/jurisdições com IR cripto)
Período fiscal (ano civil) ao lado dos existentes.Observação adicional: vale notar que esta tela é o estado-base do relatório 3 (mesmo viewport sem popover) — os dois relatórios poderiam ser consolidados em um só, com o popover tratado como variação de estado. Decisão de produto: manter os dois reflete que o popover é interação significativa (não trivial); consolidar reflete que economia de superfície analítica importa. Não há resposta única — anotar como decisão de organização do estudo, não fricção do produto.
Função: modal de confirmação final antes de submeter à blockchain. Consolida par + range + tokens + taxa de rede num único painel, com CTA Criar que dispara a sequência de aprovações na carteira.
Componentes
Criando posição + link Pedir ajuda (direita do título).× (fechar).VIRTUAL / USDC com logos sobrepostos + badge v3 + 0,3%.Mín: 0,84233 USDC/VIRTUAL (esquerda) / Máx: 1,20009 USDC/VIRTUAL (direita).Depositando:13 VIRTUAL + 11,55 US$ (com logo VIRTUAL).0,53968 USDC + 0,540 US$ (com logo USDC).Taxa de rede: ~0,01 US$ + toggle ✓ (gas fee).0,54 US$ (provável soma de USDC ou total — ver Observação).Criar (rosa primário grande, full-width).Analisar (visível atrás, rosa primário também).Regras de negócio
~0,01 US$ é gas estimado da chain (Base, baixíssimo custo).$11,55 + $0,54 ≈ $12,10 (carteira de tutorial).Criar dispara 3 transações sequenciais: Aprovar VIRTUAL → Aprovar USDC → Confirmar posição (vide Tela 9).Pedir ajuda no header é caminho de fuga raro em DEXes (vide Insight 1).🟢 Insight 1 — Link Pedir ajuda no header do modal de confirmação é affordance rara e poderosa. Maioria dos DEXes assume que se user chegou no review é porque sabe o que faz. Uniswap admite que mesmo no review user pode estar confuso e oferece saída. Reduz abandono silencioso ("vou fechar e sair") e canaliza dúvida pra suporte. Padrão a herdar pra Kotai — momentos de "última chance" devem oferecer ajuda, não só OK/Cancelar.
🟢 Insight 2 — Mini-chart embedded no modal materializa o range escolhido como sanity check. User não confia em number cru (0,84233 / 1,20009) — confia em ver que a banda verde cobre uma faixa razoável do preço. Sem o chart, review seria parede de numbers. Padrão a herdar — qualquer modal de confirmação financeira deve incluir representação gráfica da decisão, não só dados tabulares.
🟢 Insight 3 — Taxa de rede exibida ANTES de assinar elimina surpresa de gas pago. User vê ~0,01 US$ e sabe que essa transação custará isso. Em mainnet Ethereum o number seria $15-50 e o user teria chance de abortar. Padrão a herdar — fees devem ser exibidos no review, não emergir só no popup da wallet.
🟢 Insight 4 — Logos dos tokens repetidas em cada linha do Depositando reforçam identidade do par. Mesmo com title "VIRTUAL / USDC" no header, cada linha de depósito mostra o logo de novo. Iniciante confirma visualmente que está depositando o que entende — não confunde linhas. Padrão a herdar — identificação visual deve ser redundante em UIs de confirmação financeira.
🔴 Fricção 1 — 0,54 US$ solto abaixo da taxa de rede é número sem rótulo claro (cosmética — orphan number polui review final)
0,54 US$ sem contexto óbvio. É a soma do USDC? É um sub-total? É o valor da taxa de rede em outra unidade? Iniciante para nesse number tentando decodar. Provavelmente é display redundante do USDC depositado (0,540 US$ → 0,54 US$ arredondado), mas a redundância confunde sem ajudar.Total depositado: $12,09 (soma de VIRTUAL + USDC). Se for redundância, remover. Trade-off: exige decisão de produto sobre o que o number representa.🔴 Fricção 2 — Criar no modal e Analisar fora do modal competem visualmente como CTAs primários (estrutural — hierarquia de ação ambígua entre modal e tela de fundo)
Criar (rosa primário). Mas atrás do modal, ainda visível e ativo, está o CTA Analisar (também rosa primário) da tela de Etapa 2. Iniciante pode clicar no botão errado — especialmente em viewport pequeno onde Analisar aparece pelas bordas. "Analisar" abre o review (já está aberto); "Criar" submete à blockchain. Confusão entre eles tem consequências diferentes.Analisar lá. Trade-off: trivial; ganho: zero clique acidental no botão errado.🔴 Fricção 3 — 13 VIRTUAL exibido sem fração mas 0,53968 USDC com 5 casas — inconsistência de precisão entre as linhas do mesmo bloco (cosmética — formatação inconsistente)
13 (sem decimais visíveis); USDC aparece com 5 casas 0,53968. Provavelmente VIRTUAL é exatamente 13,0 (input do user) e USDC é recalculado pela math. Mas a inconsistência de display sugere que VIRTUAL é "limpo" e USDC é "sujo" — leitura pode levar iniciante a desconfiar do number "sujo".13,00000 / 0,53968 em 5 casas decimais polui; padronizar em 2 casas 13,00 / 0,54 perde precisão do USDC.13,00 / 0,54) + tooltip on-hover com precisão completa. Consistência visual com fallback informativo. Trade-off: perde precisão visível pra avançado; aceitar.🟡 Oportunidade competitiva — Modal de review com simulação "o que acontece se preço sair do range"
Min 0,84 / Max 1,20 mas não vê "se preço cair pra 0,80, sua posição vira 100% VIRTUAL e para de render fees".Preço cai 10% → 100% VIRTUAL, 0 fees / Preço fica → fees acumulam / Preço sobe 30% → ainda dentro do range, fees acumulam) antes de clicar Criar.Ver cenários (3) v que expande pra mostrar 3 outcomes possíveis com probabilidade estimada e ação resultante ("posição fica 100% USDC, parar de render"). Default colapsado pra não inflar modal de avançado.Observação adicional — Pedir ajuda no header do modal é uma pequena revolução de affordance que vale destacar como decisão estratégica. Em 99% dos modais de confirmação financeira (banco, broker, DEX), a opção é "OK / Cancelar". Uniswap adiciona uma 3ª via: "não sei o que fazer, me ajude". Não é só usabilidade — é postura de produto que admite que confusão é estado válido. Vale herdar pra Kotai como princípio, não só padrão visual.






Função: após clique em Criar (Tela 8), modal Uniswap atualiza pra mostrar sequência de aprovações on-chain necessária; carteira (Rabby) abre popup paralelo pedindo assinatura de cada uma. Etapa de handoff entre app e wallet — ponto crítico de abandono em DeFi.
Componentes
Criando posição + × + título do par VIRTUAL / USDC ainda visível.Mín 0,84233 / Máx 1,20009.Depositando: 13 VIRTUAL ($11,55) / 0,562854 USDC ($0,562) — USDC ligeiramente diferente da Tela 8 (re-quote após delay?).Continuar na carteira + microcopy "Você precisa aprovar 2 tokens".Aprovar VIRTUAL ✓ (concluído, check verde).Aprovar USDC (atual — destacado).Confirmar na carteira (próximo, cinza).Etapa 2 de 3.https://app.uniswap.org.Token Approval.Approve token: 115,792,089,237,316,... (limite máximo uint256 — aprovação infinita).My balance: 13.7841 VIRT....Approve to: 0xC36AAA... (endereço do contrato Permit2 ou roteador).Protocol (label sem valor visível).Interacted before (badge de histórico).Advanced Settings (collapse).Sign with Seed Phrase (Rabby seed wallet).Transaction created ✓ (confirmação inline).Regras de negócio
Approve token: 115,792,089,237,316,... é 2^256-1 (uint256 max) — convenção de "aprovação infinita" pra evitar pagar gas de re-approval em transações futuras.🟢 Insight 1 — Stepper inline Etapa X de 3 no modal devolve agência ao user durante o handoff pra wallet. Sem stepper, user clica Aprovar VIRTUAL na wallet, volta, vê "loading" no Uniswap, e não sabe quantas vezes ainda vai precisar assinar. Stepper concreto ("2 de 3") deixa claro o que falta. Padrão a herdar pra Kotai — qualquer fluxo multi-tx deve expor progresso explícito.
🟢 Insight 2 — Microcopy "Você precisa aprovar 2 tokens" antecipa o número de assinaturas antes de começar. User sabe que serão 3 cliques na wallet antes de começar, não descobre no meio. Padrão a herdar — flows com side-effect na wallet devem declarar "você vai assinar X vezes" antes do primeiro popup.
🟢 Insight 3 — Badge Interacted before na Rabby Wallet sinaliza que o contrato é familiar. Sinal de trust vindo da wallet (não do DEX) — se você já interagiu antes com 0xC36AAA..., provavelmente é Permit2 oficial. Padrão a herdar — sinais de trust devem ser orquestrados entre app e wallet, não duplicados.
🔴 Fricção 1 — 3 popups consecutivos de wallet (Aprovar VIRTUAL + Aprovar USDC + Confirmar) é a principal causa de abandono em criação de posição LP (estrutural — fricção de protocolo ERC-20 transferida pro user)
🔴 Fricção 2 — Approve token: 115,792,089,237,316,... (uint256 max) é o number mais assustador da tela e ninguém explica que é "aprovação infinita padrão" (estrutural — convenção técnica de segurança exposta como dado bruto)
115 quatrilhões e mais um caminhão de zeros como valor sendo aprovado. Reação racional: pânico ("vão drenar minha carteira?"). Reação real do user: assina mesmo assim porque é o que o produto pede, sem entender. Pior cenário cognitivo: user aprende a ignorar números na wallet porque "isso aí é normal". Hábito que vai ser explorado pela próxima dApp maliciosa.uint256 max por valor exato 13.7841 VIRT exige re-approval em cada nova transação — gas overhead que avançado rejeita.Aprovação: ✓ Infinita (recomendado) / Apenas esta transação (paga gas extra na próxima). Default infinita pra preservar economia; user iniciante que tem dúvida tem out. Microcopy "Aprovação infinita = você não paga gas de re-approval; apenas o contrato Permit2 pode gastar e ele é open-source/auditado". Trade-off: mais UI no modal; ganho: zero pânico do user + educação sobre por que infinito é padrão.🔴 Fricção 3 — Inconsistência de USDC entre Tela 8 e Tela 9 (0,53968 → 0,562854) (estrutural — re-quote silencioso no momento crítico de assinar)
0,53968 USDC ($0,540). Modal de assinatura (Tela 9) mostra 0,562854 USDC ($0,562) — 4% maior. Provavelmente preço de mercado mudou nos segundos entre clicar Criar e o popup abrir. Mas: (a) user não foi avisado; (b) diferença pode crescer em rede congestionada; (c) iniciante atento percebe e desconfia ("essa tela mudou os numbers depois que eu confirmei?").🟡 Oportunidade competitiva — DEX nativo em smart wallet (Account Abstraction) com batch + sponsored gas
userOp única; gas pago em USDC (não ETH); approvals consolidados via Permit2 + multicall; recuperação social via guardians (não seed phrase). EOA continua suportada como modo "avançado".Observação adicional — Sign with Seed Phrase na Rabby é affordance de fallback que revela um dado crítico: a wallet do user é seed-based, não hardware nem smart. Isso significa que todo o flow assume EOA, perpetuando os 3 popups. Para Kotai mirar iniciante, decisão de produto mais importante pode não ser "fazer DEX melhor" — pode ser "fazer onboard de smart wallet melhor que tudo no mercado, e depois construir o DEX em cima dela". A diferenciação de UX no DEX vai bater no teto da carteira do user.

Todos os tipos expandido (categorias DeFi-nativas)Função: Dropdown do filtro de tipo de transação na tab Atividade. Define o vocabulário do produto sobre "o que conta como transação" — 11 categorias DeFi-nativas que cobrem swap, LP, transfer, sistema. É o filtro que materializa a granularidade do log e, indiretamente, o que o produto considera relevante registrar.
Componentes
Todos os tipos ▴ ativo (chevron para cima = aberto).Todos os tipos ✓ (selecionado, check rosa)Swaps (logo Uniswap rosa)Envios (ícone avião/seta)Recebimentos (ícone download)Wraps (ícone embrulho)Withdrawals (ícone download alternativo)Aprovações (ícone cadeado)Pools criados (ícone onda)Liquidez adicionada (ícone +)Liquidez removida (ícone –)Tarifas resgatadas (ícone moeda)Emissões (ícone emit)Todo o período ▾ permanece colapsado ao lado.Regras de negócio
Wraps = WETH wrap/unwrap (ETH ↔ WETH); Withdrawals = saques (pool, staking); Aprovações = ERC-20 approve(); Emissões = mint (NFT, LP token, governance token).🟢 Insight 1 — Granularidade alta cobre o vocabulário DeFi completo. 11 categorias incluem operações triviais (Swap, Envio) e operações de sistema (Aprovações, Emissões) — auditoria fina possível. Padrão a herdar — não esconder categorias técnicas porque iniciante não as usa; elas são fundamentais pra uso sério, e quem precisa precisa.
🟢 Insight 2 — Todos os tipos como default e primeira opção. Iniciante vê tudo sem ter que escolher. Padrão correto — default amplo, filtros como refinamento opcional.
🟢 Insight 3 — Ícones distintos por categoria reduzem leitura textual. User aprende vocabulário visual e decoda a lista futura por ícone, não por label completa. Pattern correto pra listas densas. Padrão a herdar.
🔴 Fricção 1 — Mistura PT-BR e EN inconsistente (Wraps, Withdrawals no meio de itens traduzidos) (estrutural — i18n quebrada afeta confiança e entendimento)
Envios, Recebimentos, Aprovações, Emissões (traduzidos) coexistindo com Wraps e Withdrawals (em inglês). Pra iniciante BR que não sabe o que é "wrap", a palavra é ruído puro. Pior: Withdrawals tem tradução óbvia (Retiradas) e foi deixada em EN — sinal de tradução incompleta, não decisão consciente. Erode confiança no resto da UI traduzida.Wraps → Empacotamentos soa estranho e perde o termo técnico que avançado reconhece.Trocas WETH ↔ ETH (tooltip: "wrap/unwrap"); Retiradas (tooltip: "withdrawals"). Iniciante decoda; avançado mantém ponte com terminologia internacional. Trade-off: labels mais longos; ganho: iniciante BR entende.🔴 Fricção 2 — 11 categorias planas sem agrupamento funcional (estrutural — cognitive load no scan)
Swaps. Aprovações no meio é especialmente disruptivo — é categoria "de sistema", quase nunca o user filtra por ela conscientemente.🔴 Fricção 3 — Seleção provavelmente radio (single), não múltipla (estrutural — granularidade visualmente alta, funcionalmente limitada)
Todos os tipos como checkbox não faz sentido (é o agregado).Todos os tipos (clicar marca/desmarca todos) + footer com Limpar / Aplicar. Single-click rápido continua funcionando (clica 1 item → filtra só por ele). Trade-off: dropdown ganha estado de aplicação; ganho: filtragem flexível pra casos sérios.Sem 🟡 nesta tela — categorias dinâmicas baseadas em uso (ocultar vazias, destacar com volume) seria melhoria, mas leverage no target é média-baixa e o ganho não passa nas 4 perguntas-teste com clareza. Registrar como possível otimização futura.
Observação adicional: Aprovações aparecer como categoria de primeira classe sinaliza que o produto reconhece eventos approve() como objeto contábil — padrão correto. Quando o log popular, vale incluir affordance [Revogar] direto na linha de aprovação — converte log passivo em ação de segurança. Vetor de higiene DeFi (revogar aprovações antigas pra evitar drain attacks) raramente exposto pelos concorrentes.

Função: primeira tela do flow de criação de posição, aterrissada via + New da Tela 5 (ou via + Add liquidity da Tela 1). Layout em 2 colunas + stepper vertical à esquerda: stepper mostra Step 1 (Select token pair and fees) ativo / Step 2 (Set price range and deposit amounts) bloqueado; coluna direita exibe seções Select pair, Fee tier, CTA Continue (desabilitado). Estado capturado tem o dropdown de versão aberto mostrando v4 position (default selecionado) + opções New v3 position / New v2 position.
Componentes
Your positions › New position.New position.1 rosa (Step 1 ativo, label "Select token pair and fees") + círculo 2 cinza (Step 2 bloqueado, "Set price range and deposit amounts").↻ Reset (texto, secundário).v4 position v (default) — aberto neste print, revelando: New v3 position / New v2 position.⚙ settings gear.Choose token v (vazio).+ Add a Hook (Advanced) ⓘ — exclusivo de v4.More v à direita.Continue (desabilitado, cinza — Step 1 incompleto).Regras de negócio
Migrate to v4 na Tela 5).?currency0=NATIVE visível na address bar).+ Add a Hook (Advanced) só aparece quando versão = v4. Hooks são feature-killer de v4 (lógica custom em swap/add/remove) — mas escondida atrás de label "(Advanced)" + ⓘ.🟢 Insight 1 — Stepper vertical com 2 steps anuncia desde a entrada que o flow é curto e linear. Em vez de wizard interminável estilo Sushiswap ou OneInch (5+ steps), Uniswap reduz a 2 etapas. Iniciante vê de cara "vou clicar Continue 1 vez e acabou" — reduz fricção de antecipação. Padrão a herdar pra Kotai: stepper visível desde a entrada > stepper que aparece progressivamente; quanto menos steps explícitos, mais o user comete-se.
🟢 Insight 2 — Dropdown de versão no header (não no body) sinaliza decisão arquitetural transversal. v4/v3/v2 não é "atributo do par" — é "qual AMM você quer usar". Por isso fica no header, junto com Reset e Settings, não dentro de Select pair. Padrão a herdar — decisões transversais ao flow (testnet, multichain, versão) merecem slot global; decisões locais (par, fee, range) ficam no body.
🟢 Insight 3 — Hook como link em vez de tab. v4 introduz hooks (lógica custom). Uniswap não promove a tab "Configure hook" no flow — mostra como link inline + Add a Hook (Advanced). Decisão deliberada: hooks são feature avançada que a maioria dos LPs não vai usar, mas precisa estar visível pra quem usa. Link colapsado = affordance honesta. Padrão a herdar — features de poucos não merecem tab dedicada; merecem link inline com (Advanced) explícito.
🔴 Fricção 1 — Dropdown v4 position na posição mais alta da página induz iniciante a pensar que escolher versão é o primeiro passo, mas o Step 1 do stepper diz "Select token pair and fees" (estrutural — conflito entre dois sistemas de navegação na mesma tela)
1. Select token pair and fees. (b) Header tem dropdown v4 position ativo + Reset + Settings. User iniciante não sabe se deve mexer no dropdown primeiro (parece importante, está no topo) ou no Select pair (é o que o stepper manda). Resultado típico: clica no dropdown sem saber o que significa "v4 position", abre o menu, vê v3 / v2 sem contexto, fecha com inércia em v4. Decisão de versão fica por default em vez de escolha — exatamente o oposto da pedagogia que a tela tenta entregar.0. Choose AMM version (v2/v3/v4) → 1. Select token pair and fees → 2. Set price range and deposit amounts. Stepper passa a ter 3 marcos, primeiro marco é "Versão" com card-resumo das 3 opções (v4: hooks, mais flexível / v3: concentrated, padrão / v2: full-range, simples). User escolhe versão com contexto, depois cai no Select pair. Trade-off: mais 1 step antes de tudo (custo de antecipação) mas decisão informada em vez de default cego. Aceitar pelo target iniciante.Liquidity sem affordance v3) — mesma raiz: produto trata versão como atributo invisível, transferindo o custo de decoda pro user.🔴 Fricção 2 — + Add a Hook (Advanced) ⓘ aparece mesmo antes do par estar completo (cosmética — affordance fora de ordem)
Choose token). User pode clicar em hook sem ter par; produto provavelmente vai bloquear ou abrir modal estranho. Em flow linear de 2 steps, ações condicionais (hook = feature de v4) deveriam aparecer só quando pré-condições estão satisfeitas.🔴 Fricção 3 — Continue desabilitado sem indicação de o que falta (cosmética — botão silenciosamente bloqueado)
Continue cinza não diz por que está bloqueado. Faltam três coisas: (a) token 2 do par, (b) fee tier. User precisa olhar a tela inteira e descobrir o que está incompleto. Em flow simples (2 steps) isso é tolerável, mas em flows densos vira problema.Select second token (enquanto slot 2 vazio) → Choose fee tier (depois) → Continue. Botão se autocomenta. Trade-off: label muda muito, pode parecer inconsistente; ganho: clareza do gating sem elementos extras.🟡 Oportunidade competitiva — Card-comparador de versões (v2/v3/v4) no momento da escolha
Observação adicional — URL revela que ETH veio via ?currency0=NATIVE. A address bar mostra app.uniswap.org/positions/create/v4?currency0=NATIVE&.... Decisão arquitetural: o flow herda contexto da URL (deeplinkável), permitindo que Pools/Pool Detail/Cards de "Top pools" levem o user pro flow com par pré-preenchido. Padrão a herdar pra Kotai — flow de criação deve aceitar ?token0=X&token1=Y&fee=Z como parâmetros, possibilitando deep-link em qualquer entrypoint (pool detail, banner promocional, link compartilhado).
Função: entrada do Step 2 (Set price range and deposit amounts) após Continue da Tela 7/8. Stepper muda: círculo 1 cinza (Step 1 concluído), círculo 2 rosa (Step 2 ativo). Panel revela section Set price range com tabs Full range / Custom range — Custom range default selecionado — chart histórico de preço (Mar 15 a Apr 12, ~30 dias) e current price denominado em 0,00045 WETH/USDC ($0,892). Toggle de denominação USDC | ETH no canto direito.
Componentes
USDC / ETH + v3 + fee 0,05% + botão ✏ Edit (volta ao Step 1).Full range | Custom range ✓ (default em Custom).0,00045 WETH/USDC ($0,892) + toggle de denominação USDC | ETH ✓ (radio-pair de seleção mútua).Regras de negócio
Custom range. Decisão de produto: Uniswap empurra concentração ativa (feature core de v3) como caminho default.USDC | ETH muda a denominação do current price: USDC = preço de USDC em ETH (0,00045 WETH); ETH = preço de ETH em USDC ($2.222 ≈ 1/0,00045). Decisão arquitetural — par ETH/USDC pode ser lido em duas direções, e a escolha afeta como o range será definido (min/max em "WETH por USDC" ou "USDC por WETH").Edit no header do panel é re-entry ao Step 1 — não há "Cancel" ou "Back" no stepper.🟢 Insight 1 — Default Custom range empurra o user pra feature diferenciadora de v3. Tab Full range está visível mas não-selecionada; produto sinaliza "você escolheu v3, então concentrar é o ponto". Decisão de funil: se default fosse Full range, user nunca exploraria concentrated liquidity e v3 viraria "v2 com extra step". Padrão a herdar pra Kotai — quando arquitetura tem feature core, default deve dirigir a ela (com escapatória clara).
🟢 Insight 2 — Microcopy embaixo da tab carrega trade-off explícito. "...enhancing capital efficiency and fee earnings but requiring more active management". Não vende só o lado bom (yield maior) — declara o custo (manutenção ativa). Sinceridade rara em DeFi onboarding. Padrão a herdar — microcopy de feature avançada deve carregar trade-off na mesma frase, não em FAQ separado.
🟢 Insight 3 — Toggle de denominação como primary control, não setting escondido. USDC | ETH fica colado no current price, no nível visual mais alto da decisão. Reconhece que denominação muda a leitura inteira do range (min/max em token A é diferente de min/max em token B; user que confunde paga caro). Padrão a herdar — controles que mudam unidade de medida devem viver no mesmo nível que o number que medem.
🟢 Insight 4 — Botão Edit no header do panel preserva fluidez ao voltar pro Step 1. Não há "Voltar" no stepper (decisão de produto: stepper marca progresso, não navegação). Mas user pode precisar trocar fee (ex: percebeu que 0,05% é tier errado). Edit resolve sem confundir o modelo do stepper. Padrão a herdar — re-entry a steps anteriores via "Edit" no contexto, não via setas do stepper.
🔴 Fricção 1 — Current price 0,00045 WETH/USDC é a denominação menos legível pra iniciante; o produto começa com a leitura difícil (estrutural — default de denominação inverte intuição)
WETH/USDC) força o user a inverter o number: 1/0,00045 ≈ $2.222. Em pares com stablecoin, a direção convencional cripto-nativa é stablecoin como quote ($X por ETH) — exatamente o que o toggle ETH ✓ daria. Mas o default escolhido é USDC ✓, que mostra WETH/USDC (i.e., quantos WETH você ganha por 1 USDC). Decisão arquitetural defensável (USDC é "token 0" no contrato), mas semanticamente confusa pro user.$2.222 USDC/WETH) é fácil mas pode quebrar paridade com contrato (campos internos esperam token0 = USDC); mostrar ambos lado a lado polui.$2.222) em vez de inverso.🔴 Fricção 2 — Custom range default sem range pré-preenchido deixa o user em "white canvas" estado (estrutural — affordance ausente no momento de maior incerteza)
Stable (±3 ticks) privilegia uma das 4 price strategies sem contexto.🔴 *Fricção 3 — Microcopy "requiring more active management" anuncia custo de gestão sem dizer quanto ou com que frequência (cosmética — caveat honesto mas vago)
±2%), produto mostra "Posições tight saem do range em ~12h em períodos voláteis. Considere notificações." Quando range amplo (±50%), microcopy fica neutra. Acompanha decisão de range com expectativa real de manutenção.🟡 Oportunidade competitiva — Range "presets inteligentes" baseados em volatilidade histórica, não em ticks ou %
Stable (±3 ticks) / Wide (-50%—+100%) / One-sided. Presets nomeados por forma (stable/wide), não por resultado esperado (% chance de ficar in-range). User escolhe preset por estética sem âncora probabilística.Conservative: 95% chance in-range nas próximas 24h (±18%) em vez de Wide (-50%—+100%).Stable / Wide / One-sided lower / One-sided upper por 3 presets probabilísticos — Conservador (95% in-range 24h), Equilibrado (80% in-range 24h), Agressivo (50% in-range 24h). Microcopy de APR estimado por preset. Override pra power user com "Custom (definir ticks/percentual)".Observação adicional — Edit no header do panel revela que Step 1 e Step 2 são edição independente, não wizard estrito. User pode terminar Step 2 parcialmente, voltar ao Step 1 (mudar par ou fee), voltar ao Step 2 com o trabalho preservado. Decisão arquitetural valiosa — wizard rígido (perde estado ao voltar) é fonte clássica de frustração. Vale herdar pra Kotai: flows multistep devem preservar estado em cada etapa, e oferecer Edit contextual (não Back/Cancel).
Full range ativa (estratégia simples)Função: mesma tela do Step 2 com o user trocando pra tab Full range. Chart inteiro fica coberto por banda azul (cobertura de 0 → ∞), microcopy muda pra explicar trade-off de full range, e revela-se barra inferior com toggles de tempo (1D / 1W / 1M / 1Y / All time) + controles de zoom + botão Reset. Abaixo do chart, section Price strategies com 4 cards: Stable (±3 ticks) / Wide (-50%—+100%) / One-sided lower (-50%) / One-sided upper (+100%).
Componentes (diff em relação à Tela 9)
Full range ✓ (mudou).1D | 1W | 1M ✓ | 1Y | All time + ícones ⊞ (zoom-fit) + 🔍 (zoom-in) + botão Reset (à direita).Price strategies (revela-se com scroll): 4 cards horizontais:Stable — "± 3 ticks".Wide — "-50% — +100%".One-sided lower — "-50%".One-sided upper — "+100%".Regras de negócio
[0, ∞]. Capital fica continuamente in-range, mas espalhado entre todos os preços.Price strategies ficam visíveis mesmo na tab Full range — mas selecioná-los provavelmente muda automaticamente pra Custom range (presets são custom, não full). Não há indicação visual disso.Reset zera qualquer range custom definido — em Full range a função é inerte (já está em "default máximo").🟢 Insight 1 — Tab Full range carrega trade-off honesto na microcopy: "simplicity but higher impermanent loss". Igual à Tela 9 mas inverte: aqui vende simplicidade e admite IL maior. Decisão pedagógica simétrica. Padrão a herdar pra Kotai — quando duas opções têm trade-offs opostos, a microcopy de cada lado deve admitir o custo da própria opção, não esconder.
🟢 Insight 2 — Banda azul cobrindo o chart inteiro é resposta visual instantânea pro "o que é full range?". Sem necessidade de explicação textual. Iniciante vê "minha liquidez cobre tudo" em 1 segundo. Padrão a herdar — quando feature tem representação visual óbvia (overlay no chart), usar.
🟢 Insight 3 — Toggle de tempo + zoom + reset abaixo do chart é UX de finanças madura. 1D / 1W / 1M / 1Y / All time é convenção universal (TradingView, Coingecko, Robinhood). User vindo de qualquer plataforma financeira reconhece. Padrão a herdar — em DeFi onde tudo parece novo, herdar convenções de fintech reduz onboarding.
🟢 Insight 4 — Price strategies cards horizontais convivem com a tab Full range. Permite descoberta — user vê "ah, posso escolher Wide ou One-sided sem ir em Custom range manualmente". Card-shortcuts atalham a escolha. Padrão a herdar — presets devem estar visíveis na tela default, não escondidos atrás de "Advanced".
🔴 Fricção 1 — Cards Price strategies na tab Full range são affordance ambígua: clicar muda pra Custom sem aviso (estrutural — clique em preset abandona silenciosamente a tab atual)
Full range, vê Price strategies: Stable (±3 ticks), clica. Sem aviso, a tab muda pra Custom range (presets são custom por definição) e o range vira ±3 ticks ao redor do preço. User pode não perceber que abandonou Full range — e o trade-off agora é o oposto (concentração + manutenção ativa). Decisão tomada por inércia, sem clareza.🔴 *Fricção 2 — Microcopy "continuous market participation" glamouriza full range, mas na maior parte dos pares voláteis o LP em full range perde dinheiro vs hold simples (estrutural — texto deliberadamente otimista esconde a realidade matemática)
🔴 Fricção 3 — Toggle de tempo (1M ✓) é o único elemento que sinaliza que o chart é histórico, não predictivo (cosmética — confusão de mental model sobre o que o chart "mostra")
1M ✓ no toggle inferior denuncia. Iniciante pode olhar e pensar "ETH vai oscilar nesse range nos próximos 30 dias". Erro de leitura crítico — chart histórico não promete movimento futuro.1M, usar Últimos 30 dias no estado ativo. Anchored "you're looking at history". Trade-off: mais largura no toggle; pequeno.🟡 Oportunidade competitiva — Comparativo "Full range vs Hold vs Custom otimizado" no momento da decisão
Hold simples, LP Full range, LP Custom (sugerido) — com APR estimado e %-chance-de-perder-vs-hold. Honestidade radical. Produto admite que LP não é sempre a resposta.Observação adicional — Reset na tab Full range é botão inerte mas presente. UI mantém affordance consistente entre tabs (Reset aparece sempre). Em Full range não há nada pra resetar (range já é máximo). Decisão arquitetural defensável (consistência > clareza condicional), mas vale considerar: button visível e clicável que não faz nada quebra contrato implícito de affordance. Alternativa: desabilitar com tooltip "Já está em Full range". Cosmético.
Função: mesmo Step 1 com a section Fee tier expandida (More virou Less ^). Em vez da linha resumo da Tela 7, agora aparecem 4 cards lado a lado mostrando todos os fee tiers disponíveis em v3 ETH/USDC, com perfil ideal, TVL absoluto e % de seleção (prova social quantificada).
Componentes (diff em relação à Tela 7)
More v virou Less ^ (collapse).0,05% fee tier ainda visível acima dos cards.0,05% ✓ (selected — borda destacada + checkmark) — "Best for stable pairs" — $501.1M TVL — 77,985% select.0,3% — "Best for most pairs" — $24.2M TVL — 16,685% select.0,01% — "Best for very stable pairs" — $3.1M TVL — 5,715% select.1% — "Best for exotic pairs" — $786.0K TVL — 0,007% select.Continue permanece ativo (já estava ativo na Tela 7).Regras de negócio
0,01% / 0,05% / 0,3% / 1%); pares novos podem ativar ou não cada um.stable / most / very stable / exotic. "Very stable" implica correlação altíssima (USDC/USDT, DAI/USDC); "exotic" implica pares ilíquidos/voláteis.% select = participação daquele tier no total de posições do par. Soma deveria dar 100% mas dá ~100,4% nos números visíveis — provavelmente arredondamento ou métrica de share-of-deposits ponderado.🟢 Insight 1 — Card de fee tier combina 3 dimensões de evidência em layout único: microcopy editorial + TVL absoluto + share de seleção. As 3 cumprem papéis diferentes: microcopy ensina ("best for stable"), TVL ancora ordem de grandeza ("$501M ≠ $3M"), share quantifica adoção ("77% das pessoas escolhem isso"). Iniciante decide por microcopy; intermediário cruza com TVL; avançado checa share pra detectar arbitragem. Padrão a herdar pra Kotai: card de decisão deve servir 3 níveis de leitor sem virar dashboard.
🟢 Insight 2 — % select como prova social quantificada é mais honesto que badge Highest TVL. Tela 7 mostrou só o badge; Tela 8 mostra a distribuição. User vê que 77% escolhe 0,05% e 16% escolhe 0,3% — duas decisões legítimas. Sem isso, o badge Highest TVL da Tela 7 parece "única escolha certa". Distribuição completa devolve agência ao user. Padrão a herdar — quando produto pré-seleciona com base em popularidade, mostrar a distribuição completa (não só o vencedor) preserva escolha informada.
🟢 Insight 3 — Microcopy curta orienta sem prescrever. Best for stable pairs / most pairs / very stable pairs / exotic pairs é minimal: não diz "recomendado", não diz "use isso", diz "encaixa nesse caso". User cruza com seu próprio par (ETH/USDC = stable? volátil?) e decide. Padrão a herdar — microcopy de decisão deve dar tag de caso, não recomendação.
🟢 Insight 4 — Progressive disclosure preservada. User satisfeito com default continua sem clicar More (Tela 7); user que quer entender clica e explora (Tela 8); user pode voltar ao colapso. Toggle simétrico = sem fricção. Padrão a herdar — colapso/expansão deve ser sempre reversível e gratuito.
🔴 Fricção 1 — Microcopy Best for stable / most / very stable / exotic pairs é taxonomia vaga e não diz onde ETH/USDC encaixa (estrutural — produto ensina a régua mas não aplica ao caso do user)
Best for most pairs). Mas o agregado mostra 77% das pessoas usam 0,05% pra ETH/USDC — i.e., a taxonomia subentende algo específico (USD-denominated trading pair) que iniciante não decoda.🔴 Fricção 2 — % select como métrica é semanticamente ambígua (% de posições? % de TVL? % de transações?) (cosmética — número sem unidade definida)
select por dos LPs escolhem este tier (frase explícita) ou similar. Ou expor as 3 métricas em hover (ganho marginal).🔴 Fricção 3 — Hierarquia visual dos 4 cards é flat: o card selecionado tem checkmark mas é fácil perder no scan (cosmética — affordance de "selecionado" subdimensionada)
Less pra colapsar pode achar que perdeu sua escolha — quando na verdade o default ainda está marcado.🟡 Oportunidade competitiva — Cards de fee tier mostrando APR histórico (não só TVL e share)
0,05%: 12% APR full range / 0,3%: 28% APR tight / 1%: 45% APR tight tighter e escolhe com retorno como âncora.Simular APR no meu range → que abre o range picker direto no card.Observação adicional — soma de % select não bate 100%. 77,985 + 16,685 + 5,715 + 0,007 = 100,392%. Excede 100% — provavelmente arredondamento por casa decimal, ou métrica que pondera de forma que cruza limite (ex: share por TVL onde uma pool é contada em 2 tiers via migração). Não é fricção do user (números são plausíveis), mas é detalhe que iniciante atento percebe e que mina trust no produto ("se a soma não bate, esses numbers são confiáveis?"). Vale registrar como observação de qualidade analítica: numbers expostos ao user devem fechar matematicamente, ou carregar caveat explícito ("share por TVL com sobreposição de pools migradas").

Função: dashboard de posições LP do user. Pós-Criar (Tela 9), a nova posição VIRTUAL/USDC aparece como card com status Dentro do intervalo, métricas (Posição, Tarifas, APR) e range configurado. Hub central de gerenciamento de liquidez — entry point pra ações de coletar fees, remover, migrar.
Componentes
0 UNI + Recompensas ganhas + microcopy + botão Recolher recompensas (desabilitado por saldo 0).Suas posições com toolbar:+ Novo (rosa primário).Status v + Protocolo v.VIRTUAL / USDC com logos + badge v3 0,3% + link Migrar para v4 →.✓ Dentro do intervalo (verde).Posição: 11,72 US$ / Tarifas: 0,00 US$ / APR: 36,42%.Mín: 0,84233 USDC/VIRTUAL / Máx: 1,20009 USDC/VIRTUAL.×).Pools com recompensas: USDC/USDT v3 3,84% APR (+13,0X%), USDC/USDC v4 0,06% APR, etc.Maiores pools por TVL: WISE/ETH 1,00% / 0,00% APR, ETH/USDT 0,005% / 24,08% APR.Regras de negócio
Dentro do intervalo (verde) = preço atual está entre Min e Max do range — posição rendendo fees.Fora do intervalo (vermelho, não exibido aqui) = preço saiu do range — capital virou 100% de um lado, parou de render fees.Tarifas: 0,00 US$ = fee accrual começa em zero e cresce conforme volume passa pelo range; primeiros minutos pós-criação ainda mostram 0.APR: 36,42% é estimativa trailing baseada em histórico do tier (não forward).Migrar para v4 → é prompt de UNI/Uniswap pra migração de protocolo (v4 hooks, etc.).Pools com recompensas lista pools que pagam UNI farming — incentivo cruzado pra mover capital.🟢 Insight 1 — Card de posição denso com 6 informações + mini-chart é state-of-the-art para position management. Status / Posição / Tarifas / APR / Range / mini-chart numa única row. User entende a saúde da posição em 3 segundos sem clicar. Padrão a herdar pra Kotai — card de holding deve servir scan rápido (status) e auditoria (detalhes) na mesma view.
🟢 Insight 2 — Badge ✓ Dentro do intervalo em verde funciona como semáforo binário acionável. User não precisa decodar numbers pra saber "tudo bem com minha posição". Verde = parado; vermelho = agir. Padrão a herdar — health status deve ter representação binária visível antes do detalhe numérico.
🟢 Insight 3 — Mini-chart inline materializa "onde estou no range" sem clique. Linha verde dentro da banda do range é affordance instantânea de "minha posição está rendendo agora". Padrão a herdar — qualquer holding com range/threshold deve mostrar a posição relativa graficamente.
🟢 Insight 4 — Migrar para v4 → no próprio card é prompt contextual respeitoso. Não é modal interruptor; é link discreto que oferece upgrade quando o user já está olhando a posição. Padrão a herdar — prompts de migração devem aparecer onde fazem sentido (na coisa migrável), não em banners globais.
🔴 Fricção 1 — Sidebar Pools com recompensas e Maiores pools por TVL compete com gestão da posição atual (estrutural — produto puxa user pra fora do contexto de cuidar do capital já investido)
Dentro do intervalo? Tarifas acumulando?). Sidebar oferece outras pools com 3,84% APR + 13% — atratividade superior à pool atual (0,06% APR?). User com FOMO sai de "gerenciar o que tenho" pra "caçar próxima". Pior: as pools sugeridas (UNI farming) são incentivadas, não orgânicas — APR real cai quando farming acaba.Saúde do seu portfólio LP com 3 sinais: Posições in-range: 1/1 (100%), Fees acumuladas semana: $X, Posições que precisam atenção: 0. Discovery de novas pools fica no Pool tab principal (já existe). Trade-off: perde mecanismo de growth via cross-promo; ganho: tempo de gestão protegido + foco em compounding.🔴 Fricção 2 — 0 UNI Recompensas ganhas no topo da página é número irrelevante pra esta carteira (cosmética — header denso com info que não se aplica ao user atual)
Recolher recompensas (disabled). É 30% da altura útil do header pra informação que diz "você não tem nada aqui". Iniciante pode achar que algo está errado.0 UNI, colapsar o header em 1 linha — 0 UNI farming · Como ganhar? (link pra explicação). Se > 0, expandir como está. Trade-off: layout condicional; ganho: hierarquia visual respeitada.🔴 Fricção 3 — APR 36,42% exibido sem caveat sobre IL ou janela (estrutural — APR isolado já flagrado em outras telas)
APR estimado (30d, sem IL) + microcopy on-hover "Estimativa baseada no histórico do tier. Seu retorno real depende de quanto tempo a posição fica in-range.". Trade-off: label maior; ganho: zero ilusão.🟡 Oportunidade competitiva — Card de posição com proativo "o que fazer agora" baseado no estado
if fees_accrued > 10×gas_cost: sugere recolher; if price < min + 5%: sugere ajustar; if out_of_range > 24h: sugere fechar/migrar. User vê ação recomendada com 1 clique pra executar.Observação adicional — Migrar para v4 → carrega assumption de que user entende o que é v4 e por que migrar. Iniciante que clica entra em flow técnico (hooks, migrate logic) sem ter pedido. Em paralelo, o microcopy de v2 ("Algumas posições de v2 não são exibidas...") assume que user sabe que v2 e v3 são protocolos diferentes. Convenção de versionamento de protocolo vazando pra UI em 2 lugares na mesma tela. Vale tratar como família com Fricção 1 da Tela 3 — produto deve abstrair versão sempre que possível.

Todo o período expandido (janelas temporais)Função: Dropdown do filtro de janela temporal na tab Atividade. Define o vocabulário do produto sobre "horizonte de tempo" — 4 ranges pré-definidos. Tela simples, mas as escolhas refletem hipótese de uso ("casos comuns são curtos") que afeta seriamente quem precisa de janela maior ou específica.
Componentes
Todo o período ▴ ativo (chevron para cima).Todo o período ✓ (selecionado, check rosa)24 horas7 dias30 diasTodos os tipos ▾ permanece colapsado à esquerda.Regras de negócio
Todo o período como default = mostra tudo (escopo mais amplo).🟢 Insight 1 — 4 ranges padronizados cobrem o caso comum sem inflar a lista. "24h / 7d / 30d / Tudo" é a quantidade certa pra decisão rápida — mais opções viraria paralisia. Padrão correto pra menus de janela temporal de uso casual. Padrão a herdar — sempre privilegiar "o suficiente" sobre "tudo o que é possível".
🟢 Insight 2 — Todo o período como default não esconde nada de saída. User chega na tab e vê histórico completo sem ter que escolher janela. Reduz a pergunta mental "o que estou vendo?" — sempre é "tudo até agora". Padrão a herdar.
🔴 Fricção 1 — Sem range customizado por data (estrutural — bloqueia auditoria fiscal/contábil séria)
Todo o período e filtra fora do produto (Excel, Koinly). A auditoria nativa do produto é descartada exatamente quando seria mais útil. Mesma classe de problema afeta intermediário que faz balanço mensal ("abril de 2025") ou retrospectiva semestral.Período personalizado… como última opção do dropdown, que abre date-range picker (início + fim). Mantém os 4 ranges rápidos como atalhos. Trade-off: picker é UI adicional; ganho: cobre 100% dos casos sérios.🔴 Fricção 2 — Buraco entre 30 dias e Todo o período (estrutural — falta granularidade média)
90 dias, Este ano, 6 meses, 1 ano. User que quer "último trimestre" tem que escolher Todo o período (potencialmente anos de dados) e mentalmente ignorar o que está fora da janela desejada. Para wallet com 2 anos de histórico, isso é centenas de linhas pra rolar.90 dias e Este ano (year-to-date). Cobre 80% dos casos restantes sem inflar. Combinado com Período personalizado… (Fricção 1), o leque fica completo. Trade-off: 1–2 itens a mais; ganho: cobertura sem precisar de picker no caso médio.🔴 Fricção 3 — Todo o período como default vira problema de performance/cognição quando popular (estrutural — default ótimo para empty fica pior pra wallet ativa)
Todo o período como default carrega tudo de uma vez — performance ruim, scroll infinito, cognitive overload. Para wallet ativa, o default deveria ser 30 dias (atividade recente, fácil de revisar). O default atual é ótimo pra wallet nova/vazia (como este empty) mas inadequado pra wallet matura.30 dias — wallet nova "não tem nada" e parece pior do que é.Todo o período (mostra tudo); wallet > 30 dias → 30 dias (foco no recente). Microcopy abaixo do filtro "Mostrando últimos 30 dias · [Ver tudo]" como atalho. Trade-off: regra de default com estado; ganho: zero overload em wallet matura.🟡 Oportunidade competitiva — Período fiscal como filtro de primeira classe (alta leverage no target BR/jurisdições com IR cripto)
Período fiscal 2025 (ano civil), Período fiscal 2024, etc. Geo-detectada (BR = ano civil; outros países = janela fiscal local). Plug direto com a exportação fiscal (🟡 do relatório 8). Família com 🟡 "Atividade como instrumento fiscal" do relatório 8 — esta é a peça que torna aquela acionável.Observação adicional: o filtro temporal é dropdown radio (single), igual ao Todos os tipos. Combinações como "30 dias + 90 dias" não fazem sentido aqui (são ranges, não categorias), então radio é o pattern correto — diferente da fricção 3 do relatório 9 que pede multi-select por categoria. Não confundir: "tipo" é discreto e combinável; "período" é contínuo e excludente. Padrão a herdar — escolher controle (radio/checkbox/slider) com base na natureza da dimensão filtrada, não por consistência cosmética entre filtros vizinhos.
Função: Step 1 completo após o user (a) trocar versão pra v3 via dropdown e (b) preencher o slot 2 do par com USDC. O Hook desaparece (era exclusivo de v4). Fee tier ganha valor default automático (0,05% com badge Highest TVL) sem o user ter feito qualquer escolha — produto pré-seleciona. CTA Continue agora ativo (rosa).
Componentes (diff em relação à Tela 6)
v3 position v (mudou).+ Add a Hook (Advanced) sumiu — afford condicional à versão = v4.0,05% fee tier + badge cinza Highest TVL + botão More v à direita.Continue agora rosa (ativo).Regras de negócio
Highest TVL é prova social embutida — não diz "é o melhor", diz "é o mais usado". Sutileza importante.app.uniswap.org/positions/create/v3?currency0=NATIVE¤cy1=... — versão é parte da rota, não querystring (decisão arquitetural mais forte que ETH/USDC, que são querystring).Continue ativa quando: par completo + fee tier escolhido (pré-selecionado conta como escolhido, mesmo que o user não tenha clicado).🟢 Insight 1 — Pré-seleção do fee tier de maior TVL reduz fricção real pro iniciante. Iniciante não tem heurística pra escolher entre 0,01% / 0,05% / 0,3% / 1%. Default sensato = tier mais usado pra esse par. User confia no produto, segue, fecha o flow. Sem default, o user trava no Step 1 indecidindo. Padrão a herdar pra Kotai: defaults baseados em comportamento agregado (não opinião editorial) reduzem fricção sem mentir — "todo mundo escolhe isso" é fato, não recomendação.
🟢 Insight 2 — Badge Highest TVL é prova social honesta. Não diz "best", "recommended", ou "popular" (carregados editorialmente). Diz Highest TVL — fato observável. User decide se confia no agregado ou se quer explorar. Padrão a herdar — usar labels descritivas em vez de adjetivos editoriais; deixa o user fazer a inferência ("highest TVL = mais usado = provavelmente seguro").
🟢 Insight 3 — Affordance condicional à versão (Hook some quando v3). Sem modal "Você perdeu Hooks". Sem confirmação. v3 não tem hooks, então hooks somem da tela. Decisão limpa — UI não polui com features inativas. Padrão a herdar — quando versão/modo muda capacidade, ajustar UI silenciosamente (não criar diálogo de despedida).
🟢 Insight 4 — Fee tier colapsado a 1 linha + More v esconde complexidade até demanda. User que confia no default vê 1 linha e segue. User que quer explorar clica More e abre 4 cards (Tela 8). Progressive disclosure clássica. Padrão a herdar — quando default cobre 80% dos casos, esconder os outros 20% atrás de More é manobra correta.
🔴 Fricção 1 — Default de fee tier "Highest TVL" cria efeito Matthew (rich get richer) e ancora iniciante em tier subótimo pra range tight (estrutural — default que parece neutro mas tem viés sistêmico)
More v), com sub-rótulo por tier indicando perfil ideal — 0,05%: ideal para full range / 0,3%: ideal para range moderado / 1%: ideal para range tight. User vê os 4 ao mesmo tempo, escolha vira informada. Default visual = 0,05% (highest TVL marcado), mas decisão é explícita. Trade-off: mais real-estate no Step 1, perde a progressividade da Tela 7; ganho: zero descasamento entre fee e range no Step 2.🔴 Fricção 2 — Mudança silenciosa de v4 → v3 perde features (Hook) sem informar (cosmética-estrutural — affordance some sem rastro)
+ Add a Hook (Advanced) visível troca pra v3 e a affordance some. Quem clicou no dropdown sem ler com cuidado pode não perceber que abriu mão de hooks. Em uso casual isso é OK (hooks são power feature), mas se o user queria hook, vai descobrir só lá na frente.v4 position: inclui Hooks / v3 position: concentrated liquidity, sem Hooks / v2 position: full range, sem Hooks. Sem alarme, mas com contexto. Trade-off: mais texto no header; aceitar pelo trust signal.🔴 Fricção 3 — Botão More v no fim da linha do fee tier compete visualmente com Continue (cosmética — dois CTAs próximos com pesos diferentes)
0,05% fee tier [Highest TVL] · ... · [More v]) o More está à direita, mesmo eixo horizontal do Continue rosa logo abaixo. Iniciante pode olhar pra direita esperando "ação" e bater em More, pensando que é o avançar — abre cards de fees em vez. Frustração mínima mas evitável.More pra esquerda quebra convenção (expansores ficam à direita); transformar em + Mostrar tiers (com cor explicitamente neutra) ajuda.More em texto link cinza com chevron, sem aspecto de botão. Trade-off: perde tap-area; ganho: diferenciação clara do CTA primário.🟡 Oportunidade competitiva — Sugestão de fee tier amarrada à estratégia que o user vai escolher no Step 2
Full range — fee 0,05%, Moderate — fee 0,3%, Tight — fee 1%). User escolhe estratégia; fee tier é consequência, não escolha primária. Quem quer override granular clica em "Custom fee tier" (escapatória pra avançado).Observação adicional — versão na URL vs querystring revela hierarquia de decisões. positions/create/v3 (rota) vs ?currency0=NATIVE¤cy1=... (querystring). Versão é rota porque muda qual contrato o user vai interagir (v4 router ≠ v3 router); par é querystring porque é só payload pro mesmo contrato. Detalhe arquitetural que Kotai deve herdar — o que muda o destino é rota; o que muda o payload é querystring. Tem implicação direta em deeplink, analytics, e cache.
Função: landing page do menu Pool no estado "user já tem posição populada" — esta é a tela que justifica o nome da pasta. Substitui o empty state (SuasPosicoes do flow anterior) por: card grande 0 UNI ("Rewards earned" + link "Find pools with UNI rewards") no topo, lista Your positions abaixo com 1 card de posição wTAO / WETH v2 0,3% in-range, e sidebar direita com Top pools by TVL + cards educativos. É a tela onde o LP volta pra gerenciar o que já aportou — não a pool detail isolada das telas 1–4, mas o dashboard de posições do user.
Componentes
Trade / Explore / Pool ✓ / Portfolio + search Search tokens, pools and wallets + endereço 0x20e4…801a.Find pools with UNI rewards → + caption "Eligible pools have token rewards so you can earn more" + CTA outline Collect rewards no canto direito.+ New + dropdowns secundários Status v / Protocol v + ícone group + ícone "…".wTAO / WETH + tags v2 + 0,3% + tag rosa Migrate to v4 →.Position.Fees.APR.X pra dispensar.Explore more pools →.Providing liquidity on different protocols, Hooks on v4) + link Learn more →.Regras de negócio
Migrate to v4 → — produto sinalizando ativamente que o user deveria migrar de v2 pra v4 (sem opção de dismissar visível).🟢 Insight 1 — Card de posição empacota 3 perguntas críticas em 1 linha de scan: "estou ganhando?", "estou in-range?", "vale a pena ainda?". Position ($9,828) + Fees ($1,142) + APR (40,06%) lado a lado respondem à pergunta "minha posição está performando?" em 2 segundos. Dot verde In range responde "preciso fazer algo?". Sparkline responde "está estável ou despencando?". Densidade alta sem virar cockpit — boa hierarquia tipográfica. Padrão a herdar pra Kotai: o card de posição é a unidade de cognição do LP — qualquer informação que não responda a uma das 4 perguntas (ganho, range, tendência, próxima ação) é peso morto.
🟢 Insight 2 — Tag Migrate to v4 → ancorada no card converte versão da pool em call-to-action. Produto não esconde que v2 é legado; sinaliza ativamente "esta posição pode performar melhor em v4". Decisão deliberada de produto: aceitar fricção curta de migração pra reduzir fragmentação de liquidez em versões antigas. Padrão a herdar — quando o produto evolui (v2 → v3 → v4), a presença das versões antigas no estado real do user é gancho ideal pra empurrar adoção da nova; sem isso, v4 cresce só com user novo.
🟢 Insight 3 — Sidebar direita com Top pools by TVL na mesma página de gerenciamento. Decisão de funil: enquanto o user gerencia o que tem, o produto sugere onde ele pode aportar mais. Sem ser intrusivo (sidebar, não modal). Padrão a herdar — upsell ambiente pra LP: a página de "ver minhas posições" é também a página de "descobrir próximas posições".
🟢 Insight 4 — Min/Max em par invertido (WETH/wTAO) é convenção de quote token, não erro. Decisão sutil — quando um par tem um token "âncora" (WETH em pares com altcoins), exibir preço em WETH é mais legível pra LP do que preço de WETH. wTAO custa 0,07–0,13 WETH é mais útil que dizer "0,07 a 0,13 WETH". Padrão a herdar — em pares heterogêneos, identificar quote token e usar consistentemente; em pares simétricos (ETH/USDC, BTC/USDC), USDC vira quote por convenção.
🔴 Fricção 1 — Card "0 UNI / Rewards earned" ocupa o slot prime acima das posições reais, mesmo quando vazio e inútil pra este user (estrutural — hierarquia invertida pra LP focado)
0 — i.e., o user não está ganhando UNI e a pool dele (wTAO/WETH v2) provavelmente nem é elegível ("Eligible pools have token rewards" implica que nem toda pool dá). Mesmo assim, o slot mais valioso da página (acima do fold, antes de "Your positions") é dedicado a um number zerado. O user que está aqui pra ver "como minha posição está indo" precisa pular esse card pra chegar ao que importa. Padrão typical de DeFi: rewards de token nativo do protocolo (UNI, CAKE, etc.) viram banner permanente — mesmo quando irrelevantes.= 0 perde o gancho de descoberta ("posso ganhar UNI?"); colapsar pra uma linha de aviso reduz CTR pra Find pools with UNI rewards.Your positions vira hero, e o card de rewards vira banner colapsado acima ou linha de "Você pode ganhar UNI em algumas pools — explorar →" no mesmo slot. Quando user já tem rewards acumulados (1 UNI+), o card volta a ocupar slot prime. Trade-off: lógica condicional mais complexa; ganho: alinhamento entre intenção do user (gerenciar) e hierarquia visual.🔴 Fricção 2 — + New como label do CTA primário é genérico demais pra ação de criar nova posição LP (cosmética — copy fraca em alto leverage)
+ New. Em contexto, significa "nova posição de liquidez". Mas o label nu não carrega esse sentido — em qualquer outro contexto (Notion, GitHub, Linear), "+ New" significa "novo item da entidade visível". Aqui o user precisa decodar contexto + label. Em outra parte do mesmo produto (CarteiraConectada #1), o CTA equivalente diz + Nova posição (PT-BR) ou + New position (EN). Aqui foi cortado pra + New — provavelmente por economia de largura no header da section.+ New position ocupa mais largura, conflita com Status v Protocol v no mesmo header.+ New position completo (cortar dropdowns secundários, ou movê-los pra ícone "filtro" único que abre painel lateral). Trade-off: Status e Protocol ficam atrás de mais 1 clique; ganho: CTA primário ganha clareza, e o header decongestiona.🔴 Fricção 3 — Caption "Some v3 positions aren't displayed automatically. Import V2 positions" admite uma falha de discovery sem explicar por quê (estrutural — produto confessando falha sem dar contexto)
Some v3 positions aren't displayed automatically) e oferece import de v2 (Import V2 positions). Mistura dois problemas: (a) algumas posições v3 não aparecem (sem dizer por quê — wallet diferente? bug? contract não indexado?) e (b) v2 precisa import manual (decisão de arquitetura — v2 não é varrido automaticamente). User iniciante lê isso e pensa "será que minha posição está completa?" — perde confiança no dashboard. Caption pequena no rodapé não compensa: a dúvida fica plantada.Import V2 positions vira botão secundário na linha do + New (ação afirmativa, não confissão). Trade-off: mais complexidade de estado; ganho: produto deixa de "se desculpar no rodapé" e oferece ação concreta.🟡 Oportunidade competitiva — Card de posição com "Health Score" agregando in-range + APR + impermanent loss em um único sinal
🟡 Oportunidade competitiva — Banner Migrate to v4 quantificado: "Migrando, você ganharia ~X% mais APR"
Migrate to v4 — mas sem quantificar o ganho. User vê "deveria migrar?" e fica sem âncora pra decidir. PancakeSwap idem com migração v2→v3. Custo cognitivo de migração (clicar, fechar posição, reabrir, gás, slippage) é certo; benefício é abstrato.Migrate to v4 expandida com mini-simulação — clicar abre popover com APR atual vs APR estimado v4, custo de gás, payback time. CTA "Migrar →" leva direto pro flow com a posição já configurada.Observação adicional — o flow PosicaoPopulada agora faz sentido com a Tela 5 visível. As Telas 1–4 (entrypoint, Liquidity, Active Tick, duplicata) eram pool detail vista por user sem posição neste pool específico (/pool/ETH-USDC). A Tela 5 é o hub de gerenciamento de posições do user em todas as pools (/pool raiz, ou /positions). Salto de URL implícito. As Telas 6–17 provavelmente são: criação nova (Etapas do flow Nova Posição vistas em sequência) + estados pós-confirmação. Ou seja, a pasta PosicaoPopulada é o flow completo de LP em um pool com posição pré-existente em outra pool — não só "user com posição populada". Vale renomear ou adicionar README descrevendo o que cada subgrupo de telas representa, alinhado com a sugestão de organização do canvas feita na Observação da Tela 3.

Função: user voltou pra tab Custom range e definiu range assimétrico. Chart agora mostra banda azul restrita ao range escolhido, com markers +124% no topo e -1,85% na base, identificando os bounds em % relativos ao preço atual. Denominação inverteu para USDC/WETH ($2.233,08 — leitura humana esperada). Section Price strategies completa abaixo com 4 cards: Stable / Wide / One-sided lower / One-sided upper, cada um com sub-microcopy explicando uso.
Componentes (diff em relação à Tela 10)
Custom range ✓ (voltou).Custom range allows you to concentrate...).2.233,08 USDC/WETH ($2.233,08) — denominação invertida (agora "USDC por WETH", leitura humana de $/ETH).USDC | ETH ✓ (mudou de USDC ✓ pra ETH ✓ — provavelmente clique do user; vide observação).+124% (label flutuante).-1,85% (label flutuante).Reset abaixo do chart.Price strategies com 4 cards completos:Stable "± 3 ticks" — "Good for stablecoins or low volatility pairs".Wide "-50% — +100%" — "Good for volatile pairs".One-sided lower "-50%" — "Supply liquidity if price goes down".One-sided upper "+100%" — "Supply liquidity if price goes up".Min price / Max price (inputs numéricos — começam a aparecer).Regras de negócio
+124% = se preço subir 124%, posição sai do range pelo topo; -1,85% = se preço cair 1,85%, sai pela base.-1,85% / +124%) tem semântica direcional — user aposta que preço vai subir, não cair. Capital fica concentrado pra cima do preço atual.Price strategies ganham segunda linha de microcopy nesta tela (não estava na Tela 10) — explicação por preset.Min price e Max price entram como inputs textuais conforme scroll — 3ª via de input além de drag-no-chart e preset.USDC | ETH foi invertido (vide Observação adicional).🟢 Insight 1 — Markers +124% / -1,85% em label flutuante sobre o chart é UX de finanças madura. TradingView faz igual em alerts; Robinhood faz em order brackets. User vê de cara "minha posição cobre essa faixa". Sem precisar ler eixo Y. Padrão a herdar pra Kotai — markers com number absoluto (não só relativo) ancoram a leitura.
🟢 Insight 2 — Microcopy de cada preset com "if price goes down / up" é direta e acionável. "Supply liquidity if price goes down" — frase curta que casa preset com hipótese de mercado. User com tese ("acho que ETH vai subir") encontra o preset alinhado. Padrão a herdar — preset deve falar a língua da tese, não da mecânica ("one-sided upper" é técnica; "if price goes up" é tese).
🟢 Insight 3 — 3 vias de input pra range (drag-no-chart + preset + min/max textual) atende perfis distintos. Drag = exploratório/visual; preset = decisão rápida; input = preciso/avançado. Decisão de produto inteligente: cada perfil tem caminho. Padrão a herdar — decisões críticas com múltiplas vias de input reduzem fricção sem inflar UI (vias coexistem na mesma página).
🟢 Insight 4 — Range assimétrico (-1,85% / +124%) é affordance honesta de "estratégia direcional". User pode expressar tese de mercado direto no range, não só "tight" vs "wide". Tipo de expressividade que v3 oferece e v2 não. Padrão a herdar — produto deve permitir input que reflete tese, não só parâmetros simétricos.
🔴 Fricção 1 — Range -1,85% / +124% é assimétrico e mal-balanceado, mas o chart não comenta (estrutural — produto aceita config subótima silenciosamente)
-1,85% / +124% é estranho. Bound inferior muito tight (1,85% — preço sai em horas em par volátil); bound superior muito largo (124% — preço dificilmente chega). Resultado: capital fica concentrado no canto inferior do range; se preço cair só 2%, sai do range; se preço subir, capital vira majoritariamente USDC (passou do preço de venda em quase todo o range). Provavelmente o user arrastou os marcadores no chart sem perceber a assimetria. Produto aceita sem comentário. Iniciante depositaria capital assim e perderia.🔴 Fricção 2 — Markers +124% / -1,85% mostram % relativa, mas o user pensa em preço absoluto ("ETH a $5K vs $4K") (estrutural — unidade de leitura desalinhada com mental model)
+124% em $2.233 ≈ $5.000. OK pra avançado, lento pra iniciante. Inputs Min price / Max price (logo abaixo) usam $ absoluto — então a mesma decisão tem 2 representações na mesma tela. User precisa traduzir entre elas, e erra.±X% é independente do preço — facilita comparar ranges entre pares); manter os 2 mostra duplicação.$, secundário em % (em letra menor). $5.000 (+124%) / $2.192 (-1,85%). Iniciante lê em $; avançado tem o % se quiser. Trade-off: mais texto no label; aceitar pela legibilidade.🔴 Fricção 3 — Stable preset "± 3 ticks" é jargão pesado pra iniciante (estrutural — convenção técnica vaza pra UI sem tradução)
0,01% em pools 0,01% fee). Iniciante não sabe. "Stable: ±3 ticks" lido literalmente é incompreensível. Em comparação, Wide: -50% — +100% usa % humano. Inconsistência de unidade entre presets.Stable: ±0,03% como label visível + tooltip "Equivalente a ±3 ticks (unidade mínima do pool)" pra quem investiga. Unidade % uniforme entre presets; tick fica como detalhe pra avançado. Trade-off: perde precisão técnica no label.🟡 Oportunidade competitiva — Slider de range com "thumbprint" mostrando volatilidade histórica + simulação probabilística
Probabilidade in-range (24h) + APR estimado + IL estimado em pior cenário. User explora ranges com âncora quantitativa, não estética. Combinado com Insight 4 (range assimétrico direcional), user vê "sua aposta em alta tem 35% de chance — APR 80% se acertar, IL 12% se errar".Observação adicional — toggle USDC | ETH foi invertido entre Tela 9 e Tela 11. Tela 9 mostrava USDC ✓ (preço em WETH/USDC, leitura "WETH por dólar"); Tela 11 mostra ETH ✓ (preço em USDC/WETH, leitura "$ por ETH"). User provavelmente clicou pra inverter — sinal de que o default da Tela 9 era contraintuitivo (fricção 1 da Tela 9 confirmada empiricamente neste flow). Vale registrar como evidência observacional da fricção — não é hipótese, o próprio user demonstrou que precisou trocar.

Função: carteira do user em visão consolidada — saldo total em fiat, ações principais (Enviar/Receber/Comprar), histórico de swaps e lista de tokens. Tela espelho do que mudou após criação da posição LP (Tela 9). Tela 10 mostra a posição como LP entity; Tela 11 mostra como saldo na carteira.
Componentes
0x486f...c800 + copy icon.Compartilhar + dropdown Todas as redes v.Visão geral ✓ / Tokens / NFTs / Atividade.1,53 US$ + delta menor abaixo 2,54 US$ (valor anterior — caiu pós-aporte).1 dia / 1 semana / 1 mês / 1 ano.Enviar ✈ / Receber ▾ / Comprar + / Mais ⋯.Swaps feitos nesta semana: 3 / 16,80 US$ (volume total).Atividade re... (truncado — provável "recente", 8 transações).Tokens com 1 token:2.938,80 US$ (preço) / +0,001 ETH (saldo) / 1,53 US$ (valor).Ver todos os tokens.Regras de negócio
1,53 US$ reflete somente tokens no Portfolio — não inclui valor depositado na posição LP ($11,72 na Tela 10).NFTs, não no tab Visão geral.2,54 US$ mostra que carteira tinha mais antes — saiu pra criar posição.+0,001 ETH é dust de gas remanescente em Base.🟢 Insight 1 — Tabs Visão geral / Tokens / NFTs / Atividade organizam holdings por tipo de objeto. User encontra o que procura pela natureza do ativo (ERC-20 vs ERC-721 vs histórico). Padrão a herdar pra Kotai — carteira deve organizar por tipo de ativo, não por blockchain.
🟢 Insight 2 — Delta anterior abaixo do big stat (2,54 US$ em cinza) materializa mudança no patrimônio. User vê de cara que saldo caiu — sem precisar abrir histórico. Padrão a herdar — métricas de patrimônio devem mostrar variação no display principal.
🟢 Insight 3 — Painel Enviar / Receber / Comprar / Mais agrupa as 4 ações universais de carteira. Sem necessidade de navegar pra outra tela. Padrão a herdar — ações de carteira são sempre 4-5; manter como chips diretos.
🟢 Insight 4 — Card Swaps feitos nesta semana: 3 / $16,80 ancoram comportamento, não saldo. Mostra ao user que ele é ativo, não só holder. Métrica social-positiva. Padrão a herdar — dashboard de carteira deve mostrar atividade, não só saldo estático.
🔴 Fricção 1 — Posição LP de $11,72 NÃO aparece no big stat 1,53 US$ — disconnect cognitivo crítico (estrutural — patrimônio real do user mascarado pelo Portfolio)
1,53 US$. Reação: pânico ("cadê meu dinheiro?"). Posição LP existe como NFT (Tela 10 confirma), mas não soma no big stat da Visão geral. User precisa trocar de aba (Pool/Suas posições) pra descobrir que o dinheiro está "lá". Iniciante não sabe que precisa fazer isso — pensa que foi roubado.Total: $13,25 (Tokens $1,53 + Posições LP $11,72). Toggle pra esconder LP se user preferir. Microcopy abaixo "Valor de LP é estimado pela cotação atual". Trade-off: exige cálculo + caveat; ganho: zero pânico + visão completa de patrimônio.🔴 Fricção 2 — Saldo +0,001 ETH é dust irrelevante exibido como holding principal (cosmética — único token na lista é dust de gas)
Base ETH com +0,001 ETH ($1,53). Isso é gas remanescente — não é "holding" do user, é troco. Iniciante olha e pensa "meu único asset é 0,001 ETH? Comprei algo errado". A lista de tokens não distingue entre holdings ativos e dust.Gas no token quando saldo < $5 e é nativo da chain + microcopy "saldo reservado para taxas de rede". Distingue dust de holding sem esconder. Trade-off: heurística simples; ganho: clarity.🔴 Fricção 3 — Atividade re... truncado no card lateral (cosmética — label crítico cortado)
+ Adicionar liq... da Tela 2. Iniciante não decoda; intermediário hover pra ver.Atividade (1 palavra) ou Recente: 8 tx (compacto + dado). Trade-off: perde "recente" como qualificador; ganho: zero truncamento.+ Adicionar liq... truncado" (Tela 2) — mesma raiz: labels não testados em container final.🟡 Oportunidade competitiva — Portfolio unificado que trata tokens, LPs, lending, staking e claims pendentes como uma única visão de patrimônio
Patrimônio: $13,25 (Tokens $1,53 / LPs $11,72 / Lending $0 / Pendente $0) direto no big stat.Todas as redes já é toggle aqui — boa base).Observação adicional — sequência Tela 10 (Suas posições, mostra $11,72 LP) → Tela 11 (Portfolio, mostra $1,53 tokens) é a melhor evidência empírica do problema de fragmentação de patrimônio em DeFi. Mesmo user, mesma carteira, mesmo dinheiro, 2 telas que não conversam. Iniciante sai de Tela 11 acreditando que perdeu $11. Vale congelar essas 2 telas como caso-âncora pra review de produto — todo flow de criação de holding deve ser seguido por visualização que agrega holding novo + saldo, não esconde a novidade em outra aba.

Todas as redes expandido (escopo global da página)Função: Dropdown do seletor de rede do header da página de portfólio (não da linha de filtros da tab). Define o escopo de rede que afeta toda a página — saldo, gráfico, tokens, NFTs, atividade. Escolha aqui filtra cross-tab. É o controle mais alto da hierarquia de filtros do portfólio.
Componentes
Todas as redes ▴ ativo no canto superior direito (ao lado de Compartilhar).Todas as redes ✓ (selecionado, check rosa)Ethereum (logo eth)Unichain (sun rosa-magenta — chain proprietária Uniswap)Base (logo azul)Arbitrum (logo azul escuro)Tempo (badge Novo rosa)Monad (logo)Solana (logo multicolor)Todos os tipos, Todo o período) permanecem visíveis e independentes.Regras de negócio
Ethereum filtra saldo, gráfico, tokens, NFTs e atividade simultaneamente.Novo em Tempo sinaliza rede recém-suportada (rotativa, vai sumir conforme a chain envelhece).🟢 Insight 1 — Solana como cidadã de primeira classe junto com EVM é decisão arquitetural correta. Diferente de produtos que tratam Solana como "chain bolted-on" em modal separado, aqui ela está no mesmo seletor. Multichain de verdade = agnóstica de VM. Padrão a herdar — não criar hierarquia de "EVM = primária, resto = secundária"; tratar redes pela relevância de uso, não pela família de VM.
🟢 Insight 2 — Badge Novo em Tempo comunica evolução sem inflar lista permanente. Sinalizador rotativo (vai sumir em ~3 meses, presumivelmente) destaca chain recém-suportada sem virar marcador permanente. Padrão a herdar — etiqueta temporal que vence sozinha evita debt de UI "tudo é novo o tempo todo".
🟢 Insight 3 — Unichain em 3º lugar (não 1º) demonstra restrição de cross-promo. Uniswap poderia ter colocado a própria chain como default — não colocou. Promoveu pra topo da lista (após Ethereum, antes das L2s mais usadas), mas sem virar comportamento agressivo. Decisão consciente. Padrão a herdar — promover produto proprietário com restrição, não como default-empurrado.
🔴 Fricção 1 — Escopo do filtro é ambíguo entre header e filtros internos da tab (estrutural — duas "camadas" de filtragem na mesma tela sem hierarquia explícita)
Compartilhar). A linha de filtros da tab Atividade está abaixo (Todos os tipos, Todo o período). Pra iniciante, dois "filtros" em locais visuais distintos da mesma página é confuso — "este filtra o que mesmo? só Atividade? saldo também? gráfico?". A semântica do escopo (global × local) não é óbvia visualmente. Quem troca rede aqui e depois muda de tab pode estranhar que a outra tab "está filtrada também".⊕ global). Quando uma rede específica está selecionada, banner discreto na página: "Mostrando apenas [Ethereum] — [Limpar filtro]". Trade-off: superfície adicional; ganho: zero ambiguidade sobre o que está filtrado.🔴 Fricção 2 — Label do botão fixo (Todas as redes) não reflete o estado selecionado (estrutural — feedback ausente sobre o filtro ativo)
Ethereum, o botão deveria refletir o estado — Ethereum ▾ com ícone da chain. Sem isso, user perde feedback do filtro ativo. Combinado com a Fricção 1 (escopo invisível), o user pode estar com Ethereum selecionado, ver a tab Tokens com poucos tokens, e concluir "minha wallet está pobre" quando na verdade só está filtrando.[ícone] Ethereum ▾. Pra Todas as redes, manter o estado atual. Trade-off: botão muda de largura conforme seleção; ganho: feedback contínuo do filtro ativo.🔴 Fricção 3 — Lista de redes sem indicação de quais o user usa de fato (estrutural — hierarquia plana entre 18+ redes)
Ethereum · $42. Trade-off: lógica condicional; ganho: scan mais rápido pra wallet ativa.🟡 Oportunidade competitiva — Seletor de rede com saldo inline + redes populares NÃO suportadas explícitas (alta leverage no target)
Receber criptos ("+17 redes" sem listar).Ethereum · $42 no topo + nota Avalanche: não suportada na lateral.$ inline), "Outras redes suportadas" (sem saldo do user mas suportadas, ordem padrão), "Não suportadas" (Avalanche, BSC se aplicável, com microcopy "em breve" ou "não suportada"). Família com 🟡 "+17 redes sem listar" do relatório 4 — mesma raiz: produto agrega redes sem ser transparente sobre escopo.Observação adicional: Unichain em 3º lugar (depois de Ethereum, antes de Base/Arbitrum) é decisão estratégica de Uniswap — promover a própria chain sem default-empurrar. Para Kotai, decisão análoga vai surgir quando/se houver chain proprietária ou parceira. Vale registrar princípio: ordem das redes no seletor é vetor de influência sobre escolha do user; pode ser organizada por liquidez, por uso, por estratégia — mas a decisão deve ser explícita, não default acidental.









Função: mesma view de Custom range da Tela 11, agora com chart zoom-out mostrando histórico mais longo (Jan 2025 → Apr 2026, ~16 meses). Banda azul do range custom permanece, mas a escala temporal mudou — user explora "como esse range performaria contra a história longa do par?". Reset aparece pra voltar à janela padrão. Section Price strategies permanece visível abaixo, e os inputs Min price / Max price aparecem mais consolidados no rodapé.
Componentes (diff em relação à Tela 11)
1Y ou All time (não visível claramente em resolução baixa, mas escala denuncia).Reset ativo no canto direito do toggle.Price strategies permanecem (provavelmente cortados ou colapsados pela captura).Regras de negócio
-1,85% / +124% da Tela 11.Reset provavelmente zera só o zoom, não o range — vide ambiguidade abaixo.🟢 Insight 1 — Zoom-out do chart permite contextualizar o range escolhido contra volatilidade histórica longa. Tela 11 mostrava 30 dias — range +124% parecia exagerado. Tela 12 mostra 16 meses — +124% parece razoável (ETH teve movimentos maiores). User troca janela, troca leitura. Padrão a herdar pra Kotai — zoom de chart deve ser tratado como mudança de hipótese temporal, não só estética.
🟢 Insight 2 — Banda do range relativamente menor no zoom-out comunica "minha aposta é localizada". Em 1M, banda ocupava 60% do chart; em 16M, ocupa 20%. Mensagem visual: "você apostou que o preço fica numa fração pequena da história". Sem texto. Padrão a herdar — quando feature carrega abstração geométrica (range vs história), zoom é a ferramenta de comparação.
🟢 Insight 3 — Reset permanece visível e pode reverter zoom ou range — affordance multipropósito. Decisão arquitetural: um botão Reset que serve múltiplos estados (zoom, range, denominação). Coerente desde que o user entenda o escopo. Padrão a herdar com cuidado: Reset multipropósito reduz buttons mas exige clareza de "o que vai ser resetado?".
🔴 Fricção 1 — Zoom-out cria ilusão de "meu range cobre a maioria dos preços históricos" mas a janela é arbitrária (estrutural — escolha de zoom ancora interpretação)
🔴 Fricção 2 — Ambiguidade do botão Reset em estado de zoom + range custom configurado (cosmética — affordance multipropósito sem clareza de escopo)
-1,85% / +124%) clica Reset. O que reseta? (a) Só o zoom (chart volta pra 1M, range preservado)? (b) Só o range (range volta ao default, zoom preservado)? (c) Ambos? Cada interpretação é defensável; nenhuma é óbvia.[Resetar zoom] / [Resetar range] / [Resetar tudo]. Sem modal, sem fricção pesada, com clareza de escopo. Trade-off: 1 clique a mais; ganho: zero perda acidental.🔴 Fricção 3 — Eixo X com datas absolutas (Jan 2025...) mas range em % relativo cria desencontro de leitura (estrutural — mistura de absolute vs relative na mesma visualização)
$ absoluto, direito % relativo. Banda é a mesma; user lê o eixo que prefere. Convenção universal de finance charting (TradingView, Bloomberg). Trade-off: mais espaço gráfico; ganho: tradução interna desaparece.🟡 Oportunidade competitiva — Backtest visual do range escolhido contra o histórico
Simular nesse histórico no chart — clica e o produto roda backtest do range escolhido contra a janela visível. Resultado em card lateral: fees acumulados, IL final, % in-range, número de reposicionamentos necessários. Permite o user testar várias configs antes de aportar.Observação adicional — diferença entre Tela 11 e Tela 12 é só zoom-out (não há decisão nova). Ambas mostram o mesmo range custom (-1,85% / +124%). Tela 12 é "Tela 11 com chart em zoom-out". Vale registrar pra organização do canvas: as duas telas documentam o mesmo estado mas em janelas visuais diferentes. Pra Kotai isso reforça a Observação Adicional da Tela 3 — capturas devem mapear estados (Step + tab + range configurado), não micro-interações de zoom a menos que a interação revele decisão nova. Sugestão: consolidar Tela 11 + Tela 12 em "Custom range configurado" com 2 sub-thumbnails (1M e All time), ou tratar Tela 12 como evidência empírica da Fricção 1 acima ("zoom-out muda leitura mesmo com range igual").





Função: Tab "Pools" da página do token. Lista todas as pools de liquidez que envolvem ETH, ordenadas por TVL decrescente (default). Cada linha mostra par, protocolo (v2/v3), tier de tarifa, TVL, % anual e volume.
Componentes
Regras de negócio
🟢 Insight 1 — TVL como ordenação default (escolha do top primeiro) Pra usuário que vai trocar ou prover liquidez, ordenar por TVL desc faz o usuário considerar primeiro pools profundas (menor slippage, menor risco de impermanent loss extremo). Padrão a herdar pra Kotai — quando listas têm múltiplas métricas, escolher ordenação default que protege o iniciante (segurança > rendimento alto) é regra.
^insight-1
🟢 Insight 2 — múltiplas pools do mesmo par expostas (transparência v3) Em vez de mostrar "ETH/USDC" como linha única, a tabela mostra cada pool (cada tier de tarifa = pool distinta em v3). Padrão a herdar — quando o protocolo permite fragmentação, expor cada instância em vez de agregar mascara dá ao usuário avançado a verdade da estrutura on-chain. Trade-off: pode confundir iniciante ("por que 3 USDC?").
^insight-2
🟢 Insight 3 — protocolo (v2/v3) visível como coluna Pra usuário que entende AMMs, saber se a pool é v2 (curva constante) ou v3 (liquidez concentrada) muda interpretação de TVL e APR. Padrão a herdar — quando há variações de protocolo com semânticas diferentes (v2/v3/v4 hook), expor a versão como coluna evita comparação maçã-com-laranja.
^insight-3
🔴 Fricção 1 (estrutural — ETH/TTPA como #1 TVL é red flag de scam/farming inflado) A pool ETH/TTPA aparece em primeiro lugar com 4,4 mM US$ de TVL — múltiplas ordens de grandeza acima das pools "reais" (ETH/USDC, ETH/USDT, WBTC/ETH). TTPA não é um token mainstream conhecido. Combinações suspeitas: TVL gigante + APR 0,02% (incomum pra par desconhecido) + ausência de volume comparável.
Hipóteses: (a) farming pool com bribes que inflam TVL artificialmente; (b) pool com pricing manipulado (oracle attack); (c) token velho/abandonado com TVL "preso". Em qualquer caso, expor TTPA como #1 da lista pra usuário iniciante que confia na ordenação por TVL é potencial armadilha.
Pior: a Uniswap delega a curadoria pro mercado (ordenação puramente por número), e o iniciante interpreta "primeiro = mais confiável" — exatamente a mesma armadilha do modal "Tokens por volume 24h" (vide Swap #4 — fricção 1, "Binance Bridged USDT" como #1).
Direcionamento Kotai: aplicar mesma proposta do Swap #4 — ordenação default "pools verificadas" (pares com tokens canônicos, TVL > threshold, idade mínima da pool) + opção "ver todas" como modo expert. Selo de verificação inline ("✓ pool canônica" ou "⚠ token não verificado"). Trade-off: curadoria contínua dos critérios; risco de excluir pool legítima emergente. Vantagem: target iniciante valoriza proteção acima de descoberta.
^friccao-1
🔴 Fricção 2 (estrutural — APR sem método de cálculo nem janela temporal) "% anual do pool" varia de 0,00% a 86,25% sem tooltip explicando metodologia. APR de 86,25% em ETH/USDC 0,3% é fantasia — provavelmente cálculo de "fees coletadas nos últimos 7 dias × 52", sem incluir impermanent loss, sem ajuste de risco. Iniciante vê "86%" e pensa "vou ganhar 86% ao ano provendo liquidez aqui" — abstração perigosa.
Por que solução óbvia falha: mostrar APR realista exige cálculo histórico complexo (volume médio + IL backtested + fee tier); usar APR otimista é prática da indústria.
Direcionamento Kotai: nome explícito ("APR estimado · últimos 7 dias × 52") + ícone (i) com tooltip detalhando ("Não considera impermanent loss. Veja a aba 'Projeção realista' antes de prover liquidez."). Trade-off: mais texto; mas converte ilusão em estimativa honesta. Para target iniciante, considerar omitir APR da tabela primária — mostrar só em página de pool individual.
^friccao-2
🔴 Fricção 3 (cosmética — múltiplos "ETH/USDC" sem hint de qual escolher) ETH/USDC aparece 3x nas posições #3, #5, #8 com tiers 0,3% / 0,05% / 0,05%. Sem orientação, iniciante pensa "qual ETH/USDC eu uso?". O critério correto depende do tipo de trade (operações pequenas → 0,05%; operações grandes ou pares voláteis → 0,3%) — conhecimento técnico que iniciante não tem.
Direcionamento Kotai: ao listar pools duplicadas, agrupar com label "ETH/USDC (3 pools)" expandível, ou rotular cada linha com hint contextual ("ETH/USDC · 0,05% · ideal pra swaps até US$50K"). Trade-off: mais texto inline; mas converte fragmentação confusa em escolha guiada.
^friccao-3
Função: Vista após scroll pra baixo do gráfico. Combina três blocos consecutivos: grid de estatísticas detalhadas (TVL, Valor de mercado, FDV, Volume 1d, Máxima/Mínima 52 semanas), bloco "Sobre" (descrição textual) com botões pra recursos externos (Explorer/Site/Twitter), e início da tabela de Transações em estado de loading.
Componentes
Regras de negócio
🟢 Insight 1 — métricas de equity research aplicadas a token (52w high/low) Máxima/Mínima 52 semanas é métrica clássica de análise de ações tradicional — usar em página de token cripto sinaliza maturidade do produto. Padrão a herdar — quando o usuário-alvo inclui pessoas vindas de mercado tradicional (TradFi → DeFi), reutilizar vocabulário e métricas conhecidas reduz curva de aprendizado. Trade-off: cripto-native pode achar "demasiado equity"; mas pra target iniciante é familiarização.
^insight-1
🟢 Insight 2 — links externos como "trust signal" (verificabilidade) Botões pra Explorer (Etherscan), Site oficial e Twitter dão ao usuário forma de auditar fora do app. Padrão a herdar — quando o produto exibe metadata de token, sempre oferecer ponte pra fontes externas verificáveis. Reduz "fé cega na Uniswap" e converte ceticismo em confiança.
^insight-2
🟢 Insight 3 — grid 3×2 com hierarquia visual consistente Cada métrica tem rótulo pequeno em cima + valor grande em baixo, todas alinhadas. Escaneabilidade alta — usuário lê 6 números em segundos. Padrão a herdar pra qualquer tela de "ficha de entidade" (token, pool, wallet).
^insight-3
🔴 Fricção 1 (estrutural — descrição "Sobre" inteiramente em inglês) Toda a descrição em inglês — em UI declaradamente PT-BR ("Estatísticas", "Mostrar mais", "Volume de um dia", "Máxima em 52 semanas"). Fricção massiva: o maior bloco textual da página é o único não-traduzido. Pra usuário monolíngue (a maioria do target Kotai BR), a página inteira fala português EXCETO a parte mais informativa sobre o que o token é.
Padrão sistêmico de i18n já mapeado em:
O padrão indica que conteúdo gerado/curado (descrições de tokens, listas dinâmicas, strings interpoladas) escapa do pipeline de i18n. Strings de UI estática estão traduzidas; conteúdo dinâmico não.
Direcionamento Kotai: política dupla — strings de UI no arquivo de translations (lint impede regressão); conteúdo curado de tokens via tabela traduzida (CMS-driven com fallback pro inglês quando tradução não existir + flag visual "tradução pendente"). Trade-off: backlog de tradução de descrições; mas elimina o "página fala português até a descrição mais importante". Aplicar consistentemente em qualquer página com conteúdo curado (tokens, pools, protocols, NFTs).
^friccao-1
🔴 Fricção 2 (estrutural — "Carregando" + "Nenhum encontrado" simultâneos = UX contradition) Spinner "Carregando" + texto "Nenhum encontrado" aparecem ao mesmo tempo no corpo da tabela. Os dois estados são logicamente exclusivos: ou está carregando (esperar) ou não encontrou nada (estado terminal). Mostrar ambos faz o usuário ler duas mensagens contraditórias.
Causa provável: o componente da tabela renderiza o "empty state" como default antes do fetch retornar, sem suprimir o conteúdo enquanto o spinner está ativo. Bug de race condition no estado da UI.
Direcionamento Kotai: estados mutuamente exclusivos. (a) Loading inicial: apenas spinner, sem mensagem de "vazio". (b) Loading completo + dados: tabela populada. (c) Loading completo + zero dados: apenas mensagem "Nenhuma transação encontrada", sem spinner. Trade-off: lógica condicional no componente; mas elimina a contradição visual. Aplicar como padrão a qualquer lista com fetch async.
^friccao-2
🔴 Fricção 3 (estrutural — 6 métricas no grid, mas sem priorização TVL, Valor de mercado, FDV, Volume 1d, Max 52w, Min 52w — todas com mesmo peso visual. Pra iniciante, é igualmente importante TVL e FDV? Provavelmente não — TVL informa segurança de swap; FDV é métrica de avaliação que iniciante não usa.
Pra usuário avançado, contextualizar: FDV ≈ Valor de mercado (284,6 mM cada) significa "100% do supply em circulação" — informação valiosa, mas oculta pelo paralelismo visual com as outras métricas. Iniciante vê "284,6 mM = 284,6 mM" e pensa "é a mesma coisa repetida".
Direcionamento Kotai: hierarquia visual por relevância pra target. Iniciante: priorizar TVL (segurança), Volume 1d (atividade), Max/Min 52w (range histórico). Avançado: expor FDV em segundo plano ou seção colapsável "Métricas avançadas". Tooltip de comparação FDV vs Market Cap. Trade-off: design system mais condicional; mas elimina "6 números iguais que valem coisas diferentes".
^friccao-3
🟡 Oportunidade competitiva (média leverage — tradução de conteúdo curado) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch, Jupiter — todos têm descrições de tokens em inglês mesmo na UI traduzida. (2) ✓ Afeta iniciante diretamente — descrição é o primeiro lugar onde ele vai pra entender "que token é esse". (3) ✓ Razão de ninguém resolver: descrições curadas exigem CMS traduzido e manutenção contínua; agregação de fontes (CoinGecko/CMC) entrega só em EN. (4) ✓ Diferença perceptível — usuário sente quando o app fala 100% português, não 95%.
Diferenciação Kotai: descrição curada PT-BR-first com tradução IA + revisão humana pros top 200 tokens; fallback automático pra EN com tag visual "tradução em curso" pros demais. Trade-off: operação de curadoria contínua; mas converte fricção sistêmica em vantagem percebida no target BR.
^oportunidade-1




Função: Estado terminal da tabela de Transações depois do fetch concluído sem retornar registros — exibe apenas "Nenhum dado encontrado" abaixo do cabeçalho da tabela. Compare com VT16 (loading state com spinner + empty simultâneos = race condition).
Componentes
Regras de negócio
🟢 Insight 1 — empty state sem spinner é melhor que loading + empty simultâneos (VT16) Comparado com VT16 (onde spinner e "Nenhum encontrado" apareciam sobrepostos), VT17 mostra apenas a mensagem terminal. Padrão correto — estados loading e empty terminal são mutuamente exclusivos. VT17 corrige o bug visual de VT16. Padrão a herdar pra Kotai — quando o fetch termina, suprimir completamente UI de loading e exibir só o estado final.
^insight-1
🔴 Fricção 1 (estrutural — empty state semanticamente impossível dado o resto da página) Estatísticas mostram Volume de um dia: 778,6 M US$ — que significa centenas de milhões de dólares em swaps de ETH nas últimas 24h. A tabela de Transações estar vazia é literalmente impossível: tem que haver milhares de transações pra produzir 778 M de volume.
Hipóteses do que está acontecendo:
Pra usuário, a contradição visual ("778 M de volume mas zero transações") quebra confiança na página inteira. Se ele não pode confiar na tabela, vai duvidar das estatísticas também.
Direcionamento Kotai: detectar inconsistência interna entre blocos (volume > 0 + tabela vazia = error state) e exibir mensagem honesta: "Não conseguimos carregar as transações no momento. As estatísticas acima vêm de outra fonte e estão atualizadas." + botão "Tentar novamente". Trade-off: precisa lógica de cross-check entre fontes de dados; mas elimina a contradição que erode confiança em todo o produto.
^friccao-1
🔴 Fricção 2 (estrutural — "Nenhum dado encontrado" sem ação de recuperação) Mensagem é puramente declarativa. Usuário não tem como:
Pra iniciante, "Nenhum dado encontrado" parece estado normal/esperado — ele aceita e segue, perdendo informação relevante. Pra avançado, é frustração silenciosa.
Direcionamento Kotai: empty states sempre acompanhados de uma ação útil. Se for empty legítimo: "Não há transações no período selecionado. Tente expandir o intervalo." + botão "Mudar período". Se for erro suspeito: "Não conseguimos carregar agora. Tentar novamente" + link "Reportar problema". Trade-off: lógica adicional de detecção; mas elimina o cul-de-sac.
^friccao-2
🔴 Fricção 3 (cosmética — "Nenhum dado encontrado" é tradução literal sem voz A frase é tecnicamente correta mas robotizada. Diferente do "Sobre" em inglês (fricção pesada no VT16), aqui o problema é menor: a tradução existe, mas a voz é genérica. Compare com microcopy editorial ("Por enquanto, nada por aqui...").
Direcionamento Kotai: empty states com voz consistente com a marca. Para iniciantes: linguagem amigável que reduz ansiedade ("Sem registros pra mostrar agora — isso é raro pra ETH. Tente recarregar?"). Trade-off: editorial requer revisão tonal; mas converte mensagem técnica fria em parte da experiência.
^friccao-3
Função: Vista da página com a tabela de Transações populada (10+ linhas visíveis) mostrando feed live de swaps. Note importante: todas as transações visíveis são "Vender" (vermelho) — sinal de pressão direcional de venda no período. Big stat do gráfico mudou pra ▲ 31,65 US$ (1,36%) com timeframe 1D — snapshot temporal diferente das outras telas (que estavam em 1W com +3,22%).
Componentes
Regras de negócio
🟢 Insight 1 — pressão direcional visível pelo monocromatismo da coluna Tipo Todas as linhas em vermelho ("Vender") é leitura imediata: "alguém está vendendo ETH agora". Padrão a herdar — quando o feed tem direcionalidade dominante, a saturação de cor numa coluna comunica isso sem precisar agregar estatisticamente. Olho lê padrão em milissegundos. Trade-off: amostra pequena (10 linhas) pode dar falsa pista; usuário avançado vai querer agregação (% buy vs % sell na janela).
^insight-1
🟢 Insight 2 — magnitudes variadas confirmam diversidade do feed (não bot único) Valores mistos (US$ 0,000001 até US$ 349,50) sugerem fluxo orgânico de muitas carteiras distintas, não atividade artificial. Padrão a herdar — diversidade de magnitude é trust signal de "feed real, não inflado".
^insight-2
🟢 Insight 3 — atualização live transmite "mercado vivo" (mesma observação de VT14) Reforça insight do VT14 — feed live é diferencial. Aqui consolida que a página é destino legítimo pra "ver o que está acontecendo agora", não só pra fazer trade.
^insight-3
🔴 Fricção 1 (estrutural — semântica de "$ETH" como header ambígua entre preço e quantidade) Header da coluna "$ETH" pode ser lido como:
O símbolo "$" sugere "valor monetário" — mas a coluna mostra quantidades de qualquer token (não só ETH), incluindo magnitudes claramente não-ETH (21,77 M, 135,76 M). O nome "$ETH" como header não comunica essa heterogeneidade.
Direcionamento Kotai: rotular como "Quantidade" ou "Token de origem" (com sub-coluna pra quantidade + símbolo do token). Manter $ apenas em colunas que são realmente em USD. Trade-off: header mais longo; mas elimina três leituras possíveis de uma label.
^friccao-1
🔴 Fricção 2 (estrutural — "Vender" semântica relativa ao ETH oculta a real operação) Fricção já apontada em VT14, mas confirmada aqui com dados reais. Linha "Vender · 0,447 · <0,01 ETH · 0,000121 US$" significa: a carteira 0xe469…e32e trocou 0,447 de algum token por <0,01 ETH. Pra Uniswap, isso é "venda" relativo ao token de origem (ETH foi recebido = ETH "comprou" do par). Mas pra perspectiva de quem fez o swap, ele comprou ETH (entrada de ETH na carteira).
Pior: o token de origem nem aparece na linha — coluna "$ETH" mostra "0,447" sem indicar de qual token. Iniciante não consegue interpretar o que aconteceu.
Direcionamento Kotai: tornar cada linha de swap auto-explicativa — "0xe469 trocou 0,447 [TOKEN] por <0,01 ETH". Microcopy alternativa: "Comprou ETH com [TOKEN]". Trade-off: linhas mais largas (precisa nome ou ícone do token origem); mas elimina o "vender o quê?".
^friccao-2
🔴 Fricção 3 (estrutural — valores "<0,001" e "0,000001 US$" são dust trades sem flag Várias linhas com valor abaixo de centavo (0,000001 US$ = 1 μUSD; 0,000121 US$ = 0,01 centavo). Isto é "dust" — transações de valor irrisório frequentemente usadas pra: (a) testes de contratos, (b) wash trading, (c) ataques de dust (rastreamento de wallets), (d) erros de slippage extremo.
Mostrar dust no feed sem flag visual mistura sinal com ruído. Pra usuário tentando interpretar "o que está acontecendo com ETH", linhas de 0,000001 US$ poluem a leitura.
Direcionamento Kotai: filtro padrão "ocultar transações <$1" (toggleável); ou agrupar dust em linha agregada ("12 dust trades nos últimos 30s"). Trade-off: oculta sinal pra avançado (que talvez queira ver dust como sinal de wash); manter toggle "ver tudo". Padrão sistêmico — feeds devem ter threshold de relevância configurável.
^friccao-3
🔴 Fricção 4 (cosmética — endereços encurtados sem hover-to-expand ou resolução ENS)
Endereços tipo "0xFd1B…8340" são genéricos — usuário não consegue distinguir wallet de whale vs wallet random. ENS names (vitalik.eth, whale.eth) seriam infinitamente mais legíveis. Hover deveria expandir pra endereço completo ou resolver ENS reverso.
Direcionamento Kotai: pipeline de resolução ENS reverso (server-side) cached por wallet; quando ENS existe, mostrar nome em vez de hash. Hover sempre revela endereço completo. Trade-off: latência adicional no fetch; mas converte string opaca em identidade legível. Pra target BR, é útil porque maioria das carteiras não tem ENS — mas a infra para quando existir vale a pena.
Observação estrutural — flow VT completo mapeado (1–18) Fim do flow Visualizar Token. Padrões consolidados ao longo dos 18 estados:
^friccao-4

Função: Popover ancorado no ícone ⚙️ da tab Vender (que serve às demais tabs também) — controles globais do swap dentro do widget. Espelha exatamente o painel de settings do Swap #8 standalone.
Componentes
Regras de negócio
🟢 Insight 1 — controles globais do swap consolidados num só popover Slippage, deadline e fontes de rota num único menu evita "settings dispersos pela UI". Padrão a herdar — quando há múltiplos parâmetros técnicos opcionais, agrupá-los em um painel único com nomes legíveis é melhor que espalhar como modais separados ou enterrados em "advanced".
^insight-1
🟢 Insight 2 — "Auto" como default reduz risco pro iniciante Slippage manual mal-configurado é causa #1 de transações revertidas (slippage baixo) ou MEV-sandwich (slippage alto). "Auto" elimina essa decisão pro iniciante. Padrão a herdar — defaults inteligentes pra controles técnicos onde o iniciante não tem mental model.
^insight-2
🟢 Insight 3 — reutilização exata do painel entre widget standalone e embedded
O painel aqui é estruturalmente idêntico ao Swap #8 (widget standalone /swap). Reaproveitamento total do componente — usuário aprende uma vez e usa em qualquer contexto. Padrão a herdar pra Kotai — quando o widget é embedded em múltiplas páginas, panel de settings deve ser literalmente o mesmo componente.
^insight-3
🔴 Fricção 1 (estrutural — i18n bug "30 minutes" se repete) "30 minutes" em inglês dentro de UI em português. Mesmo bug já mapeado em:
Padrão sistêmico de falha de i18n. O fato de repetir em 4+ lugares indica que não é typo isolado — é gap no pipeline de tradução. Provavelmente strings dinâmicas (computadas em runtime com ${minutes} minutes) escaparam dos arquivos de translation.
Direcionamento Kotai: já proposto em Ordem-limite #5 — pipeline de i18n com lint que falha build se string PT-BR contém >3 palavras EN consecutivas. Adicionar testes de snapshot em modo PT-BR pra cada estado de UI. Trade-off: false positives em termos técnicos legítimos (whitelist resolve).
Perfil afetado: iniciante BR (principal — quebra confiança no produto traduzido). Intermediário tolera; avançado ignora.
^friccao-1
🟡 Oportunidade competitiva — Slippage com sinal visual de risco (não apenas número neutro)
^oportunidade-1
🔴 Fricção 3 (cosmética — "Opções de negociação > Padrão" é rótulo vago) Mesmo problema já apontado em Swap #9 e Swap #13: "Padrão" como rótulo da seleção atual não diz o que é o padrão (UniswapX? rota interna? terceiros?). Aqui dentro do popover de settings, o problema persiste — usuário vê "Padrão >" e não sabe o que vai encontrar ao clicar.
Direcionamento Kotai: rótulo descritivo ("Padrão · UniswapX + agregadores") em vez de "Padrão" isolado. Trade-off: mais texto na linha; mas elimina o "clico pra descobrir". Conectado com a recomendação geral de Swap #13 (tornar microcopy de "Padrão" auto-explicativa em qualquer lugar onde aparece).
Perfil afetado: intermediário (principal — explora settings querendo entender). Iniciante não abre settings; avançado já sabe.
Observação estrutural — VT9–VT12 são overlays ancorados ao header da página
Família coerente de popovers — cada um tem trigger visível e abre conteúdo contextual sem navegar. Padrão a herdar pra Kotai: usar popovers ancorados pra "ações secundárias da página" (settings, share, filtro, denúncia) em vez de páginas próprias, modais cheios, ou menus globais.
^friccao-2


Função: Tabela de transações on-chain do ETH (feed live de swaps de qualquer carteira na rede) com popover de filtro aberto sobre a coluna "Tipo". Permite isolar fluxo de Comprar ou Vender pra leitura de pressão direcional.
Componentes
Regras de negócio
🟢 Insight 1 — feed live de transações como sinal de mercado público Mostrar swaps reais em tempo real ("22s atrás, alguém vendeu 0,447 ETH por 0,001 USD em outro token") cria sensação de "mercado vivo" e dá ao usuário avançado pista de fluxo (whales comprando? venda em pânico?). Padrão a herdar — feed live de atividade é diferencial vs corretora tradicional que esconde order book individual. Trade-off: na BR, exibir endereços de outras carteiras pode entrar em zona cinza de privacidade (LGPD não cobre wallets pseudonimas, mas convém disclaimer).
^insight-1
🟢 Insight 2 — filtro sem submit (atualização imediata) Toggle Comprar/Vender muda a tabela na hora, sem botão "Aplicar". Padrão a herdar — pra filtros de baixa cardinalidade (booleanos, pequenas listas), atualização imediata é melhor que paradigma submit. Reduz cliques e a sensação de "fricção de formulário".
^insight-2
🟢 Insight 3 — semântica visual de cor coerente com mercado financeiro Verde pra compra, vermelho pra venda — convenção que o usuário traz do mundo tradicional. Padrão correto, mas requer cuidado em mercados asiáticos (China inverte: vermelho = compra/alta). Pra Kotai com foco BR, mantém convenção ocidental.
^insight-3
🔴 Fricção 1 (estrutural — "Comprar/Vender" perspectiva ambígua: do trader ou do token?) "Comprar" e "Vender" são relativos a quem? Pra um usuário que vê o swap "alguém trocou 0,1 ETH por USDC", isso pode ser lido como (a) "compra de USDC" (perspectiva do trader, "essa pessoa comprou USDC") ou (b) "venda de ETH" (perspectiva do token da página, "ETH está sendo vendido"). Como a página é do ETH, a convenção provável é (b) — Comprar = swap onde alguém comprou ETH; Vender = swap onde alguém vendeu ETH. Mas isso não é explicitamente comunicado.
Iniciante vê "Vender 0,016 ETH → 38,39 USDC" e pode pensar "esse cara comprou USDC, por que isso é Vender?". A perspectiva é do ETH (token da página), não do trader.
Direcionamento Kotai: microcopy do header da coluna: "Tipo (de ETH)" ou tooltip "Compras/Vendas de ETH neste swap". Trade-off: mais texto no header; mas elimina a leitura espelhada. Aplicar consistentemente em qualquer página com tipo direcional.
^friccao-1
🔴 Fricção 2 (estrutural — filtro só com 2 opções é "decoração" de UX) Toggle apenas com Comprar/Vender, ambos default ativos = filtro só serve se o usuário desligar um. Pra leitura útil, o filtro precisa de mais dimensões: filtrar por tamanho ("> $10K"), por par específico ("apenas swaps pra USDC"), por carteira ("apenas whales seguidas"), por janela temporal.
Direcionamento Kotai: expandir filtro pra multi-coluna — popover com seções (Tipo, Valor mínimo, Par de destino, Janela). Trade-off: popover mais denso; mas converte filtro decorativo em ferramenta de análise. Pra iniciante manter Tipo simples como default; opções avançadas atrás de "Filtros avançados".
^friccao-2
🔴 Fricção 3 (cosmética — horário relativo "22s" sem contexto absoluto) "22s" é útil pra "agora mesmo" mas vira ambíguo conforme a sessão envelhece — após 5 minutos olhando a tela, "22s" ainda significa "22s atrás do refresh" ou "22s atrás de quando carreguei a página"? Sem timestamp absoluto disponível (nem em hover), o usuário não consegue cruzar com outros eventos ("essa transação foi antes ou depois da última vela de candle").
Direcionamento Kotai: horário relativo como default + hover/tooltip com timestamp absoluto ("12 de maio de 2026, 14:38:22 UTC-3"). Trade-off: instrumentação de tooltips em cada célula; mas é padrão da indústria financeira (sem o cruzamento temporal, dado vira anedótico).
^friccao-3


O fluxo Carteira Conectada da Uniswap é forte em intenção: reconhece estados reais do usuário conectado, oferece caminhos para adicionar fundos, organiza preferências em camadas, separa carteiras por cadeia e usa confirmações em ações sensíveis. A experiência protege o usuário contra riscos comuns, como tokens desconhecidos, atividades denunciadas e medo de perda da seed phrase.
A fragilidade recorrente está menos na ausência de controles e mais na baixa auditabilidade do que cada controle faz. Em filtros, limpezas, testnet, funding e multi-wallet, o usuário recebe sinais úteis, mas precisa inferir escopo, consequência, rede, identidade ativa ou próximo passo. Para iniciantes, isso transforma uma interface limpa em uma sequência de decisões tecnicamente ambíguas. Para intermediários, reduz confiança porque não explicita critérios, compatibilidade e estado operacional.
Proteção por padrão reduz risco antes do usuário dominar o modelo cripto.
A Uniswap acerta ao ligar proteções por default, como ocultar pequenos saldos, tokens desconhecidos e atividade denunciada em filtros de segurança. O mesmo raciocínio aparece nas confirmações de limpeza, especialmente quando a interface declara que a frase de recuperação NÃO será removida e repete esse cuidado em limpar todos os dados. O produto entende ansiedades cripto reais e tenta protegê-las antes que virem erro irreversível.
O fluxo transforma bloqueios em próximos passos práticos.
O estado de saldo zero não fica morto: Adicionar fundos para fazer swap propõe uma ação útil. A tela de recebimento também reconhece jobs concretos, como receber por carteira ou conta em receber criptos, e o lote de funding amplia esse caminho com Coinbase em trazer fundos. Mesmo quando incompleto, o produto tenta guiar a primeira movimentação em vez de apenas exibir uma carteira vazia.
Feedback persistente e granularidade operacional são boas bases para confiança.
Separar cache, preferências, histórico e wipe completo em limpezas granulares é um bom padrão: reduz a chance de resolver pequenos problemas com ações grandes demais. O feedback inline pós-limpeza em estado pós-limpeza também é melhor que um toast efêmero, porque mantém a confirmação no lugar onde a decisão foi tomada.
A arquitetura multi-wallet por cadeia antecipa uso cross-chain real.
Mostrar EVM e Solana simultaneamente em multi-wallet por cadeia e popover multi-wallet é uma premissa forte. Ela reduz troca mental entre ecossistemas e prepara o produto para operações cross-chain, desde que a interface deixe claro qual identidade assina, recebe ou será desconectada.
Escopo crítico fica fora do ponto exato de decisão.
A recorrência mais ampla é a distância entre ação e escopo. Em tokens desconhecidos, o filtro protege, mas não explica que regra oculta ativos. Em Limpar dados, Limpar preferências, limpar cache e limpar todos os dados, o CTA e a copy não diferenciam suficientemente o que será apagado, recomposto ou preservado. O efeito é hesitação: o usuário sabe que há confirmação, mas não sabe auditar a consequência.
Direção para Kotai: colocar escopo no próprio controle final, com CTA específico, resumo curto e lista/contador quando houver ocultação, limpeza ou bloqueio. O ganho de confiança compensa a pequena perda de minimalismo.
A hierarquia visual não acompanha severidade de risco.
A ação mais destrutiva ganha peso demais em Limpar todos os dados, enquanto cache e wipe completo recebem gramática semelhante em limpar cache e wipe completo. Isso nivela riscos diferentes e dessensibiliza o usuário aos avisos. A mesma lógica aparece no dropdown de sessão em trocar carteiras e desconectar, onde ações de identidade e encerramento de sessão têm peso próximo.
Direção para Kotai: criar escala de risco. Ações leves podem ter confirmação simples; ações destrutivas devem usar variante visual própria, copy específica e fricção deliberada. Ações de sessão devem ser separadas de troca de carteira.
Estados pós-ação não fecham o ciclo operacional.
Depois de ações, a UI informa, mas nem sempre responde “o que aconteceu, onde estou e o que posso fazer agora”. Em feedback pós-limpeza, falta sinal inequívoco de conclusão. Em modal de testnet, a explicação vem depois da ativação e não oferece saída direta. Em estado testnet, o banner avisa o modo, mas o próximo passo real, pegar tokens de teste, não ganha prioridade.
Direção para Kotai: usar estados verbais e ações explícitas, como “Limpo agora”, “Sair do modo testnet”, “Continuar em testnet” e “Pegar tokens de teste”.
A interface ainda usa identificadores e famílias técnicas antes do modelo mental humano.
Em Receber criptos versus Transferência, o iniciante precisa distinguir carteira de exchange cedo demais. Em receber por endereço, a carteira aparece pelo endereço e por “Ethereum + 17 redes” antes de um nome reconhecível. A mesma compressão reaparece em seleção de rede e Endereço de Ethereum vs 18 redes, onde “Ethereum” pode significar mainnet, família EVM ou endereço compatível.
Direção para Kotai: nome humano primeiro, identificador técnico depois. Para redes, diferenciar “rede”, “família EVM” e “endereço compatível”, com recomendação, custo/tempo e exemplos concretos.
Handoffs externos prometem jornada guiada, mas deixam lacunas de continuidade.
O funding via Coinbase resolve parcialmente o job de trazer fundos, mas é estreito para público BR em integração só com Coinbase e perde rastreabilidade após abrir sistema externo em handoff sem status persistente. O usuário continua precisando saber rede, destino, confirmação de chegada e recuperação caso popup ou saque falhem.
Direção para Kotai: tratar funding externo como jornada operacional rastreável, não apenas link de saída. Isso inclui destino confirmado, rede recomendada, status persistente, confirmação de chegada e recuperação quando o provedor externo falha ou fecha.
Onboarding de funding CEX → wallet localizado para o mercado brasileiro.
A combinação de integração com exchanges BR e rede com custo/tempo recomendado aponta uma direção estratégica relevante para Kotai: reduzir o primeiro depósito DeFi com seleção de CEX local, instruções específicas, endereço correto, rede recomendada, taxa/tempo estimados, status de depósito e confirmação de chegada.
Esta tese não deve ser promovida como 🟡 oportunidade competitiva validada pela régua, porque o consolidado não demonstra que todos os concorrentes principais fazem igual; pelo contrário, o caso sugere uma lacuna em DEX globais. Ela permanece como direção de produto forte para onboarding financeiro assistido, mas depende de parcerias, compliance, disponibilidade regional e suporte operacional para virar aposta competitiva comprovada.
Permitir análise ligado por padrão sem explicar coleta é fricção relevante de confiança, mas aparece isolada. Para produto financeiro, o padrão mais coerente é opt-in explícito e copy curta sobre o que é coletado e o que nunca é coletado.
Moeda local: USD em interface PT-BR cria desalinhamento regional. Deve seguir locale ou pedir confirmação leve, mas sozinho é correção de regionalização, não tese competitiva.
Testnet em verde com check comunica sucesso/segurança para um contexto que deveria sinalizar atenção. Âmbar e ícone de contexto alternativo seriam mais coerentes.
Renomear Endereço de Ethereum e expandir redes é melhoria importante de IA/copy, mas não deve ser promovida como oportunidade competitiva isolada.
Indicar carteira ativa na operação é refinamento importante para cross-chain, mas deve compor a tese maior de auditabilidade de identidade, não virar oportunidade autônoma.
Consolidação derivada dos arquivos individuais do fluxo em analises/uniswap/carteira-conectada/. Recorrências foram promovidas quando apareceram em pelo menos duas telas ou como padrão sustentado dentro de um lote. Candidatos marcados como hipótese nos arquivos fonte permaneceram como fricções, pontos isolados ou direções de produto. A seção 🟡 não foi mantida porque o funding localizado CEX → wallet não passa claramente pela primeira pergunta-teste da régua: o consolidado não demonstra que todos os concorrentes principais fazem igual.

Função: Popover ancorado no ícone "..." (três pontos) no header de ações da página. Contém apenas uma opção: "Denunciar problema de dados" — canal de feedback de qualidade dos dados exibidos.
Componentes
Regras de negócio
🟢 Insight 1 — canal explícito de feedback de qualidade de dados (transparência) Reconhecer publicamente que os dados exibidos podem estar errados, e oferecer caminho dedicado pra reportar, é trust signal. Em DeFi, dados (preço, supply, contract) são críticos e podem divergir entre fontes — admitir falibilidade dá segurança ao usuário. Padrão a herdar — sempre que o produto exibe dados de terceiros (indexers, oráculos, APIs), canal de denúncia deve ser visível.
^insight-1
🔴 Fricção 1 (estrutural — overflow com um único item é UX waste) Convenção universal de UI: ícone "..." significa "mais opções não cabem no header — clique pra ver". Quando o menu tem apenas 1 opção, o ícone "..." é fricção: dois cliques (abrir menu + clicar opção) onde um seria suficiente.
Por que solução óbvia falha: expor "Denunciar problema" diretamente no header (sem o "...") ocupa espaço visível em todas as visitas, mesmo quando o usuário raramente precisa. Mas escondê-lo dentro de "..." sugere que há outras opções (que não há).
Direcionamento Kotai: Opção A — mover "Denunciar" pro footer da página (link discreto), liberando o "..." pra crescer com mais opções no futuro. Opção B — substituir o ícone "..." por um ícone semanticamente coerente (ex: ícone de alerta/feedback). Opção C — manter "..." mas pré-popular com mais itens úteis (adicionar token à watchlist, exportar dados, abrir no explorer). Recomendação: C, se houver outras ações que façam sentido na página. Trade-off: backlog de funcionalidades pra popular o menu.
Perfil afetado: todos os perfis (custo de cliques afeta qualquer um), mas iniciante sofre mais com convenção quebrada.
^friccao-1
🔴 Fricção 2 (estrutural — "Denunciar" sem categorização inicial) "Denunciar problema de dados" é genérico. Iniciante que vê preço estranho não sabe se reportar como (a) erro de preço, (b) erro de metadata, (c) token desconhecido, (d) bug visual. Sem sub-categorias, o usuário tende a desistir ("não sei como descrever").
Direcionamento Kotai: sub-menu com 3-4 categorias claras ("Preço errado / Nome ou ícone errado / Não consigo fazer swap / Outro"). Trade-off: dropdown maior; mas converte feedback genérico em sinal classificado, útil pro time de dados. Pode ser modal em vez de submenu.
Perfil afetado: iniciante (principal — desiste sem categoria) e intermediário. Avançado descreve livre.
^friccao-2
🔴 Fricção 3 (cosmética — ícone "diagnóstico" não comunica "reportar problema") O ícone à esquerda do texto (no screenshot parece "🚫" ou ícone médico/diagnóstico) não é instantaneamente legível como "reportar erro". Pra iniciante que abre o menu vendo um item só, o ícone obscuro pode parecer warning ou trava — adicionando incerteza.
Direcionamento Kotai: ícone universalmente legível pra feedback — ⚠️ "exclamação" ou 📩 "envelope" ou 🐞 "bug". Acompanhado por texto descritivo. Trade-off: padronização de ícones em todo o produto; mas alinha leitura visual ao significado.
Perfil afetado: iniciante (não decodifica ícone obscuro). Intermediário/avançado lê o texto e ignora ícone.
^friccao-3


O fluxo de venda (off-ramp cripto → fiat) acerta na semântica de entrada: o big stat comunica o resultado que o usuário quer (receber X em fiat), não o input técnico (vender Y ETH), e o CTA progride contextualmente em três estados sem ambiguidade (1, 2, 3). Mas o atrito se concentra em dois pontos críticos. Primeiro, nas telas de pré-venda (1-3): rotulação insuficiente e validação de saldo ausente geram falhas silenciosas que chegam como surpresa ao iniciante em vez de guiar pra solução. Segundo, no handoff para o provedor externo (4-5): o usuário escolhe MoonPay sem ver tarifas (4), vai para o portal sem CTA ativo (5), e retorna com o widget vazio sem rastro da operação (5). A configuração de região (flag BR) atravessa o fluxo inteiro mas não se traduz em personalização consistente em nenhuma tela. Perfil mais afetado: iniciante.
O widget Vender mantém o mesmo padrão validado em Swap, Ordem-limite e Comprar: desconectado → "Conectar carteira" (rosa ativo); conectado sem condições → "Continuar" (cinza disabled); condições atendidas → "Continuar" (rosa ativo). A tela 1 entrega o CTA contextual de conexão (1); a tela 2 exibe o Continuar disabled com semântica própria do estado de erro (2); a tela 3 ativa o CTA quando o mínimo é atendido (3). Padrão transversal a herdar sem ressalva — a lógica de CTA contextual progressivo reduz cognitive load porque o usuário nunca precisa adivinhar qual é a próxima ação.
Diferente do Swap (big stat = cripto que você troca) e do Comprar (big stat = fiat que você gasta), o Vender posiciona o big stat como resultado — "quanto você vai receber" em fiat (1). Quando o usuário inverte a denominação via toggle, a sub-line "23,59 US$" torna inequívoca a conversão, porque nessa direção (token→fiat) só há uma interpretação possível (3). Os dois estados trabalham no mesmo sentido: ancorar a UI no resultado tangível (dinheiro recebido) em vez de no input técnico. Padrão a herdar: quando o produto é um resultado financeiro tangível (fiat na conta, não token na carteira), a UI deve articular esse resultado como informação primária.
A Uniswap não executa o off-ramp — ela orquestra. O modal de seleção de provedor deixa isso explícito no rodapé: "Você seguirá para o portal do provedor para ver as tarifas da sua transação" (4). O handoff modal anuncia que a aba já foi aberta e que o usuário pode fechar (5). A divulgação de termos do provedor externo diferencia juridicamente quem é responsável por quê (5). Padrão a herdar: quando funcionalidade depende de terceiro, comunicar proativamente o que é de responsabilidade do produto e o que é de responsabilidade do parceiro — antes do handoff, não depois.
Esta é a fricção estrutural mais difusa do fluxo: a UI apresenta elementos interativos ou informativos sem rotular claramente o que representam para o iniciante. Na tela 1, os presets 25/50/75/Máx aparecem cinza e inertes sem microcopy explicando por quê estão desabilitados — o usuário vê chips que parecem clicáveis e nada acontece (1). Na tela 2, "0 ETH" abaixo de "US$100" admite três interpretações sem rótulo que resolva a ambiguidade: conversão do input? saldo disponível? quantidade a vender? (2). Na tela 3, o big stat mostra "0,01" sem unidade visível — a inferência "é ETH" exige cruzar com o card seletor abaixo (3).
O padrão subjacente: a UI foi projetada por quem conhece o contexto. Quem não conhece encontra labels que funcionam como placeholders em vez de comunicação. O fix não é tooltip em tudo — é decidir qual dado precisa de rótulo explícito vs. qual é inferível pelo contexto visual imediato. Direcionamento Kotai: rótulos explícitos nas linhas de dados críticos ("Saldo: 0 ETH", "Você venderá ~0,042 ETH", unidade no big stat), microcopy de explicação nos presets disabled ("Conecte sua carteira para usar atalhos %"). Trade-off: mais texto no widget; mas elimina o "número solto sem âncora semântica". Perfil afetado: iniciante em primeiro lugar, intermediário eventual.
O sistema acumula avisos sem guiar o usuário para a ação de recuperação correta. Na tela 2, três sinais negativos competem simultaneamente: aviso de mínimo em vermelho, "0 ETH" (saldo zero) na sub-line, e CTA disabled — sem indicação de qual problema resolver primeiro (2). Resolver o mínimo (digitar mais) não ajuda se o saldo é zero; resolver o saldo (adicionar ETH) é a ação raiz, mas nenhum CTA aponta pra isso. Na tela 3, o CTA fica rosa ativo com saldo potencialmente zero: o usuário clica "Continuar" convicto e vai descobrir telas depois que a operação não pode ocorrer (3).
São duas manifestações do mesmo problema: ausência de lógica de prioridade de erros. O sistema trata todos os erros como equivalentes e os joga na tela ao mesmo tempo — ou pior, esconde o erro principal (saldo zero) quando o CTA já foi destravado pelo mínimo. Direcionamento Kotai: detectar a causa raiz (saldo = 0) e expor o único CTA relevante ("Adicionar ETH pra vender") em vez de disabled + avisos sobrepostos. Quando saldo > 0 mas abaixo do mínimo, aí sim mostrar o aviso de mínimo contextual. Trade-off: lógica condicional de prioridade mais complexa; mas elimina o "acúmulo de erros que não guiam ação". Perfil afetado: iniciante.
O off-ramp exige dois handoffs consecutivos com perda de contexto em cada um. Na tela 4, o usuário escolhe o provedor sem ver tarifas — a decisão é feita por método de pagamento (PIX, débito), não por custo real, porque as tarifas só aparecem no portal externo (4). Na tela 5, após clicar em MoonPay, o modal não tem CTA primário — só um X e texto "feche este modal" (5). Depois que o usuário vai ao MoonPay e retorna à Uniswap, o widget está vazio; não há "Sua venda está em processamento" ou histórico de saques recentes (5).
O problema não é usar provedor externo — é não calibrar as expectativas antes do handoff nem fechar o ciclo depois. A solução do CTA "Ir pra aba do provedor" (foca a aba existente, não abre nova) é tecnicamente simples; o trailing state exige webhooks de provedor mas é viável. Direcionamento Kotai: antes do handoff — mostrar tarifa estimada; durante — transformar o modal passivo em checklist do que vai acontecer no provedor ("Confirmar identidade, inserir chave PIX, aguardar liquidação..."); depois — banner no widget com status da operação. Trade-off: integração com APIs e webhooks de múltiplos provedores; mas elimina o "cliquei em Continuar e fui abandonado". Perfil afetado: iniciante e intermediário.
A flag BR está presente desde a tela 1 — o usuário está contextualizado como brasileiro desde o início. Mas essa configuração não se traduz em personalização consistente em nenhuma tela. Na tela 1, o big stat exibe US$ em vez de R$, criando a dúvida imediata: "vou receber dólares ou reais?" (1). Na tela 4, PIX aparece como primeiro item de uma lista de quatro métodos dentro do card MoonPay — sem badge destacado, sem filtragem da lista por compatibilidade com BR (4). Os provedores Coinbase ("Coinbase Cash Balance") e Transak ("Payout via Debit Card") provavelmente não servem pra saque em reais, mas aparecem em pé de igualdade com MoonPay.
A inconsistência não é só cosmética: ela gera dúvida sobre o produto final da operação (recebo R$ ou US$?) e força o usuário a rastrear a resposta distribuída em múltiplas telas. Direcionamento Kotai: se a região determina o fiat de cashout, big stat reflete esse fiat desde a tela 1 (flag BR → R$); no modal de provedor, filtrar por compatibilidade regional e destacar o método mais relevante pra região (PIX com badge para BR); provedores sem cobertura BR em seção separada ou colapsados por padrão. Trade-off: mapeamento região-provedor-método requer manutenção contínua; mas elimina a "flag BR que não muda nada". Perfil afetado: iniciante brasileiro (e qualquer usuário de região não-US).
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch e todos os DEXes com off-ramp delegam a seleção de provedor sem mostrar tarifas no próprio produto. O usuário vê nome + método de pagamento. Para comparar custos, precisa abrir cada portal externo sequencialmente.
Por que afeta nosso target: o iniciante não sabe que existem diferenças de tarifa entre provedores — ele escolhe pelo nome que reconhece ou pelo método mais familiar (4). O intermediário que sabe que há diferença precisa de esforço manual alto pra comparar. Em operações de off-ramp, diferença de 1-5% de tarifa em transações de alguns milhares de reais é perceptível no resultado. O usuário já vai ao portal externo antes de ter qualquer dado de custo (4).
Hipótese de diferenciação Kotai: pré-fetch de tarifas estimadas na abertura do modal de seleção de provedor. Exibir "MoonPay ~2,5% · ~R$588 líquido" ao lado do nome. Quando o fetch não retornar em tempo hábil, omitir o número sem bloquear o flow. Adicionar "melhor opção pra você" automático baseado em região + método preferido (configurável). Disponibilizar modo "ver todos sem ranking" para o usuário desconfiante da curadoria.
Trade-off: integração com APIs de múltiplos provedores — tarifas mudam, versões de API deprecam, provedor pode estar indisponível. Requer monitoramento contínuo e fallback gracioso quando dado não está disponível.
Passa nas 4 perguntas-teste? (1) ✓ Todos os concorrentes delegam sem mostrar tarifa. (2) ✓ Afeta iniciante e intermediário diretamente — em dinheiro. (3) ✓ Razão de ninguém ter resolvido: integração com APIs de múltiplos provedores é trabalho de manutenção contínua, não impossibilidade técnica. (4) ✓ "MoonPay ~2,5% · R$588 líquido" vs. "MoonPay — PIX, Debit Card" é mudança de informação que o usuário sente imediatamente.
Padrão atual da indústria: todos os DEXes com off-ramp terminam o fluxo no handoff — uma vez que o usuário vai pro portal do provedor, o produto original não tem mais informação sobre o status da operação. O widget volta ao estado vazio.
Por que afeta nosso target: para o iniciante, off-ramp é operação de alto peso emocional — envolve dinheiro indo pra conta bancária. Não saber se a operação foi concluída, está em processamento ou falhou gera ansiedade real. PIX é instantâneo no BR; banco internacional pode levar dias. Sem trail, o usuário não sabe se deve esperar 5 minutos ou 3 dias (5, 5). O problema começa antes: o usuário escolhe provedor sem saber o tempo de liquidação esperado.
Hipótese de diferenciação Kotai: persistir estado da operação (token, valor, provedor, timestamp) no portfolio/localStorage. Ao retornar ao widget Vender, exibir banner: "Sua venda de 0,01 ETH via MoonPay está em processamento — aguardar até [tempo estimado] ou ver histórico." Integrar webhooks de provedores pra atualizar status automaticamente quando disponível. Solução mínima sem webhook: mostrar "Você iniciou uma venda em [data] via MoonPay" — suficiente pra eliminar a amnésia, mesmo sem status de conclusão.
Trade-off: webhooks requerem parceria técnica com provedores — nem todos expõem API de status. Sem webhook, status fica "pendente" até timeout. A solução mínima (localStorage sem webhook) já entrega valor perceptível sem a complexidade da integração completa.
Passa nas 4 perguntas-teste? (1) ✓ Nenhum DEX com off-ramp mantém trail de operação visível no produto. (2) ✓ Afeta iniciante diretamente — é quem tem mais ansiedade sobre o status do dinheiro. (3) ✓ Razão de ninguém ter resolvido: instrumentação técnica com webhooks de cada provedor. A solução mínima (localStorage) tem barreira ainda menor. (4) ✓ "Sua venda está em processamento" vs. widget vazio é fundamentalmente diferente para quem acabou de enviar cripto.

Função: Popover ancorado no ícone de share (seta) no header de ações da página. Lista 2 opções de compartilhamento — link copiável e Twitter. Tooltip "Compartilhar" aparece sobre o ícone trigger.
Componentes
Regras de negócio
/explore/tokens/ethereum/NATIVE no clipboard🟢 Insight 1 — compartilhamento embutido na página do token Tornar compartilhamento social uma ação first-class na página do token (com ícone próprio no header de ações) é amigável a viralidade orgânica. Padrão a herdar — quando o produto pode beneficiar de WoM social (DeFi, fintechs, conteúdo), compartilhamento deve ser visível, não escondido em menu overflow.
^insight-1
🟢 Insight 2 — minimalismo deliberado (2 opções, não 10) Em vez de listar 10 redes sociais (Telegram, Discord, WhatsApp, e-mail, Reddit, etc), o popover oferece apenas Link + Twitter. Padrão a herdar — listas curtas reduzem decisão e aceleram a ação. Trade-off: usuários que esperam outras opções batem em parede.
^insight-2
🔴 Fricção 1 (estrutural — redundância com ícone X já no header) O header de ações já tem ícone "𝕏 (Twitter)" como atalho independente, fora do popover. Quando o usuário clica no ícone de share e abre o popover, encontra "Compartilhar no Twitter" — exatamente o que o ícone 𝕏 vizinho faria direto. Duplicação semântica.
Por que solução óbvia falha: remover o ícone X do header esconde funcionalidade visível; remover do popover deixa o popover só com "Copiar link" (parecendo overengineering).
Direcionamento Kotai: consolidar em um único caminho. Opção A: manter só o popover, sem ícones individuais ao lado (header limpo). Opção B: manter ícones individuais no header (Twitter, link, QR) e remover popover. Recomendação: Opção B pra reduzir cliques. Trade-off: header mais ocupado, mas elimina o "pra onde clico mesmo?".
Perfil afetado: iniciante e intermediário (paralisia de "qual caminho?"). Avançado escolhe um e ignora o outro.
^friccao-1
🟡 Oportunidade competitiva — Canais de share localizados (WhatsApp/Telegram no BR)
navigator.share() (sheet nativo do OS) que já lista os apps instalados.navigator.share() em desktop tem suporte irregular.^oportunidade-1
🔴 Fricção 3 (cosmética — "Copiar link" sem confirmação visual após clique) "Copiar link" como ação assume sucesso silencioso (clipboard atualizado, popover fecha). Sem feedback ("Link copiado ✓"), usuário não sabe se o clique funcionou. Especialmente em ambientes com permissions de clipboard (browser bloqueando), o silencio gera incerteza.
Direcionamento Kotai: toast efêmero "Link copiado ✓" no canto inferior da viewport por 2-3s. Ou mudar o rótulo do botão por alguns segundos ("Copiado ✓") antes do popover fechar. Trade-off: mais um padrão de feedback no design system; mas elimina o "clicou ou não?".
Perfil afetado: iniciante (principal — busca confirmação de cada ação). Intermediário e avançado tipicamente assumem sucesso.
^friccao-2
Função: Dropdown ancorado no chip "Todas as redes" do header do token. Permite filtrar os dados da página (preço, gráfico, estatísticas) por rede específica em vez de agregação multichain. Não troca a rede da wallet — apenas o filtro de análise.
Componentes
Regras de negócio
🟢 Insight 1 — multichain como filtro analítico (não como ação destrutiva) Já mapeado em VT1 mas reforçado aqui: o usuário vê o dropdown e entende imediatamente "vou comparar a mesma coisa em redes diferentes", não "vou trocar minha rede ativa e potencialmente quebrar algo". Padrão a herdar — multichain como atributo de leitura é orders of magnitude menos hostil pra iniciante do que multichain como ação na wallet (que exige confirmação no MetaMask, troca de RPC, etc).
^insight-1
🟢 Insight 2 — badge "Novo" como curadoria editorial de descobrimento Pra usuário recorrente, o badge "Novo" sinaliza "explore essa rede que acabou de chegar". Padrão a herdar — sinalizar adições recentes em listas longas reduz a inércia de "sempre escolho o que já conheço". Trade-off: requer manutenção da política de quando remover o badge (timing arbitrário pode confundir).
^insight-2
🟢 Insight 3 — ícones por rede com cores distintas (escaneabilidade) Cada rede tem ícone próprio com cor identificável (Ethereum losango azul, Unichain rosa, Base azul-claro, etc.). Mesmo sem ler o texto, usuário recorrente identifica visualmente. Padrão a herdar — em listas de entidades canônicas (redes, tokens, wallets), ícone colorido único é mais escaneável que texto + ícone genérico.
^insight-3
🔴 Fricção 1 (estrutural — Unichain como segunda opção sem disclaimer) Ethereum (L1 dominante) aparece em primeiro lugar depois de "Todas as redes", o que é defensável. Logo em segundo, Unichain — a L2 da própria Uniswap. Pra usuário que não sabe que a Uniswap criou sua própria rede, é uma rede como qualquer outra no ranking. Há conflito de interesse implícito: o app que define a ordem da lista é o mesmo que opera uma das redes da lista, e a coloca em destaque.
Por que solução óbvia falha: ordenar por TVL/volume é métrica objetiva mas Unichain pode genuinamente ter TVL alto; ordenar alfabético é "honesto" mas perde o sinal de "redes mais relevantes pra você".
Direcionamento Kotai: ordem padrão por TVL/volume público e verificável (citar fonte: DefiLlama, etc) + opção do usuário customizar. Se Kotai operar rede própria, marcar com selo "Da Kotai" explicitamente — divulgação do conflito é mitigação aceitável. Trade-off: política editorial documentada; usuário precisa entender o que TVL significa pra interpretar.
Perfil afetado: intermediário e avançado (têm contexto pra notar o conflito). Iniciante não percebe — daí baixa prioridade.
^friccao-1
🔴 Fricção 2 (estrutural — sem busca de rede) Lista de 8+ redes com scroll. Usuário que sabe exatamente qual rede quer (Polygon, ZkSync, Scroll, Mantle, etc) precisa rolar até achar. Pra iniciante familiar com "Polygon" mas não com a posição dela na lista, tempo é desperdiçado.
Direcionamento Kotai: campo de busca no topo do dropdown (filtra a lista). Trade-off: mais um input visual; mas elimina scroll cego. Padrão consistente com modal de seleção de token (que tem busca por padrão).
Perfil afetado: intermediário (sabe o nome da rede mas não decora posições). Iniciante raramente sabe nomes; avançado tolera scroll.
^friccao-2
🔴 Fricção 3 (cosmética — sem agrupamento por categoria) Todas as redes aparecem em lista plana — L1 (Ethereum) misturada com L2s (Arbitrum, Optimism, Base), sidechains, app-chains (Unichain), e Bitcoin-likes. Pra usuário avançado que quer escolher por categoria ("quero olhar todas as L2s da Ethereum"), a lista plana é fricção.
Direcionamento Kotai: seções colapsáveis ou separadores ("Ethereum L1 / L2s / Outras"). Trade-off: mais estrutura visual; mas dá pista de categoria. Opcional via toggle "modo plano" pra quem não quer hierarquia.
Perfil afetado: intermediário/avançado (sabem distinguir L1/L2/sidechain). Iniciante não sabe a diferença — pra ele, agrupar pode até confundir.
^friccao-3
🟡 Oportunidade competitiva (baixa-média leverage — exposição honesta de cobertura) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch — todos mostram listas planas sem explicar metodologia de cobertura. (2) ✓ Afeta iniciante: ele não sabe quais redes são "boas" pra liquidez. (3) — Razão de ninguém resolver: ranking público de chains é trabalhoso e politicamente sensível. (4) ✓ Diferença perceptível — usuário sente quando há explicação contextual ("Base tem o maior volume de USDC desta semana").
Diferenciação Kotai: linhas da lista com micro-stat lateral ("Ethereum · 245M US$ vol · 1.2 mM TVL") em fonte pequena, permitindo decisão informada sem sair do dropdown. Trade-off: visual mais denso; mas converte escolha cega em escolha informada.
^oportunidade-1


Função: Tab "Vender" do widget de trade embedded na página do ETH. Reutiliza o widget standalone de /sell (vide Vender #1) com ETH pre-locked como token de origem. Estado mostrado: usuário conectado sem saldo de ETH — presets de % aparecem disabled.
Componentes
Regras de negócio
🟢 Insight 1 — token pre-locked confere intencionalidade ao flow Ao trocar pra tab Vender na página do ETH, o sistema assume "vender ETH" sem precisar perguntar. Padrão a herdar — quando o usuário está numa página de token específico e ativa uma ação que opera sobre tokens (swap/limit/sell/buy), preferir o token da página como default. Reduz cliques e alinha com a intenção declarada pela navegação.
^insight-1
🟢 Insight 2 — presets cinza como pista de "estado incompleto" Diferente de "Insira um valor" disabled (que é genérico), os presets cinza comunicam visualmente que algo está faltando antes do input ser digitado. Pra olho treinado, isso aponta pra "presets dependem de saldo, então saldo está zero". Padrão a herdar — quando um controle UI tem dependência de dado externo (saldo), o estado disabled deve ser semanticamente legível em vez de só "inativo".
^insight-2
🔴 Fricção 1 (estrutural — sem saldo visível, presets cinza viram enigma) Mesma fricção mapeada em Vender #1, agudíssima aqui: presets 25/50/75/Máx aparecem cinza sem explicação. O Insight 2 acima diz "olho treinado infere"; iniciante não tem esse olho. Ele vê 4 chips claramente clicáveis-mas-inertes e tenta apertar 25%, nada acontece, frustração.
Pior, não há "Saldo: 0 ETH" exibido em lugar nenhum no widget. Pra um usuário que acabou de conectar wallet, descobrir que não tem ETH exige sair da página, ir pro Portfólio ou pra MetaMask, voltar. Quando bem informado, o caminho óbvio seria a tab "Comprar" ao lado, mas isso é deixado pra inferência.
Direcionamento Kotai: ao detectar saldo zero do token da página + tab Vender ativa, transformar CTA principal em CTA contextual cruzado: "Você não tem ETH — Comprar primeiro" (rosa ativo, link pra tab Comprar). Manter presets visíveis mas com microcopy "Disponíveis após depósito de ETH na carteira". Trade-off: mais lógica condicional; mas elimina o "presets que não respondem". Padrão da família contextual: o CTA primário sempre aponta a próxima ação útil, mesmo quando ela é "trocar de tab".
^friccao-1
🔴 Fricção 2 (estrutural — tab "Vender" habilitada mesmo sem saldo de ETH)
A tab "Vender" no widget está clicável e habilitada como qualquer outra, sem indicação de que vender ETH é impossível com saldo zero. Comparado com o widget global /sell (vide Vender #2), onde o usuário pelo menos tenta digitar e recebe o erro, aqui o flow inteiro fica passivo: tab ativa, presets cinza, CTA cinza, sem feedback acionável.
Por que solução óbvia falha: desabilitar a tab inteira é hostil — usuário pode estar só explorando o que a feature faz antes de comprar ETH; quer ver a UI sem ser punido.
Direcionamento Kotai: tab permanece habilitada (exploração é direito), mas estado interno mostra banner de orientação no topo do widget: "Você não tem ETH pra vender. Compre ou deposite ETH primeiro." com botões inline "Comprar" / "Como depositar". Trade-off: mais texto no widget; mas elimina o estado mudo. Consistente com a oportunidade competitiva em Swap #1 (tratar "primeira sessão pós-conexão com saldo zero" como estado próprio com onboarding).
^friccao-2
🟡 Oportunidade competitiva (herdada de VT4) — Região define fiat de exibição também no off-ramp
^oportunidade-fiat
Observação estrutural — família CTA contextual consolidada no widget Ao longo dos 5 estados mapeados (VT1–VT5), o widget exibe a família completa de CTAs contextuais:
Cada CTA aponta o gap real exceto VT5, onde o gap real ("você não tem ETH") fica oculto atrás do gap aparente ("falta valor"). É a única falha do padrão no flow VT — corrigível com lógica condicional de prioridade de gaps.
^oportunidade-1




Função: Usuário trocou o dataset de "Preço" pra Volume. Mudança crítica: o big stat no topo do gráfico também muda — não exibe mais o preço atual (2362,30 US$), mas o volume agregado do período (2,9 mM US$) com sub-rótulo contextual ("Há uma semana"). Toggle linha/candle some.
Componentes
Regras de negócio
🟢 Insight 1 — big stat semanticamente coerente com dataset (o número é "o que o gráfico mostra") Quando o gráfico mostra Preço, big stat = preço; quando mostra Volume, big stat = volume agregado. Padrão a herdar — o número grande na parte superior resume o gráfico abaixo, sempre. Sem coerência semântica, o número grande viraria "ruído" que o usuário tem que ignorar. Aplicar como regra: big stat = leitura síntese do dataset ativo, não constante.
^insight-1
🟢 Insight 2 — sub-rótulo dinâmico contextualiza o agregado "Há uma semana" abaixo do "2,9 mM US$" comunica que o número é agregado, não pontual. Sem essa contextualização, usuário poderia ler "2,9 mM US$" como "o volume está em 2,9 mM agora" (ambíguo entre "neste momento" e "no total da semana"). Padrão a herdar — sempre que um número representa agregação, rotulá-lo explicitamente com a janela temporal.
^insight-2
🟢 Insight 3 — cor magenta diferencia visual de preço Mudar de azul (preço) pra magenta (volume) sem precisar reler o toggle ativo dá pista visual instantânea de "estou em outro dataset". Padrão a herdar — cada dataset tem cor própria como reforço visual da seleção. Trade-off: paleta limitada se houver muitos datasets; mas pra três (Preço/Volume/TVL) funciona bem.
^insight-3
🔴 Fricção 1 (estrutural — "Há uma semana" é literalmente ambíguo) "Há uma semana" pode ser lido como: (a) "Volume nesse instante há uma semana atrás" (snapshot pontual no passado) (b) "Volume agregado dos últimos 7 dias" (total da janela) (c) "Volume médio durante a última semana" (média)
A leitura correta é (b), mas a microcopy permite (a) e (c). Pra iniciante, isto é confusão pura — o número "2,9 mM US$" pode ser interpretado de três formas distintas com implicações muito diferentes.
Por que solução óbvia falha: rótulos mais longos ("Volume total dos últimos 7 dias") ocupam espaço e ficam redundantes com o controle 1W já visível.
Direcionamento Kotai: microcopy explícita "Volume total · últimos 7 dias" (com bullet • como separador). Quando timeframe mudar (1H/1D/1M/1Y), atualizar dinamicamente. Trade-off: mais texto; mas elimina três leituras possíveis de um número. Padrão sistêmico aplicável a qualquer agregação temporal na UI.
Perfil afetado: iniciante (principal — três leituras possíveis = paralisia) e intermediário.
^friccao-1
🔴 Fricção 2 (estrutural — "mM US$" como notação não-universal) "2,9 mM US$" — em PT-BR financeiro, "mM" pode significar "milhares de milhões" (= bilhões = 10⁹), mas também é usado coloquialmente como "milhões" em alguns contextos. Em inglês, "M" = milhão, "MM" = milhão (variante), "B" = bilhão. A Uniswap usa "M" pra milhão (vide "914,4 M US$" em TVL) e "mM" pra bilhão — o que é correto em padrão financeiro brasileiro mas obscuro pra iniciante e dissonante com convenções de cripto (que geralmente usam K/M/B em inglês).
Direcionamento Kotai: usar notação inequívoca padrão BR ("R$ 2,9 bi" / "R$ 914 mi") ou notação cripto-nativa ("$2.9B" / "$914M"). Não misturar PT-BR + abreviação financeira obscura. Trade-off: decisão editorial sobre qual convenção adotar (BR formal vs cripto-nativa); recomendação é cripto-nativa com tooltip pra valor exato em formato BR.
Perfil afetado: iniciante (não decifra "mM"). Intermediário e avançado já aprenderam, mas erro de leitura em 10× pode acontecer mesmo com prática.
^friccao-2
🔴 Fricção 3 (cosmética — sub-rótulo "Há uma semana" some quando timeframe é alterado?) O screenshot mostra "Há uma semana" porque o timeframe ativo é 1W. Quando o usuário troca pra 1M, vai virar "Há um mês"? "Nos últimos 30 dias"? "Há trinta dias"? A microcopy precisa de uma estratégia coerente pra cada timeframe, não improvisar caso a caso.
Direcionamento Kotai: padrão fixo "Últimos X" (Últimos 7 dias / Últimos 30 dias / Últimos 12 meses / Todo o histórico), explícito sobre agregação. Trade-off: rótulos mais longos, mas consistentes — usuário aprende uma vez e aplica em qualquer timeframe.
Perfil afetado: iniciante e intermediário (quem alterna timeframes está aprendendo a ler agregados).
^friccao-3
Função: Usuário trocou o dataset pra TVL (Total Value Locked) — métrica de liquidez disponível nas pools do ETH. Big stat atualiza pra "1,0 mM US$" (valor atual de TVL), gráfico vira linha azul preenchida representando TVL ao longo do tempo. Toggle linha/candle ausente (TVL é série contínua).
Componentes
Regras de negócio
🟢 Insight 1 — TVL como dataset nativo na página do token (sinal de produto pra avançado) Pra usuário avançado, TVL é a métrica mais importante na avaliação de "consigo executar um swap grande aqui sem slippage?". Expor TVL como dataset nativo (não escondido em "estatísticas") indica que a Uniswap entende quem é o usuário power. Padrão a herdar pra Kotai — métricas críticas pra decisão devem ser visuais e exploráveis temporalmente, não só números soltos numa caixa de estatística.
^insight-1
🟢 Insight 2 — área preenchida vs linha simples como pista visual de natureza do dado Preço (VT1) usa linha simples — natureza pontual ("o preço é X agora"). TVL (VT8) usa área preenchida — natureza acumulativa/contínua ("o TVL é o estoque atual de capital travado"). Padrão a herdar — escolha de linha vs área comunica semântica do dado sem precisar ler o rótulo. Aplicação: usar área pra cumulativos/estoques (TVL, supply, holders), linha pra pontuais (preço, taxa).
^insight-2
🟡 Oportunidade competitiva (herdada de VT1 / Leilões #1) — TVL como caso da família "educação inline para métricas DeFi"
^oportunidade-1
🔴 Fricção 2 (estrutural — diferença de TVL entre VT1 e VT8 pode parecer inconsistência) VT1: TVL 914,4 M US$. VT8: TVL 1,0 mM US$. Diferença real é entre timestamps de captura do snapshot, mas usuário olhando os dois lado a lado pode achar "está errado em algum lugar". Pior: 914,4 M → 1,0 mM ≈ +10% em poucos minutos não é típico de TVL (que tende a ser mais estável).
Por que solução óbvia falha: travar TVL pra "snapshot da última hora" cria delay artificial; deixar live causa flutuação visível.
Direcionamento Kotai: timestamp de "última atualização" próximo ao big stat ("Atualizado há 3min") + animação sutil quando o valor muda em real-time. Trade-off: mais elementos visuais; mas elimina o "será que tá errado?". Aplicável a qualquer métrica live (preço, volume, TVL).
Perfil afetado: intermediário (principal — começa a comparar telas e nota inconsistências). Iniciante raramente compara; avançado entende flutuação.
^friccao-1
🔴 Fricção 3 (estrutural — falta de sub-rótulo contextual diferente de Volume) VT7 (Volume) tinha sub-rótulo "Há uma semana" abaixo do big stat. VT8 (TVL) não tem nenhum. A inconsistência é semanticamente correta (TVL é snapshot, Volume é agregado), mas pra usuário casual a falta de paralelismo visual entre datasets pode parecer "esqueceram de adicionar o rótulo".
Direcionamento Kotai: sub-rótulo presente em todos os datasets, com semântica adaptada — Preço: "Agora" + delta do período; Volume: "Últimos 7 dias"; TVL: "Snapshot atual · 3 min atrás". Trade-off: mais texto, mas estrutura visual paralela em todos os datasets. Padrão sistêmico de "todo big stat tem sub-rótulo explicando sua natureza".
Perfil afetado: iniciante e intermediário (paralelismo visual evita "esqueceram algo?"). Avançado tolera ausência.
^friccao-2
🟡 Oportunidade competitiva (média leverage — TVL como leitura de "saúde do par") Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch — todos mostram TVL como número técnico solto. Nenhum interpreta. (2) ✓ Afeta iniciante diretamente: TVL alto = segurança contra slippage; TVL baixo = risco de execução ruim em swap grande. (3) ✓ Razão de ninguém resolver: requer threshold por par/token + interpretação contextual ("alto" depende do tamanho do swap planejado). (4) ✓ Diferença perceptível — usuário sente quando o app traduz "1,0 mM US$" em "liquidez suficiente pra swaps até US$ 50K com slippage <0,5%".
Diferenciação Kotai: leitura interpretada de TVL contextualizada pelo valor que o usuário está prestes a swapar (cruzar TVL + slippage estimado + tamanho do trade do widget). Quando widget tem valor preenchido, dataset TVL pode mostrar "Pra seu swap de US$ X, liquidez suficiente / parcial / insuficiente". Trade-off: integração entre dataset de análise e estado do widget; complexidade de cálculo (depende de v2/v3/v4 e hook configs). Vantagem: TVL deixa de ser estatística decorativa e vira leitura acionável.
^oportunidade-2

Função: Mesma página do ETH, dataset "Preço" ainda ativo, mas o usuário trocou o tipo de visualização de linha pra candles via toggle no rodapé do gráfico. Big stat (2362,30 US$) e delta (▲ 73,59 US$ / 3,22%) permanecem iguais — dataset não mudou, só a renderização.
Componentes
Regras de negócio
🟢 Insight 1 — toggle de visualização sem mudar dataset (análise técnica básica inline) Trocar de linha pra candle dá ao usuário a leitura de "abre/fecha/máx/mín por período" sem sair da página, sem reload, sem ir pra TradingView. Padrão a herdar pra Kotai — uma página de token deve oferecer pelo menos linha + candle como duas leituras complementares do mesmo dado. Trade-off: candle só faz sentido pra timeframes onde a granularidade do dado permite OHLC.
^insight-1
🟢 Insight 2 — toggle condicional (some quando não faz sentido) O toggle linha/candle aparece em Preço e desaparece em Volume/TVL (vide VT7/VT8) — o sistema esconde controles que não fariam sentido no contexto, em vez de mostrá-los desabilitados. Padrão a herdar pra UI densa: controles condicionais por contexto são mais limpos que controles permanentemente visíveis e às vezes inertes. Trade-off: usuário pode notar a ausência ("onde foi o toggle?") e ficar perdido — exige consistência de posicionamento quando reaparece.
^insight-2
🟢 Insight 3 — desacoplamento entre análise e widget de trade Trocar o tipo de gráfico não altera o widget (que continua no estado VT2). Padrão correto — análise é leitura, widget é ação; mudar como você vê o dado não muda o que você quer fazer com ele. Reforça a tese de "viewport densa com responsabilidades separadas".
^insight-3
🔴 Fricção 1 (estrutural — granularidade da vela não é configurável nem visível) No timeframe 1W com ~20-25 velas visíveis, cada vela representa ≈ 6-8 horas. Mas isso não é exibido em nenhum lugar — usuário avançado tem que adivinhar a granularidade pelo número de velas / período. Pra leitura de candle, granularidade é crucial (uma vela de 4h conta uma história diferente de uma vela de 1d).
Por que solução óbvia falha: oferecer dropdown explícito de granularidade ("1m / 5m / 15m / 1h / 4h / 1d / 1w") expande o controle e exige decisões do usuário. Granularidade auto-derivada do timeframe é mais simples mas opaca.
Direcionamento Kotai: rótulo discreto abaixo do toggle de candle ("cada vela = 6h") + dropdown opcional pra usuários avançados que querem granularidade fina. Trade-off: mais um controle (ou label); mas elimina a opacidade da auto-derivação.
Perfil afetado: intermediário (principal — começa a ler candle e quer entender granularidade) e avançado. Iniciante não atinge esse atrito.
^friccao-1
🟡 Oportunidade competitiva — Tradução textual do gráfico em linguagem natural
^oportunidade-1
🔴 Fricção 3 (cosmética — toggle linha/candle com ícones sem rótulo) Os dois ícones do toggle (linha vs candle) são pequenos e similares visualmente (ambos têm linhas). Iniciante pode não decodificar qual é qual sem hover. Compare com o toggle de dataset ("Preço/Volume/TVL") que tem rótulos textuais explícitos.
Direcionamento Kotai: rótulos textuais ao lado dos ícones ("📈 Linha / 📊 Candle") ou tooltip on-hover. Trade-off: mais texto no controle, mas elimina jargão visual. Consistência com o toggle de dataset que já usa texto.
Perfil afetado: iniciante (não associa ícones a candle/linha sem rótulo).
^friccao-2


Função: Modal de transição após o usuário escolher um provedor (MoonPay no caso). O flow Uniswap encerra aqui; a continuação acontece numa nova aba do MoonPay (KYC, dados de pagamento, confirmação, recebimento via PIX/banco). Análogo direto ao handoff do Comprar #7.
Componentes
Regras de negócio
🟢 Insight 1 — handoff explícito como tela própria (não silent redirect) Em vez de simplesmente abrir a aba do MoonPay e deixar o usuário desorientado ("o que aconteceu? por que abriu outra aba?"), o modal anuncia "abrimos uma nova aba, você pode atuar lá". Padrão a herdar — quando o flow transita pra ambiente externo, anunciar explicitamente o que está acontecendo, mesmo que a ação técnica (open new tab) já tenha sido feita.
^insight-1
🟢 Insight 2 — divulgação clara de termos de provedor externo "Ao continuar, você reconhece que se sujeita aos Termos de serviço e à Política de privacidade do provedor MoonPay" é divulgação juridicamente sensata — diferencia Uniswap (orquestrador) do MoonPay (executor), com responsabilidades distintas. Padrão a herdar quando flow envolve parceiro externo: deixar claro quem é responsável pelo quê.
^insight-2
🔴 Fricção 1 (estrutural — sem botão de retorno, sem CTA primário) O modal não tem nenhuma ação primária — só "X" no canto e termos no rodapé. O usuário acabou de clicar em MoonPay (#4) e cai numa tela passiva que diz "feche este modal". Pra iniciante, isso quebra o padrão "uma tela = uma ação"; ele pode pensar que algo deu errado ("não deveria ter um botão pra continuar?").
Por que solução óbvia falha: botão "Ir pra MoonPay" duplicaria a aba que já foi aberta (gerando duas abas iguais), o que é pior. "Fechar modal" como CTA principal seria redundante com o X.
Direcionamento Kotai: transformar em estado de espera — modal mostra checklist resumido do que vai acontecer no MoonPay ("1. Confirmar identidade", "2. Inserir chave PIX", "3. Aguardar liquidação"), com botão secundário "Ir pra aba do provedor" (foca a aba já aberta em vez de criar nova). Quando a transação completar no MoonPay, retornar foco automaticamente pra Uniswap com confirmação. Trade-off: instrumentação com webhooks do MoonPay; quem fecha modal antes da liquidação fica sem confirmação visual no Uniswap.
^friccao-1
🔴 Fricção 2 (estrutural — sem trail de retorno ao Uniswap) Quando o usuário termina no MoonPay (recebe PIX/saldo) e volta pro Uniswap, o widget está vazio (estado pré-conexão ou pré-input). Não há "Sua venda anterior está em processamento" ou "Histórico de saques recentes" visível. O contexto da operação se perde no handoff.
Direcionamento Kotai: persistir o estado da venda (token, valor, provedor, timestamp) no localStorage/Portfolio e exibir banner discreto ao retornar ao widget Vender: "Sua venda de 0,01 ETH via MoonPay está em processamento — ver detalhes". Trade-off: precisa instrumentar lifecycle da operação cross-provider; sem webhook pode ficar "pendente" pra sempre. Vantagem: usuário não esquece que operação está em andamento.
^friccao-2
🔴 Fricção 3 (cosmética — "conforme o caso" é juridiquês sem sentido pra iniciante) "...do provedor MoonPay, conforme o caso" — a expressão "conforme o caso" é jargão jurídico que não comunica nada concreto pro iniciante. O leitor não-jurídico tende a pular ou se sentir estranho com a vagueza ("qual caso?"). Provavelmente é tradução literal de "as applicable" do inglês jurídico.
Direcionamento Kotai: substituir por linguagem clara ("Termos do MoonPay aplicam-se a esta venda") ou omitir a ressalva se ela existir só por hábito jurídico defensivo. Trade-off: precisa revisão legal pra confirmar que omitir "conforme o caso" não muda exposição contratual.
^friccao-3
Observação estrutural — handoff Vender vs Comprar O modal de #5 é estruturalmente idêntico ao Comprar #7 (handoff MoonPay): mesmo logo gigante, mesma headline pattern, mesma microcopy "abra a aba do provedor". Diferença semântica: no Comprar, a aba externa coleta fiat e entrega cripto; aqui coleta cripto e entrega fiat. Padrão a herdar — quando duas operações invertidas (compra/venda) compartilham infra de provedor, a UI pode reutilizar o mesmo handoff component. Diferencial seria o status posterior: Comprar termina com "cripto chega na wallet"; Vender termina com "fiat chega no banco/PIX" — temporalidades distintas (PIX é instantâneo no BR, banco internacional é dias).
^observacao-1

Função: Estado em que o usuário inverteu a denominação do input (via toggle ↓↑) e está agora digitando em ETH diretamente. Valor 0,01 ETH (~23,59 US$) atende o mínimo, CTA "Continuar" fica rosa ativo.
Componentes
Regras de negócio
🟢 Insight 1 — toggle de denominação como controle dual de unidade A toggle ↓↑ permite ao usuário pensar tanto "quero vender 0,01 ETH" (mentalidade cripto-nativa) quanto "quero receber US$23,59" (mentalidade fiat). Padrão a herdar — quando há duas unidades semanticamente equivalentes (token ↔ fiat, ETH ↔ wei, etc.), oferecer toggle visível permite adaptar a UI ao mental model do usuário em vez de impor um. Já visto também no card de preço de Ordem-limite (inverter par).
^insight-1
🟢 Insight 2 — sub-line vira conversão clara quando big stat é token Quando o input está em token, sub-line "23,59 US$" é inequívoca (é a conversão). Compare com #2, onde com input em fiat o sub "0 ETH" virava triplamente ambíguo (conversão? saldo? quantidade?). A direção token→fiat é menos confusa porque a conversão é puramente matemática e há um único saldo natural a interpretar.
^insight-2
🔴 Fricção 1 (estrutural — toggle ↓↑ tem affordance fraca) A toggle ↓↑ aparece minúscula ao lado do sub-line, sem rótulo, sem fundo destacado. Quem descobre essa funcionalidade tende a ser por acidente (clique exploratório). Pra iniciante, a possibilidade de digitar em ETH em vez de USD pode ficar oculta a tela inteira.
Por que solução óbvia falha: rótulo "Trocar pra ETH" explícito ocupa espaço e quebra o minimalismo do widget; mas a funcionalidade é tão valiosa que esconde gente em direção ao input fiat quando ela queria input token.
Direcionamento Kotai: aumentar a área clicável do toggle e adicionar microcopy "Digitar em ETH" / "Digitar em US$" abaixo dele (alternando conforme estado atual). Mostrar tooltip no primeiro hover/load. Trade-off: mais um label; mas converte feature escondida em feature descoberta.
^friccao-1
🔴 Fricção 2 (estrutural — falta de check de saldo silencia falha) Análogo direto ao Ordem-limite #3: o usuário digitou 0,01 ETH, CTA está rosa ativo, mas não há validação visível de "você tem 0,01 ETH disponível?". Se saldo é 0 (como sugeria #2), o flow vai progredir sem alerta, e o usuário só vai descobrir o erro na seleção de provedor ou na assinatura.
Por que solução óbvia falha: bloquear input acima de saldo elimina o uso legítimo de "preparar a operação antes de receber o ETH" (caso de borda válido).
Direcionamento Kotai: aviso inline não-bloqueante quando valor > saldo: "Você tem 0 ETH disponível agora. Adicione ETH na carteira pra concluir a venda." com link contextual pra onramp. Trade-off: mais um estado intermediário; mas elimina o "Continuar parece ativo, clico, descubro 3 telas depois que não dá".
^friccao-2
🔴 Fricção 3 (cosmética — unidade do big stat ausente) "0,01" sem unidade visível ao lado do número grande. A inferência "é ETH" depende de ler o card seletor abaixo. Compare com #1/#2 onde "US$" aparecia colado ao número como prefixo gigante ("US$100"). Pra iniciante, número solto "0,01" exige cruzamento visual com outro card pra entender unidade.
Direcionamento Kotai: prefixar ou sufixar a unidade no próprio big stat ("0,01 ETH" como linha única em fonte grande) — ou manter unidade pequena ao lado, mas visível sem cruzar. Trade-off: layout de tipografia mais complexo; mas elimina ambiguidade do "0,01 de quê?".
^friccao-3
Observação estrutural — paralelos com Comprar/Swap O flow Vender herda padrões coerentes dos outros widgets: CTA contextual em três estados (Conectar → disabled → ativo), card seletor de token compacto, dual display fiat+token. Diferenças semânticas: paradigma "receba em fiat" como resultado (vs "gaste em fiat" do Comprar), presets % do saldo (vs absolutos do Comprar), e a toggle de denominação que existe aqui (e em OL como inversor de par) mas não no Swap (onde a relação é token↔token simétrica).

Função: Mesma página do #1, agora com wallet conectada (endereço 0xd09B…618a no header). Único delta visual: CTA "Conectar" do header global vira o endereço, e o CTA do widget muda de "Conectar carteira" pra "Selecione um token" (disabled). Tudo o resto (gráfico, preço, tabs, estatísticas) permanece idêntico — conectar não navega.
Componentes
Regras de negócio
🟢 Insight 1 — conexão preserva contexto (zero navegação) Comparado com #1, o único delta é o header global e o rótulo do CTA. Gráfico continua no mesmo período, tab continua no Swap, token Comprar continua ETH. Padrão a herdar — conexão de wallet é mudança de estado, não de viewport. Usuário não perde a página onde estava nem precisa reconfigurar.
^insight-1
🟢 Insight 2 — CTA contextual reflete o próximo gap real "Conectar carteira" → "Selecione um token" mostra que o sistema sabe qual é a próxima ação faltante (token de origem). Em vez de "Fazer swap disabled" genérico, o rótulo aponta exatamente o que destrava o flow. Reforça o padrão central do widget já validado em Swap/Limit/Vender/Comprar.
^insight-2
🟢 Insight 3 — identidade visível como confirmação ambiente Endereço truncado + avatar no canto superior direito confirma "estou logado, esta é a wallet ativa" em todas as páginas. Padrão a herdar — wallet info como elemento global persistente (header), não como modal/notificação. Reduz ansiedade do "será que ainda estou conectado?".
^insight-3
🔴 Fricção 1 (estrutural — delta pequeno demais pode passar despercebido) A diferença entre #1 e #2 é minúscula: endereço no canto e mudança de rótulo do CTA. Pra usuário que acabou de conectar (clicou em "Conectar", autorizou no MetaMask, voltou), pode não ficar claro que a operação teve sucesso. Não há feedback explícito tipo toast "Conectado como 0xd09B…618a" ou highlight temporário.
Por que solução óbvia falha: toast persistente após conexão polui UI; toast efêmero pode ser perdido se o usuário estava olhando outra parte da tela (gráfico, por exemplo).
Direcionamento Kotai: highlight breve (2-3s) no avatar/endereço com animação de "fade in destacado" + microcopy ao lado por alguns segundos ("Conectado como 0xd09B…"). Trade-off: mais um elemento animado; mas elimina o "conectou? não conectou?". Em mobile especialmente útil onde header pode estar fora do foco visual.
Perfil afetado: iniciante (primeira conexão, busca confirmação) sobretudo em mobile.
^friccao-1
🔴 Fricção 2 (estrutural — "Selecione um token" é cinza mas sub-botão "Selecionar token ▾" é rosa) Continua a fricção do #1 mas agora mais aguda: o CTA principal "Selecione um token" é cinza/disabled, enquanto o sub-botão "Selecionar token ▾" no card Vender é rosa pleno. Visualmente, o sub-botão parece mais primário que o próprio CTA principal. Pior: ambos têm o mesmo verbo "selecionar token" — o usuário pode clicar no CTA (inerte) achando que abre o modal, em vez de clicar no botão rosa que de fato faz isso.
Direcionamento Kotai: quando o CTA principal aponta uma ação faltante, o controle que executa essa ação deve ter destaque visual coerente com o CTA. Solução: fazer o CTA principal virar atalho pro controle ("Selecione um token" cinza, mas clicável abre o modal de seleção direto). Ou inverter visual: CTA primário rosa "Selecione um token pra continuar" e sub-controle como outline. Trade-off: design system mais rígido; mas elimina duplicação semântica.
Perfil afetado: iniciante (não decifra qual rosa é o "primário"). Intermediário tipicamente aprendeu por tentativa.
^friccao-2

Função: Tab "Comprar" do widget de trade embedded na página do ETH. Reutiliza o widget standalone de /buy (vide Comprar #1) mas com ETH pre-locked como token de destino — usuário não precisa selecionar, contexto da página define.
Componentes
Regras de negócio
🟢 Insight 1 — reutilização total do widget Comprar entre página e standalone
O widget aqui é estruturalmente idêntico ao widget de /buy (vide Comprar #1) — mesmo header "Você está comprando", mesma flag BR, mesmos presets, mesmo CTA. Padrão a herdar pra Kotai — quando uma feature é reutilizada em contextos diferentes (página standalone vs embedded), reutilizar o componente exato preserva mental model do usuário e reduz manutenção. Diferencial entre contextos é mínimo (token pre-locked aqui, livre lá).
^insight-1
🟢 Insight 2 — token pre-locked elimina passo de seleção
Enquanto /buy exige o usuário selecionar qual token comprar, aqui ETH já está fixado. Isto economiza um modal completo (cf. Comprar #5 "Selecione um token") e reduz fricção. Padrão a herdar — quando o contexto da página implica um parâmetro óbvio, pré-preencher e deixar o usuário trocar opcionalmente é melhor que forçar seleção. Atalho do modal pra "trocar token" deve continuar disponível pra quem quer mudar.
^insight-2
🟢 Insight 3 — CTA "Insira um valor" expande a família contextual Mais uma variação do padrão de CTA contextual disabled — quando o único gap é o valor, o botão diz exatamente isso ("Insira um valor"), não "Comprar disabled" genérico. Acumulando a família mapeada: "Conectar carteira" / "Selecione um token" / "Adicionar fundos para fazer swap" / "Insira um valor" / "Confirmar disabled" — cada um aponta um gap específico. Padrão central do design system Kotai.
^insight-3
🟡 Oportunidade competitiva — Transparência de provedores e cobertura antes do compromisso
^oportunidade-1
🟡 Oportunidade competitiva — Região define fiat de exibição (não só fiat de cashout)
^oportunidade-2
🔴 Fricção 3 (cosmética — chevron no card de token confunde "trocável" com "obrigatório") O card ETH tem chevron → à direita, igual ao card "Selecione um token" do modo /swap. Pra iniciante, isso pode sugerir "preciso clicar pra confirmar o token" em vez de "clique pra trocar se quiser". Diferenciação de affordance é fraca — mesmo visual pra dois comportamentos distintos (selecionar vs trocar opcional).
Direcionamento Kotai: quando o token está pre-locked pelo contexto, manter card visualmente travado (sem chevron destacado, ou com ícone de "lock" sutil) + microcopy abaixo ("Trocar pra outro token"). Trade-off: mais um padrão visual no design system; mas elimina "tenho que clicar nesse card também?".
Perfil afetado: iniciante (não distingue affordances similares). Intermediário tipicamente já clicou e descobriu.
^friccao-1

Função: Usuário (conectado) trocou a tab do widget de "Fazer swap" pra Ordem-limite. O widget muda estrutura — card de preço-limite no topo, presets, expiração ausente neste recorte —, mas o contexto da página (ETH como token da operação) é preservado.
Componentes
Regras de negócio
/limit🟢 Insight 1 — troca de tab preserva contexto do token Ao trocar de "Fazer swap" pra "Ordem-limite", ETH (token da página) permanece no card Comprar. Padrão a herdar — quando o widget é embedded numa página com contexto (token X), trocar tab é mudança de modo de operação, não reset do contexto. Análogo a trocar de "Spot" pra "Futuros" em corretora tradicional sem perder o par selecionado.
^insight-1
🟢 Insight 2 — disclaimer permanente desde estado inicial (educativo, não punitivo) O banner amarelo "É possível que ordens-limite não sejam executadas..." aparece desde antes do usuário preencher qualquer campo. Isto educa sobre o comportamento da feature antes da fricção (em vez de mostrar só depois que ele tentou e falhou). Padrão correto a herdar — para features com comportamento contra-intuitivo (limit orders não garantem fill), explicar no estado inicial reduz expectativa errada.
^insight-2
🔴 Fricção 1 (estrutural — card preço-limite perde framing "Quando 1 X valer")
No widget standalone /limit (vide Ordem-limite #1-#4), o card de preço-limite tem framing rico: "Quando 1 ETH valer 2367,77 USDC" — explica claramente que o número é o preço-alvo do ETH em USDC. Aqui, embedded na página do token, o card mostra apenas o rótulo "Preço-limite" + número "0" + ticker "ETH" — sem o "Quando 1 X valer". Pra iniciante que chega via página do token, o framing "Quando 1 ETH valer" é justamente o que conecta o preço-limite ao preço gigante do gráfico (2362,30 US$) ao lado.
Pior: como o card Vender está sem token, o sistema não sabe a denominação (preço-limite em quê?), então mostra só "ETH" — mas isso parece dizer "preço-limite vale 0 ETH" em vez de "preço-limite do ETH é 0 (em algum stablecoin a definir)".
Por que solução óbvia falha: framing dinâmico exige que o token de origem (Vender) já esteja selecionado, mas o widget aceita preencher preço antes — então framing fica incompleto enquanto Vender estiver vazio.
Direcionamento Kotai: framing condicional. Sem Vender: "Defina um preço-limite (escolha primeiro a moeda de pagamento)". Com Vender selecionado: framing completo "Quando 1 ETH valer X USDC". Trade-off: mais um estado intermediário com microcopy diferente; mas elimina o "preço-limite de 0 ETH é o quê?".
Perfil afetado: iniciante (não conecta "Preço-limite" com o preço do gráfico ao lado) e intermediário vindo do widget global /limit.
^friccao-1
🔴 Fricção 2 (estrutural — herdada do #2: dois botões rosas competem por hierarquia) A mesma fricção de #1/#2 persiste em #3: "Selecionar token" rosa no card Vender vs CTA "Confirmar" disabled. Aqui ainda mais agudo porque há mais inputs vazios (preço-limite + Vender) e o usuário não sabe por onde começar.
Direcionamento Kotai: numeração visual dos passos faltantes ("1. Selecione o token de pagamento" → "2. Defina o preço-limite" → "3. Confirmar") via destaque sequencial nos campos vazios. Trade-off: UI mais didática; mas elimina o "qual rosa eu clico?". Pode ser opcional via toggle "modo guiado" pra iniciantes.
Perfil afetado: iniciante. Intermediário/avançado prefere UI limpa — daí o toggle opcional.
^friccao-2
🔴 Fricção 3 (cosmética — Comprar com ETH é desconexo com "Ordem-limite na página do ETH")
A página é "/tokens/ethereum/NATIVE" — semanticamente "quero analisar ETH". Mas o widget Ordem-limite com ETH no card Comprar significa "criar ordem pra comprar ETH abaixo do preço atual" — o que é semanticamente correto. PORÉM: pra usuário que veio do widget global /swap (onde ETH era default em Vender), o repentino flip pra Comprar pode passar despercebido. Pior: o preset relativo "+1% / +5% / +10%" parece "vender em alta" mas aqui significa "comprar acima do mercado", semântica oposta.
Direcionamento Kotai: adaptar o sinal do preset pela direção da operação (já vimos isso em OL #4 — Uniswap adapta sim, mas SÓ quando Vender está preenchido). Aqui, com Vender vazio, o preset usa default "+" — pode ser confuso. Microcopy do header do card ("Comprar ETH abaixo do mercado" / "Vender ETH acima do mercado") esclareceria. Trade-off: lógica condicional adicional; mas elimina ambiguidade da direção da operação. Conectado com a fricção 1 (framing dinâmico) — mesma raiz, mesma solução.
Perfil afetado: intermediário sobretudo (iniciante ainda não fez ordem-limite; avançado entende direção pelo contexto).
^friccao-3




Função: Modal de seleção do provedor de cashout (banco/cartão de débito), aberto após "Continuar" do widget. Lista 3 provedores (MoonPay, Coinbase, Transak) com formas de saque resumidas. Análogo direto do modal "Selecione um provedor" do Comprar.
Componentes
Regras de negócio
🟢 Insight 1 — pluralidade explícita de provedores (não single-vendor lock) Em vez de assumir um único provedor, a Uniswap lista 3 alternativas e expõe as formas de pagamento que cada um aceita. Padrão a herdar pra Kotai — quando funcionalidade depende de parceiro externo (KYC, off-ramp, custódia), expor lista permite ao usuário escolher pelo critério dele (provedor que já tem conta, método de pagamento preferido, taxa percebida). Trade-off: cada provedor tem políticas de KYC, limites e fees próprios; nem todos suportam BR/PIX.
^insight-1
🟢 Insight 2 — disclaimer de "tarifas no portal" no rodapé "Você seguirá para o portal do provedor para ver as tarifas da sua transação" é honesto: a Uniswap não tem como mostrar tarifas finais (cada provedor calcula no momento). Padrão a herdar — quando uma informação relevante (custo) só fica disponível em ambiente externo, anunciar isso explicitamente no momento da escolha em vez de criar surpresa.
^insight-2
🟢 Insight 3 — sub-rótulo lista métodos aceitos por provedor "PIX, Debit Card, Apple Pay, Google Pay" abaixo do nome do MoonPay é informação acionável: o usuário escolhe pelo método que ele tem disponível, não pelo nome do provedor (que ele pode não conhecer). Padrão correto — apresentar parceiros pelos benefícios concretos pro usuário, não só pelo nome.
^insight-3
🔴 Fricção 1 (estrutural — comparação cega de tarifas) Sem tarifa visível dentro do modal, o usuário escolhe por método de pagamento (PIX, débito, etc.) mas não pode comparar custos antes de escolher. Diferença de 1-5% em fees entre provedores é significativa numa operação off-ramp — o usuário só descobre o custo depois de escolher um provedor e ser redirecionado pro portal externo. Pra comparar, precisa abrir 3 portais sequencialmente, sair, voltar, escolher de novo.
Por que solução óbvia falha: tarifas variam por região, método de pagamento, valor, identidade KYC — buscar tarifa de cada provedor exige API call por provedor, latência e possibilidade de cota.
Direcionamento Kotai: pré-fetch de tarifas dos provedores na abertura do modal e exibir estimativa inline ("MoonPay — taxa ~2,5%"), com ressalva "valor final no portal". Quando provedor não retornar tarifa em tempo hábil, omitir o número (não bloquear o flow). Trade-off: integração mais profunda com APIs dos provedores; tempo de carregamento do modal. Vantagem: usuário compara sem sair do widget.
^friccao-1
🔴 Fricção 2 (estrutural — PIX escondido como item de lista do MoonPay) Pra brasileiro, o método mais relevante é PIX, e ele aparece como primeiro item de uma lista de quatro métodos do MoonPay ("PIX, Debit Card, Apple Pay, Google Pay") em fonte secundária. Pra quem mora no Brasil, o critério dominante de escolha é "qual aceita PIX?" — e só MoonPay aceita. Os outros (Coinbase, Transak) provavelmente nem servem pra BR.
Direcionamento Kotai: detectar região (já tem a flag BR no header desde #1) e priorizar provedores que servem essa região. Exibir provedores incompatíveis em seção separada ou ocultos por padrão. Destacar PIX como chip visual ou badge no card do MoonPay quando região = BR. Trade-off: precisa mapear cobertura por região/provedor (manutenção contínua); risco de excluir provedor legítimo se mapeamento estiver desatualizado.
^friccao-2
🔴 Fricção 3 (cosmética — chips "Banco / Débito" sem estado selecionado claro) Os dois chips no topo (Banco / Débito) parecem filtros, mas não há indicação visual de qual está ativo nem se ambos podem ser desselecionados. Iniciante pode pensar que são botões de ação (clica em "Banco" achando que escolhe saque pra banco diretamente). Compare com a tab "Vender" no widget principal, que tem fundo distinto quando ativa.
Direcionamento Kotai: estado ativo explícito (cor de fundo, contorno) e microcopy curto acima ("Filtrar por método de saque"). Permitir multi-seleção (banco E débito) com chips toggláveis. Trade-off: mais um label de seção; mas elimina confusão filtro-vs-botão.
^friccao-3
🟡 Oportunidade competitiva (alta leverage — comparador de provedores) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch — todos delegam off-ramp pra provedores sem comparativo de tarifas visível. (2) ✓ Afeta iniciante diretamente — sem comparativo, ele tende a escolher pelo logo conhecido, não pelo melhor preço. (3) ✓ Razão de ninguém resolver: integração com APIs de provedores é manutenção contínua, fees mudam dinamicamente. (4) ✓ Diferença perceptível — usuário sente quando o app "economiza por mim" em vez de me obrigar a comparar manualmente.
Diferenciação Kotai: comparador inline mostrando taxa efetiva por provedor (com timestamp do cálculo), método aceito e tempo médio de cashout. Selo automático "melhor opção pra você" baseado em região + método. Trade-off: instrumentação contínua das APIs; usuário paranóico desconfia da curadoria — disponibilizar "ver todos os provedores" sem ranking como modo expert.
^oportunidade-1
Função: Página de detalhe de um token específico (URL /explore/tokens/ethereum/NATIVE), combinando dados de mercado (preço, gráfico, estatísticas) com widget de trade pré-configurado pra esse token. Análogo a "ficha do token" em corretora tradicional. Estado base: carteira desconectada.
Componentes
Regras de negócio
/explore/tokens/<chain>/<address|NATIVE> — "NATIVE" indica token nativo da chain (sem contract address)/swap, onde ETH é default no card Vender (paradigma "você quer trocar ETH por outra coisa")🟢 Insight 1 — análise + ação na mesma viewport Gráfico à esquerda, widget à direita, estatísticas embaixo: o usuário pode olhar histórico de preço e executar trade sem trocar de página. Padrão a herdar pra Kotai — quando a decisão de operar depende da análise, juntar os dois reduz fricção drasticamente (alternativa típica: olhar preço no CoinGecko, copiar contract, voltar pro DEX, colar). Trade-off: viewport densa exige hierarquia visual cuidadosa.
^insight-1
🟢 Insight 2 — paradigma inverso do widget global (contexto da página define o padrão)
Em /swap, ETH default = Vender ("vou trocar meu ETH por outra coisa"). Aqui em /tokens/ethereum, ETH default = Comprar ("vim aqui pra adquirir ETH"). Padrão a herdar — o widget reutilizável adapta defaults conforme o contexto da página em vez de manter posição fixa. Reduz cliques (não precisa inverter manualmente).
^insight-2
🟢 Insight 3 — "Todas as redes" como dropdown de filtro Permite ver ETH agregado (todas as chains) ou filtrar por rede específica sem trocar a rede da wallet. Padrão a herdar — multichain como atributo de análise (filtro), não como ação destrutiva (troca de rede na wallet). Usuário compara liquidez do mesmo token em diferentes chains sem fricção.
^insight-3
🔴 Fricção 1 (estrutural — "Selecionar token" rosa compete com CTA primário) O botão rosa "Selecionar token ▾" no card Vender e o CTA "Conectar carteira" rosa atenuado abaixo competem visualmente. Pra iniciante, dois botões rosas com tipografia parecida no mesmo card sugerem hierarquia ambígua — qual é o próximo passo? O "Selecionar token" parece mais ativo (rosa pleno) que o "Conectar carteira" (rosa atenuado), invertendo a hierarquia real do flow (conectar deveria vir primeiro).
Por que solução óbvia falha: tornar "Selecionar token" cinza igualaria o estado dele ao de um campo desabilitado, mas ele é clicável e funcional mesmo antes de conectar. Esconder até a wallet conectar tira a affordance.
Direcionamento Kotai: usar peso visual em escala (CTA primário rosa pleno fora do card; controles dentro do card em outline/secundário). Isto reserva a cor rosa pra "próxima ação primária" sempre — quando estado muda (conectado), o CTA primário muda e o controle interno mantém estilo secundário. Trade-off: redesign do design system pra escala consistente; mas elimina ambiguidade visual.
Perfil afetado: iniciante (não decodifica hierarquia visual entre dois rosas) e intermediário.
^friccao-1
🔴 Fricção 2 (estrutural — "Todas as redes" agrega dados sem explicar agregação) Preço 2362,30 US$ — é o preço médio entre redes? O da Ethereum mainnet ponderado por volume? Pra iniciante (e mesmo intermediário), não está claro. Pior, ETH em diferentes redes tem preços ligeiramente diferentes (arbitragem entre L2s) e diferentes liquidez — agregar pode mascarar essas diferenças.
Direcionamento Kotai: quando "Todas as redes" está ativo, exibir microcopy abaixo do preço ("Preço médio ponderado por volume — varia por rede") + tooltip explicando metodologia. Trade-off: mais texto perto do número mais importante da página; mas elimina o "qual preço é esse exatamente?".
Perfil afetado: iniciante (interpreta preço como verdade única) e intermediário que opera em múltiplas chains.
^friccao-2
🟡 Oportunidade competitiva — Educação inline para métricas DeFi (FDV / TVL / Valor de mercado / Volume)
^oportunidade-1

Função: Estado em que a carteira está conectada (0xd09B…618a) mas o input US$100 produz erro: aviso em vermelho "Mínimo de 0,010 ETH" e sub-line "0 ETH" indicando ausência de saldo. CTA "Continuar" disabled.
Componentes
Regras de negócio
🟢 Insight — CTA contextual disabled distinto visualmente do estado conectar "Continuar" cinza/disabled é semanticamente distinto do "Conectar carteira" rosa atenuado do #1. A mesma trilha que vimos em Ordem-limite (Conectar → Continuar disabled → Continuar ativo) e Swap (Conectar → Adicionar fundos → Fazer swap) — confirma o padrão central do widget como regra estrutural transversal.
^insight-1
🔴 Fricção 1 (estrutural — sub-line "0 ETH" é triplamente ambíguo) "0 ETH" abaixo de "US$100" pode ser interpretado como: (a) conversão do valor digitado (US$100 = 0 ETH?) — matematicamente errado (US$100 ≈ 0,042 ETH) (b) saldo disponível na wallet (você tem 0 ETH) (c) quantidade que será vendida (você venderá 0 ETH?)
Iniciante não tem como saber qual é. Pior: se for (b) saldo, falta o rótulo "Saldo:"; se for (a) conversão, está errado matematicamente; se for (c) tentando vender 0 ETH, US$100 não faz sentido.
Direcionamento Kotai: rotular explicitamente a sub-line — "Saldo: 0 ETH" pra deixar inequívoco que é o limite, não a conversão. A conversão do input deve aparecer separada ("Você venderá ~0,042 ETH" em outra linha, em fonte menor). Trade-off: mais texto no card; mas elimina o "três interpretações pra um número".
^friccao-1
🔴 Fricção 2 (estrutural — aviso "Mínimo de 0,010 ETH" sem contexto) "Mínimo de 0,010 ETH" em vermelho sem explicação do "por quê" — é mínimo do contrato? Do provedor? Da rede? Iniciante não sabe se conseguir 0,010 ETH resolve, ou se é alguma outra coisa (gas, taxa, slippage). Pior: o número aparece como sentença incompleta gramaticalmente ("Mínimo de 0,010 ETH o quê?" — venda? saldo? input?).
Por que solução óbvia falha: expor "mínimo do provedor MoonPay/Transak" ainda no estado pré-seleção de provedor é prematuro — usuário nem escolheu provedor ainda. Mas omitir a causa cria o vácuo atual.
Direcionamento Kotai: rótulo completo + tooltip: "Venda mínima: 0,010 ETH (~US$23,67) — exigência dos provedores de saque." E quando o usuário aumentar o input acima do mínimo, ocultar o aviso. Trade-off: mais texto; mas elimina o "0,010 ETH e tô lascado".
^friccao-2
🔴 Fricção 3 (estrutural — múltiplos erros sobrepostos sem priorização) A tela tem simultaneamente: aviso de mínimo, sub-line "0 ETH" (saldo zero), e CTA disabled. Pra iniciante, são três sinais negativos competindo por atenção sem hierarquia de qual resolver primeiro. Resolver o mínimo (digitar mais) não adianta porque saldo é zero; resolver o saldo (depositar ETH) torna o mínimo informativo, não bloqueante.
A solução óbvia (CTA contextual "Você precisa de ETH na carteira pra vender" rosa ativo, abrindo onramp) seria melhor que três erros + CTA cinza inerte.
Direcionamento Kotai: detectar a causa raiz (saldo zero) e priorizar — o CTA deve refletir a próxima ação útil ("Adicionar ETH na carteira pra vender") em vez de "Continuar disabled". Avisos secundários (mínimo) ficam pra quando o usuário tem saldo > 0 mas digita abaixo do mínimo. Trade-off: lógica condicional de prioridade de erros; mas elimina o "três erros disputando atenção".
^friccao-3

Função: Tab "Vender" do widget principal (off-ramp: cripto → fiat), com carteira desconectada. Permite explorar os parâmetros antes de conectar a wallet, com CTA contextual de conexão. URL: /sell.
Componentes
Regras de negócio
🟢 Insight 1 — paradigma "receba em fiat" como big stat (semântica correta de off-ramp) Diferente do Comprar (onde fiat big stat = "quanto vou gastar") e do Swap (onde token big stat = "quanto vou trocar"), aqui o fiat big stat representa "quanto vou receber" — o resultado final, não a entrada. Esta inversão de leitura é coerente com a intenção do usuário em vender: ele pensa em "quero R$X / US$X no banco", não em "quero vender 0,XX ETH". Padrão a herdar — quando a operação é direcionada a um resultado tangível (fiat na conta), big stat = resultado, não entrada.
^insight-1
🟢 Insight 2 — presets % em vez de valores absolutos Comprar usa valores fixos (US$100/300/1000); Vender usa percentuais (25/50/75/Máx). Asymmetric inteligente — em Comprar o usuário pensa em "tenho R$X disponíveis pra investir"; em Vender pensa em "quero realizar X% da minha posição". Padrão correto a herdar.
^insight-2
🟢 Insight 3 — CTA contextual coerente com outros flows "Conectar carteira" rosa ativa segue o mesmo padrão do Swap/Ordem-limite/Comprar — o widget é explorável sem conectar, e o botão primário muda contextualmente conforme o estado. Reforça o padrão central já validado em três outros flows.
^insight-3
🔴 Fricção 1 (estrutural — presets disabled silenciosos) Os presets 25/50/75/Máx aparecem visualmente cinza/inertes mas sem explicação. Iniciante vê quatro chips que parecem clicáveis (estão lá, têm rótulo), tenta clicar, nada acontece. Não há tooltip, não há microcopy abaixo dizendo "Conecte sua carteira para usar atalhos de percentual" ou "Disponíveis após conectar carteira com saldo de ETH". A presença visual de UI inerte sem feedback de causa é forma silenciosa de fricção.
Por que solução óbvia falha: ocultar os presets quando disabled muda o layout entre estados (sem preset → com preset), criando "salto" visual ao conectar. Manter visíveis dá pista do que existe; problema é só comunicar o porquê.
Direcionamento Kotai: manter presets visíveis mas com microcopy abaixo ("Conecte sua carteira para usar atalhos %") OU tooltip on-hover. Em mobile, label inline. Trade-off: mais texto no widget; mas elimina UI inerte sem causa visível.
^friccao-1
🔴 Fricção 2 (estrutural — dissonância flag BR + valor US$, paralelo ao Comprar #1) Mesmo bug semântico já identificado no Comprar #1: a flag brasileira no canto direito sugere "região = Brasil", mas o big stat aparece em US$, não em R$. Pra iniciante brasileiro, isto cria pergunta imediata: "se eu vendo ETH, recebo dólar ou real?". Off-ramp pra brasileiros normalmente termina em PIX/BRL via parceiros (MoonPay, Transak, Mercado Bitcoin) — então R$ seria o valor relevante de cashout.
Por que solução óbvia falha: nem todos os fiat têm conversão direta off-ramp; manter USD como denominação técnica universal é defensável. Mas então a flag BR não deveria estar lá como rótulo de "região default" — confunde.
Direcionamento Kotai: se o seletor de região define o fiat de cashout, big stat e presets devem refletir esse fiat (BR → R$, US → US$, etc). Se a região afeta só lista de provedores, separar visualmente "fiat de exibição" de "região de cashout". Trade-off: dois controles distintos onde a Uniswap tem um; mas alinha rótulo visual ao valor exibido.
^friccao-2
🔴 Fricção 3 (cosmética — falta de microcopy explicando a tab) "Você está vendendo" como header da operação é tecnicamente correto, mas não comunica o destino do dinheiro. Iniciante pode pensar: "vender pra quem? Pra outra crypto?". A diferença entre swap (cripto→cripto) e vender (cripto→fiat) não é explícita.
Direcionamento Kotai: sub-rótulo curto abaixo do header: "Receba em reais via PIX/transferência" (quando região BR). Trade-off: texto adicional; mas elimina ambiguidade swap/off-ramp.
^friccao-3


Função: Estado completo da ordem-limite com 1 ETH em Vender e 2367,42 USDC auto-calculado em Comprar. CTA "Confirmar" rosa ativo — pronto pra abrir o modal de revisão.
Componentes
Regras de negócio
🟢 Insight 1 — auto-cálculo bidirecional com âncora explícita (preço-alvo fixo) A relação Vender × Preço = Comprar é deterministicamente calculada, mas o modelo mental subjacente é claro: o preço-alvo é a âncora; quantidade Vender e Comprar são derivações. Diferente do swap (onde a âncora é o preço de mercado e a quantidade é livre), aqui o usuário escolhe o preço e o sistema preserva ele. Padrão a herdar: quando há três variáveis ligadas por equação, escolher claramente qual é a âncora e quais são derivadas evita ambiguidade.
^insight-1
🟢 Insight 2 — fluência simétrica com o swap Card Vender / inversão / card Comprar / CTA — exatamente a mesma estrutura visual do Swap. Usuário que aprende swap não precisa reaprender ordem-limite; só entende que tem um header novo (preço-alvo + presets) e uma expiração. Padrão a herdar — quando duas funcionalidades compartilham mental model (par de tokens), preservar arquitetura visual e ajustar só o que é específico.
^insight-2
🔴 Fricção 1 (estrutural — ausência de check de saldo neste estado) Diferente do Swap (que mostra cor vermelha + banner quando valor > saldo desde a digitação — vide Swap #2), aqui a tela aceita "1 ETH" sem verificar se o usuário tem 1 ETH. O check só acontece no modal/execução. Iniciante completa o flow inteiro, clica "Confirmar", e só então descobre que não tem saldo — ou pior, a ordem é criada e fica esperando enquanto o usuário tampouco tem o ETH pra cumprir quando preço atingir.
Comportamento real on-chain: limit orders na Uniswap são executadas por fillers que precisam do token disponível no momento do match. Se o usuário não tem saldo quando preço atinge, ordem falha silenciosamente. Iniciante não tem como saber disso.
Por que solução óbvia falha: bloquear a criação da ordem quando saldo < quantidade Vender impede uso legítimo — usuário pode planejar ter ETH disponível só no momento da execução (depósito programado, recebimento esperado). Bloquear é paternalismo.
Direcionamento Kotai: aviso inline (não-bloqueante) ao digitar valor > saldo: "Você tem 0 ETH agora. Pra esta ordem executar, precisa ter ≥1 ETH disponível quando o preço atingir 2367,42 USDC." Permitir criar a ordem mesmo assim. Trade-off: mais um estado intermediário, mas elimina o silent fail que erode confiança no produto.
^friccao-1
🔴 Fricção 2 (estrutural — preço-alvo "Mercado" é incoerente como limit order) Preset "Mercado" selecionado significa "execute quando atingir o preço atual" — que é literalmente um swap normal. Não há sentido funcional em criar uma limit order com preço-alvo = mercado: o execution é imediato (ou imediatamente futuro), o que é exatamente o que o swap já faz, sem custos de off-chain matching e sem risco de não-execução.
Por que solução óbvia falha: remover o preset "Mercado" elimina o ponto de partida natural ("começa do mercado e ajusta"). Manter como ponto inicial mas avisar quando usuário tenta confirmar com Mercado="0% delta" seria educativo.
Direcionamento Kotai: ao confirmar com preset Mercado, modal de revisão (vide #5) destaca: "Esta ordem executa ao preço atual de mercado. Pra esse caso, um swap normal é mais rápido e barato. Continuar mesmo assim?" Trade-off: fricção extra num caso de borda, mas educa usuário sobre quando limit order faz sentido versus swap.
^friccao-2
Função: Popover/tooltip que aparece sobre o card Comprar (ou sobre o CTA Confirmar) explicando que pra criar uma ordem-limite com ETH, é preciso primeiro fazer o "wrap" (converter ETH → WETH). Apresenta o passo como ação separada com link educacional.
Componentes
Regras de negócio
🟢 Insight 1 — sequência de passos exposta antes da execução Em vez de iniciar wrap silenciosamente e mostrar dois prompts de wallet em sequência (wrap, depois ordem), a Uniswap enumera os passos antes — wrap aparece como linha 1, confirmar como linha 2 cinza. Padrão a herdar: quando uma ação do usuário se desdobra em múltiplas transações on-chain, mostrar a fila de passos antes de iniciar — não no meio. Reduz ansiedade ("quantos prompts ainda virão?") e permite cancelar antes do primeiro gas.
^insight-1
🟢 Insight 2 — link educacional inline "Por que tenho que fazer wrap?" Em vez de mergulhar o usuário em wrap sem contexto, oferece pergunta-ponte ("Por que tenho que fazer wrap do meu ETH?") como link rosa, na linguagem do usuário. Padrão a herdar: quando uma ação tem motivo técnico não-óbvio (wrap, approve, sign typed data, gasless), oferecer link "Por que isto é necessário?" inline — a curiosidade do iniciante é convertida em aprendizado em vez de fricção.
^insight-2
🔴 Fricção 1 (estrutural — wrap é fricção técnica que iniciante não esperava) Pro iniciante, "ETH é ETH". Descobrir, no momento de confirmar a ordem, que precisa antes "envelopar" ETH pra um token chamado WETH, paga gas pra isso, e depois ainda paga gas pela ordem — é fricção surpresa. O widget anterior (#3) mostrou "Vender 1 ETH" como se fosse direto; só aqui aparece WETH como pré-requisito.
Por que solução óbvia falha: fazer wrap silencioso sem prompt esconde do usuário a transação extra que ele está pagando; pior, fragmenta o entendimento do que está acontecendo on-chain.
Direcionamento Kotai: pré-anunciar o passo wrap no widget (não no modal de confirmação), assim que o usuário seleciona ETH como Vender em uma limit order. Pode ser uma linha pequena abaixo do card: "Ordem-limite com ETH requer wrap (1 transação extra, ~0,03 US$)". Trade-off: mais texto no widget; mas elimina o "fui confirmar e apareceu mais um passo". Pode ser dismissed/colapsável após primeira visualização.
^friccao-1
🔴 Fricção 2 (estrutural — passo "Confirmar" cinza não comunica "vai ficar habilitado depois") A linha "Confirmar" cinza/disabled abaixo de "Fazer wrap" sugere passo bloqueado, mas não comunica que após o wrap completar, ele ficará habilitado automaticamente. Iniciante pode pensar que o popover inteiro é informativo (não acionável) ou que precisa cancelar e refazer.
Direcionamento Kotai: numerar os passos explicitamente ("Passo 1 de 2: Wrap ETH" / "Passo 2 de 2: Confirmar ordem") com indicador de progresso (checkbox vazio → checkbox cheio). Microcopy: "Próximo passo após wrap". Trade-off: mais elementos visuais; mas elimina ambiguidade do "está bloqueado pra sempre?".
^friccao-2
🟡 Oportunidade competitiva (média leverage — abstrair wrap nativo) Pergunta-teste: (1) ✓ Uniswap, 1inch, Matcha, CoW Swap — todos expõem wrap como passo separado em limit orders com ETH. (2) ✓ Afeta iniciante diretamente — é a primeira vez que o usuário encontra o conceito WETH. (3) ✓ Razão de ninguém abstrair: smart contract da pool aceita só WETH; UX teria que orquestrar wrap+ordem como meta-transação ou usar relayer.
Diferenciação Kotai: tratar wrap como detalhe de implementação, não como passo do usuário. Opções: (a) usar permit + meta-transaction pra combinar wrap+ordem numa só assinatura (gasless via relayer); (b) pré-wrappar quando o usuário deposita ETH na primeira vez, mantendo saldo em WETH (com swap implícito de volta quando ele quer ETH nativo). Trade-off: complexidade de smart-contract/infra (relayer, ou contrato wrapper que orquestra); fricção de "saldo em WETH" se usuário olha wallet externa. Vantagem: elimina o conceito "wrap" da mente do iniciante completamente.
^oportunidade-1
Observação estrutural — sequência canônica do fluxo Ordem-limite mapeado Conectado #1 (desconectado) → #2 (conectado vazio, CTA disabled) → #3 (conectado preenchido, CTA ativo) → #4 (par invertido com erro de oracle) → #6 popover wrap → #5 modal revisar (intercala wrap antes do modal final). A sequência real do flow é #3 → #6 (interceptação wrap) → #5 (modal pós-wrap) → criação on-chain. Não há tela #7 "pós-criação" no fluxo desktop atual — a ordem criada provavelmente aparece em "Atividades" no Portfólio (vide outro flow do canvas).
^observacao-1
Função: Modal de confirmação final antes de assinar a transação que cria a ordem on-chain. Consolida todos os parâmetros (par, preço-limite, expiração, taxas) e expõe os custos reais — incluindo o custo de cancelamento.
Componentes
Regras de negócio
🟢 Insight 1 — exposição honesta do custo de cancelamento (trust signal) "Canceling a limit has a network cost" é um disclaimer raro. A maioria dos DEXs trata cancelamento como ação trivial (mesma UX de cancelar email rascunho), mas on-chain cancelar é uma transação que paga gas. Expor isso antes de criar — não depois quando o usuário tenta cancelar — é trust signal. Padrão a herdar pra Kotai: custos ocultos do paradigma blockchain (cancelamento, troca de approval, revogação) precisam ser anunciados no momento da criação, não no momento do desfazer.
^insight-1
🟢 Insight 2 — entrada "Pedir ajuda" contextual dentro do modal Botão "📩 Pedir ajuda" no header do modal coloca support no momento de maior fricção cognitiva (revisão final de uma operação que envolve dinheiro real, com termos como WETH/expiração/gas). Padrão a herdar — ajuda contextual deve aparecer onde a decisão acontece, não num menu lateral global.
^insight-2
🟢 Insight 3 — dual display (token + USD) em todos os valores principais Vender 1,00 ETH / 2362,83 US$; Comprar 2361,19 USDC / 2361,19 US$. Cada valor de token tem sua conversão em USD logo abaixo. Padrão escaneável tanto pra usuário cripto-fluente (lê o token) quanto pra iniciante (lê o USD). Aplicar como regra no Kotai: valores monetários grandes sempre em par token + USD.
^insight-3
🟢 Insight 4 — modal de revisão como pré-voo: todos os parâmetros visíveis antes de assinar O modal "Revisar ordem-limite" consolida em tela única: par (Vender 1,00 ETH / Comprar 2361,19 USDC), preço-limite, expiração absoluta, tarifa de protocolo, taxa de rede estimada e custo de cancelamento — antes de qualquer assinatura. O usuário tem visão completa da operação sem navegar entre telas. Padrão a herdar no Kotai: qualquer ação multi-parâmetro deve ter tela de revisão que exiba todos os parâmetros e custos antes da assinatura — nenhuma surpresa pós-confirmação.
^insight-4
🔴 Fricção 1 (estrutural — preço-limite usa WETH e denominação invertida) "Preço-limite: 1 USDC = 0,00042 WETH (1,00 US$)" — dois problemas combinados:
(a) WETH ≠ ETH para o iniciante: o usuário escolheu vender ETH (#3 mostrou "1 ETH"), mas o modal mostra "WETH" — sem explicação. Iniciante não sabe que limit orders na Uniswap exigem que o ETH seja "envelopado" pra WETH (ERC-20 padrão) pra ser comerciável on-chain. Isto vai aparecer com mais força no popover de wrap (#6) mas a primeira menção a WETH é aqui, sem aviso.
(b) Denominação invertida: o usuário definiu "Quando 1 ETH valer 2367,42 USDC" e o modal mostra "1 USDC = 0,00042 WETH" — exigindo inversão mental (1/0,00042 ≈ 2381, próximo do alvo, mas não é o número que ele setou). Pior, o número exibido é diferente do preço setado (2367,42), o que parece divergência.
Direcionamento Kotai: (a) manter denominação token/USDC do widget no modal — se setou "1 ETH = 2367,42 USDC", mostrar exatamente assim. (b) usar "ETH" como label e mostrar "(wrap pra WETH automático)" como nota técnica colapsável. Trade-off: tradução constante WETH↔ETH na camada de UI; mas alinha modal ao mental model que o usuário construiu no widget.
^friccao-1
🔴 Fricção 2 (estrutural — i18n bug "Canceling a limit has a network cost") Frase em inglês em meio a texto português. Bug de tradução visível pra qualquer leitor PT-BR. A frase em questão é justamente a mais informativa do disclaimer (custo de cancelar) — e fica como ilha em inglês exatamente onde a tradução era mais necessária.
Padrão sistêmico já identificado em outros pontos do canvas (banner "30 minutes" em #8 Swap, country list em EN no #5 Comprar). Direcionamento Kotai: pipeline de i18n com lint que falha build se uma string PT-BR contém >3 palavras em inglês consecutivas (heurística simples mas pega 90% dos casos). Trade-off: false positives em termos técnicos legítimos (ETH, WETH, swap); whitelist termina o fix.
^friccao-2

Função: Estado em que o usuário inverteu o par (agora Vender = USDC, Comprar = ETH). Card de preço-alvo passa de "1 ETH = 2367,42 USDC" pra denominação inversa, e os presets de variação adaptam o sinal de "+" pra "−". Estado adicional: erro técnico "Preço de mercado não disponível".
Componentes
Regras de negócio
🟢 Insight 1 — presets relativos adaptam sinal por direção (corrige fricção sugerida em #1) Quando o par é invertido pra "comprar ETH com USDC", os presets viram −1% / −5% / −10% — o que faz sentido pra "comprar abaixo do mercado". Isto invalida a fricção que eu sugeri no relatório #1 sobre presets unidirecionais: a Uniswap já adapta o sinal pela direção do par. Correção retroativa pro #1: o padrão está correto; o sinal do preset é função de Vender/Comprar, não fixo. Reaproveitar como padrão Kotai sem ressalva.
^insight-1
🟢 Insight 2 — dois banners semanticamente distintos (vermelho ≠ amarelo) A tela exibe simultaneamente banner vermelho (erro técnico transitório: "preço de mercado não disponível") e banner amarelo (disclaimer permanente: "ordens podem não executar"). Cor diferencia categoria: vermelho = bloqueante temporário; amarelo = aviso comportamental. Padrão a herdar — codificar severidade e duração via cor de forma consistente em toda a UI.
^insight-2
🟢 Insight 3 — denominação canônica "1 ETH" persiste mesmo no par invertido Mesmo com o par invertido, o card de preço continua escrito "Quando 1 ETH valer" (não "Quando 1 USDC valer"). Isto preserva o mental model de "preço do ETH" como métrica âncora — mais legível pra iniciante do que reler o número em escala invertida (0,000422401). Padrão correto. Aplicável a qualquer par token/stablecoin: denominação fica no token "volátil", não no stablecoin.
^insight-3
🔴 Fricção 1 (estrutural — banner de erro sem ação primária além de "tente novamente") O banner "Preço de mercado não disponível" sugere "verifique sua conexão de rede" como ação. Mas a real causa pode ser: API/oracle offline, par sem liquidez suficiente pra cotação, RPC rate-limited, etc. — nenhuma resolvível pelo usuário "verificando conexão". O texto culpa o usuário ("sua conexão") quando o problema é do backend.
Por que solução óbvia falha: detectar causa exata é caro (precisa instrumentação no backend); mensagem genérica é tentativa low-effort de cobrir todos os casos.
Direcionamento Kotai: separar erros por origem — "Sem dados do oracle no momento (tente em alguns segundos)" para falha de price feed, "Sem conexão" só quando navegador realmente está offline. Pra erro de oracle, oferecer botão "Recarregar cotação" inline em vez de "tente novamente" abstrato. Trade-off: classificação de erro exige instrumentação; mas elimina o "culpa o usuário".
^friccao-1
🔴 Fricção 2 (cosmética — precisão decimal em ETH ofuscante) Comprar exibe "0,000422401 ETH" — 6 dígitos decimais. Pra iniciante, esse número é ilegível ("é 4 décimos? 4 milésimos?"). USDC mostra valor escaneável (1), mas o ETH derivado obriga a contar zeros.
Por que solução óbvia falha: truncar pra 4 dígitos (0,0004 ETH) perde precisão real do cálculo e pode dar resultado errado se usuário usa esse número noutro contexto.
Direcionamento Kotai: dual display — número grande arredondado pra escala humana ("≈ 0,0004 ETH") + número técnico completo abaixo em fonte menor ("0,000422401 ETH"). Trade-off: mais texto no card, mas elimina o "quantos zeros mesmo?". Já é padrão da própria Uniswap em outros pontos (vide #5 — modal Revisar mostra "1,00 ETH" + "2362,83 US$" como dual display).
^friccao-2
Função: Estado intermediário com carteira conectada (0xd09B…618a no header) mas sem valor digitado nos cards Vender/Comprar. CTA passa de "Conectar carteira" pra "Confirmar" em estado disabled.
Componentes
Regras de negócio
🟢 Insight 1 — sequência clara de CTAs contextuais ao longo do flow A trilha "Conectar carteira (#1)" → "Confirmar disabled (#2)" → "Confirmar ativo (#3)" entrega ao usuário um caminho visualmente legível: cada estado tem UM botão primário coerente com a próxima ação. Isto valida o padrão central já identificado no Swap: o botão primário é sempre a "próxima ação útil", nunca um "Fazer ordem-limite" disabled genérico. Padrão a herdar como regra estrutural do widget Kotai.
^insight-1
🟢 Insight 2 — atualização do preço de mercado em tempo real (mesmo sem input) O número do preço-alvo (Mercado) atualiza continuamente (2367,77 → 2365,96) sem ação do usuário. Padrão correto — quando o preset selecionado é "Mercado", o valor deve refletir o mercado em real-time, não congelar no momento que o usuário abriu a tela.
^insight-2
🔴 Fricção 1 (estrutural — "Confirmar disabled" sem indicação do que falta) O CTA está cinza e clicar não faz nada, mas o widget não diz POR QUE — falta valor em Vender? Em Comprar? Preço inválido? Pra iniciante, "Confirmar" cinza num widget com vários campos vazios não comunica qual campo é o bloqueante.
Por que solução óbvia falha: substituir o rótulo por "Digite um valor pra continuar" funciona neste estado específico, mas se o motivo for outro (preço-alvo fora de range, expiração inválida) cada caso precisa de string própria — manutenção e i18n viram peso.
Direcionamento Kotai: rótulo dinâmico do CTA refletindo o gap atual ("Digite um valor pra vender" / "Selecione um token de compra" / "Defina o preço-alvo"). Quando todos os requisitos estão atendidos, vira "Revisar ordem". Trade-off: mais estados de string, mas elimina o "clico no botão e não faz nada" que iniciante tenta antes de ler.
^friccao-1
🔴 Fricção 2 (cosmética — duplicação do preço entre "Mercado" e card de preço-alvo) Quando o preset "Mercado" está selecionado, o número exibido no card é exatamente o preço de mercado. Mas a tela não comunica "este é o preço que será usado" — o usuário pode pensar que precisa digitar algo em outro lugar. O fato de o preço-alvo aparecer como valor grande mas o input estar implícito no preset gera dissonância.
Direcionamento Kotai: ou tornar o número clicável/editável diretamente (com presets como atalhos), ou rotular explicitamente "Preço-alvo: 2365,96 USDC (preço de mercado)" pra deixar claro que este é O input já preenchido pelo preset. Trade-off: layout mais textual; mas elimina ambiguidade sobre "esse número é informativo ou é o preço da ordem?".
^friccao-2
O fluxo de Ordem Limite da Uniswap reaproveita a gramática de swap para reduzir reaprendizado: campo de venda, inversão, campo de compra, preço e CTA progressivo. Isso é uma decisão forte para usuário intermediário, porque preserva a familiaridade visual enquanto introduz uma operação mais condicional analises/uniswap/ordem-limite/ordem-limite-03.md#^insight-2.
A tensão principal do fluxo é que a intenção do usuário é simples ("vender quando chegar neste preço"), mas a execução carrega requisitos técnicos que aparecem tarde: wrap para WETH, revisão com denominação invertida e estados bloqueados. Para iniciante, isso cria um fluxo que parece fácil até o momento em que a interface exige conhecimento de infraestrutura analises/uniswap/ordem-limite/ordem-limite-05.md#^friccao-1 analises/uniswap/ordem-limite/ordem-limite-06.md#^friccao-1.
Vender × Preço = Comprar, com o preço como variável dominante analises/uniswap/ordem-limite/ordem-limite-01.md#^insight-1 analises/uniswap/ordem-limite/ordem-limite-03.md#^insight-1. Mesmo quando o par é invertido, a denominação canônica "1 ETH" evita expor o usuário a números muito pequenos como âncora principal analises/uniswap/ordem-limite/ordem-limite-04.md#^insight-3.+1%/+5%/+10% e −1%/−5%/−10% permitem que o usuário pense em intenção relativa ao mercado, não em preço absoluto analises/uniswap/ordem-limite/ordem-limite-01.md#^insight-2 analises/uniswap/ordem-limite/ordem-limite-04.md#^insight-1. Esse padrão é especialmente útil para intermediários que sabem a direção desejada, mas não querem calcular preço manualmente.#1, #2, #3, #4 e reaparece expandido no modal de revisão #5 analises/uniswap/ordem-limite/ordem-limite-01.md#^friccao-2 analises/uniswap/ordem-limite/ordem-limite-02.md analises/uniswap/ordem-limite/ordem-limite-03.md analises/uniswap/ordem-limite/ordem-limite-04.md analises/uniswap/ordem-limite/ordem-limite-05.md. Diagnóstico: a mensagem é honesta sobre ordens-limite não executarem automaticamente, mas por ser permanente e genérica deixa de orientar a decisão. Não deve ser agrupada com o erro vermelho de oracle/conexão, porque são severidades e naturezas diferentes. Alternativa Kotai: converter o disclaimer estático em feedback contextual quando preço-alvo, expiração ou liquidez tornarem a execução improvável. Trade-off: exige dados/heurística de execução, mas reduz ruído recorrente e transforma alerta abstrato em sinal acionável.#3 permite avançar com valor possivelmente maior que o saldo; aviso não-bloqueante reduziria falha silenciosa sem impedir exploração analises/uniswap/ordem-limite/ordem-limite-03.md#^friccao-1.Mercado no widget: em #2, o número grande parece cotação informativa, mas também é o preço-alvo efetivo do preset selecionado; rotular como "Preço-alvo: mercado atual" ou tornar o valor editável reduziria essa dúvida analises/uniswap/ordem-limite/ordem-limite-02.md#^friccao-2.Mercado é bom ponto de partida, mas confirmar ordem a 0% de delta se aproxima de swap normal analises/uniswap/ordem-limite/ordem-limite-03.md#^friccao-2.#4 analises/uniswap/ordem-limite/ordem-limite-04.md#^friccao-1.0,000422401 ETH pede arredondamento orientado a decisão, com valor técnico completo em segundo plano; o dual display do modal é referência útil, mas esta fricção aparece explicitamente em uma tela só analises/uniswap/ordem-limite/ordem-limite-04.md#^friccao-2 analises/uniswap/ordem-limite/ordem-limite-05.md#^insight-3.Consolidação produzida pelo pipeline Codex a partir de um subagent ux_lote_analyst dedicado ao lote 1, restrito às telas 1-6 informadas. Os arquivos individuais permanecem como fonte; este consolidado é derivado. Recorrências foram promovidas quando havia evidência em pelo menos duas telas ou presença visual persistente com impacto analítico no fluxo, como o disclaimer de não-execução em #1-#5. O item de wrap foi mantido apenas como hipótese competitiva forte porque a fonte local ainda não valida todos os concorrentes principais exigidos pela régua das 4 perguntas-teste do CLAUDE.md; na dúvida, oportunidades não são tratadas como aprovadas. Nenhum arquivo foi escrito em analises/uniswap/_consolidado e o canvas não foi alterado.


Função: Tab "Ordem-limite" do widget principal, com carteira desconectada. Permite definir preço-alvo e expiração antes de conectar a wallet (preview do flow), com CTA de conexão como ação primária.
Componentes
Regras de negócio
🟢 Insight 1 — paradigma "centrado em preço" no topo do widget A hierarquia visual coloca o preço-alvo como elemento dominante (fonte gigante, no topo) e os cards Vender/Comprar como secundários. Isto é semanticamente correto: numa limit order, a decisão crítica é "a que preço", não "quanto". Padrão a herdar pra Kotai — quando o paradigma da tela é diferente do swap, a hierarquia visual precisa refletir isso (não copiar a mesma estrutura visual do swap só trocando rótulos).
^insight-1
🟢 Insight 2 — presets relativos eliminam math mental "+1% / +5% / +10%" em vez de "2391" / "2486" / "2604" elimina cálculo manual ao mesmo tempo que mantém o número final visível. Padrão a herdar — sempre que o input depende de uma referência conhecida (preço de mercado), oferecer presets relativos é mais escaneável que presets absolutos.
^insight-2
🟢 Insight 3 — tab explorável sem conectar (CTA contextual) Mesmo padrão do Swap: usuário pode brincar com presets, mudar tokens, escolher expiração sem nunca conectar wallet. CTA muda contextualmente ("Conectar carteira" aqui; "Confirmar" quando conectado). Isto é o padrão central do widget — herdar como regra: o botão primário é a próxima ação possível, não um "fazer ordem-limite" disabled.
^insight-3
🔴 Fricção 1 (estrutural — presets relativos são unidirecionais "vender em alta") Os presets +1%/+5%/+10% só fazem sentido pra quem está vendendo e quer esperar uma alta. Pra quem quer COMPRAR (vender USDC, comprar ETH) abaixo do mercado, os presets ficam invertidos — seria preciso preset −1%/−5%/−10% pro caso "comprar barato". Hoje, o usuário que quer comprar dip tem que digitar o preço-alvo manual mesmo tendo o widget configurado pra par USDC→ETH.
Por que solução óbvia falha: oferecer 6 presets (−10/−5/−1/+1/+5/+10) polui a linha e exige decidir qual fica em destaque. Pior, o significado de "+" depende de qual lado é Vender — pode ser "acima" ou "abaixo".
Direcionamento Kotai: detectar a direção da operação (Vender ETH→USDC = preset "+" = vender mais alto; Vender USDC→ETH = preset "−" = comprar mais barato) e adaptar os presets pra sempre representarem "melhor preço pra você". Microcopy do header pode reforçar: "Vender ETH acima de" / "Comprar ETH abaixo de". Trade-off: lógica condicional na UI, mas alinha o atalho à intenção do usuário em vez de exigir tradução mental.
^friccao-1
🔴 Fricção 2 (cosmética — disclaimer pessimista sem ação) "É possível que ordens-limite não sejam executadas..." é honesto, mas é um banner permanente sem ação. O usuário lê uma vez, entende que pode dar errado, e a partir daí vira ruído. Pior: a frase deixa "não execução" como possibilidade abstrata, sem indicar O QUE leva a não-execução (preço muito longe, expiração curta, baixa liquidez no par).
Direcionamento Kotai: substituir disclaimer permanente por feedback dinâmico — quando o preço-alvo escolhido fica muito acima/abaixo do mercado (digamos >20%), exibir aviso contextual com estimativa de probabilidade ("Preço a 35% acima — historicamente menos de 5% das ordens nesse range executam em 1 semana"). Trade-off: exige dados de execução histórica; mas converte fricção genérica em sinal acionável.
^friccao-2







Função: Tooltip explicativo no hover/click do ícone "?" ao lado do toggle "Padrão". Define o que o algoritmo de roteamento considera quando o modo Padrão está ativo.
Componentes
Regras de negócio
🟢 Insight — tooltip honesto sobre o algoritmo de roteamento A copy é tecnicamente precisa: nomeia as fontes consideradas (pools v2, v3, alguns v4) e os fatores otimizados (impacto no preço + taxas de rede). Pra intermediário, é informação acionável — entende que o Padrão NÃO inclui todos os hooks v4. Padrão a herdar: tooltip que descreve o algoritmo de roteamento em uma frase, com fontes e critérios, é o nível certo de transparência.
^insight-1
🔴 Fricção 1 (estrutural — "alguns pools v4" é vago e contradiz #9/#11) "Alguns pools v4" sem qualificar quais (todos os v4 não-hook? v4 sem condições especiais? top N por volume? pools auditados?) deixa o usuário sem modelo mental de que v4 fica de fora. Pra avançado, isso pode importar (ex: par que só tem liquidez em hook v4 ficaria sub-otimizado pelo Padrão).
Pior: esta tooltip diz que o Padrão considera "pools v2, v3 e alguns v4". A microcopy do Padrão em #9 diz "Inclui ⚡ UniswapX". A tooltip do UniswapX em #11 diz que UniswapX "agrega fontes de liquidez". As três comunicações não são consistentes — o usuário que lê os três tem que reconciliar sozinho: o Padrão é (v2 + v3 + alguns v4) OU (UniswapX) OU ambos comparados, escolhendo o melhor? A copy aqui não menciona UniswapX, criando incerteza.
Direcionamento Kotai: tooltip do Padrão precisa listar todas as fontes consideradas ("Uma rota é identificada considerando UniswapX, pools v2, v3 e pools v4 sem hooks customizados, comparando preço final e taxas de rede. A melhor é selecionada."). Trade-off: copy mais longa, mas elimina inconsistência cross-tela.
^friccao-1
🔴 Fricção 2 (cosmética — ausência de "Saber mais" rompe padrão de #11 e #12) Diferente dos tooltips de UniswapX (#11) e Hook v4 (#12), este não tem link pra docs externas. Pra usuário que quer entender mais sobre como o algoritmo seleciona rota, dead-end.
Direcionamento Kotai: consistência editorial — todos os tooltips de termos técnicos devem ter "Saber mais" ou nenhum deve ter. Padrão consistente reduz fricção de descoberta.
Observação adicional (relatório original "Pre-execution" estava errado) O título original deste nó dizia "Pre-execution" — descrevendo uma tela de checkout/confirmação de swap. A imagem real mostra exclusivamente o tooltip do Padrão. Mesmo padrão de erro já identificado em outros nós (Comprar 6 e 7, Swap 10) — relatórios feitos por memória/aproximação em vez de inspeção visual. Vale alinhar processo de captura → relatório com inspeção lado-a-lado obrigatória.
^friccao-2
Função: Tela /swap após o usuário desconectar a carteira. Volta ao estado inicial sem persistir tokens selecionados ou valores digitados na sessão anterior.
Componentes
Regras de negócio
🟢 Insight — CTA contextual reflete o gap real Mesmo padrão de #1 e #6: o CTA NÃO é "Fazer swap" disabled, é "Conectar carteira" — a próxima ação útil pro contexto. Reforça o padrão Kotai de "botão primário = next-step alcançável". Stack de estados (desconectado / conectado-sem-saldo / conectado-com-saldo / erro de saldo) mapeia 1:1 com copy de CTA distinto.
^insight-1
🔴 Fricção (estrutural — NÃO persiste tokens entre sessões, ao contrário do que o relatório original afirmava) A intuição é que desconectar a carteira deveria preservar configuração da UI (token alvo selecionado, slippage, deadline) pra facilitar reconexão. A tela mostra o oposto: o token alvo "USDT" da sessão conectada é descartado e o card Comprar volta pra "Selecionar token". Usuário que desconectou pra trocar de wallet, conectar outra, ou voltar depois — perde o setup feito.
Importante: a observação anterior do relatório dizia "Persistir seleção de tokens entre sessões = continuidade de contexto" como insight positivo. É factualmente errado — a tela mostra exatamente o contrário (token alvo NÃO persistido). Sintoma clássico de relatório feito por memória/expectativa, não por inspeção visual. Já aconteceu em outros nós deste canvas.
Perfil mais afetado: intermediário que troca de wallet (uso comum) ou volta após pausa. Iniciante geralmente conecta uma vez e fica.
Por que solução óbvia falha: persistir indiscriminadamente entre sessões pode trazer pra sessão nova configurações irrelevantes (ex: usuário fez swap pra USDT em mainnet, próxima sessão é com wallet em Base — USDT mainnet não existe lá, gera erro).
Direcionamento Kotai: persistir token de origem (Vender) e quantidade no localStorage entre desconexões na mesma sessão de navegador; descartar ao trocar de rede, trocar de wallet ou fechar a tab. Pra token alvo (Comprar), persistir se existir na nova rede; caso contrário, prompt suave ("Você tinha USDT selecionado — disponível em Base. Continuar com USDT em Base?"). Trade-off: lógica de invalidação por contexto exige cuidado e testes; ganho concentrado em usuário que recorre.
^friccao-1
🟡 Oportunidade competitiva (média leverage) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch, Jupiter — todos descartam estado da UI ao desconectar (ou nunca tiveram). (2) ⚠ Afeta mais intermediário que troca/recorre wallet do que iniciante (que conecta uma vez e fica). Leverage média, não alta. (3) ✓ Razão de ninguém resolver: percebido como caso de uso nicho, lógica de invalidação por contexto não-trivial. (4) ✓ Diferença perceptível pra quem volta/troca wallet — economiza segundos por reconexão.
Diferenciação Kotai: persistência inteligente de estado da UI por sessão de navegador, com invalidação contextual. Trade-off: complexidade de regras de invalidação (rede mudou? wallet trocou? quanto tempo passou?); ganho concentrado em retenção de intermediário.
Observação adicional (consistência de CTA cross-estados) Vale registrar como ativo a tabela de CTAs contextuais do flow Swap, que está coerente em todos os estados:
| Estado | CTA primário |
|---|---|
| Desconectado (#14) | "Conectar carteira" |
| Conectado, saldo zero (#1) | "Adicionar fundos para fazer swap" |
| Saldo insuficiente com erro completo (#5) | "Adicionar fundos para fazer swap" |
| Cards de funding visíveis (#6) | CTA atenuado, cards primários |
| Ready to swap (não capturado) | "Fazer swap" |
Padrão a documentar formalmente como diretriz Kotai: cada estado de bloqueio tem CTA específico que é a próxima ação útil, não disabled state genérico.
^oportunidade-1



O fluxo de swap da Uniswap é tecnicamente sólido em estados de erro — stack de feedback redundante (cor + texto + ícone + CTA), CTA contextual em todos os estados (nunca botão disabled genérico) e tooltips on-demand pra jargão técnico. A arquitetura de "next-step alcançável" como botão primário é o ativo mais transferível do fluxo.
Mas falha em três eixos estratégicos pro target Kotai (iniciante/intermediário):
Iniciante paga em (1) e (2); intermediário paga em (2), (3) e na ausência de persistência cross-sessão.
Padrão central e estrutural do fluxo: o botão primário NUNCA é "Fazer swap" disabled — é sempre a próxima ação útil pro contexto ("Conectar carteira", "Adicionar fundos para fazer swap", "Selecionar token"). Mapeamento 1:1 entre estado de bloqueio e copy de CTA:
| Estado | CTA primário |
|---|---|
| Desconectado | "Conectar carteira" |
| Conectado, saldo zero | "Adicionar fundos para fazer swap" |
| Saldo insuficiente com erro completo | "Adicionar fundos para fazer swap" |
| Cards de funding visíveis | CTA atenua, cards ficam primários |
| Ready to swap | "Fazer swap" |
Padrão a herdar como diretriz Kotai: cada estado de bloqueio tem CTA específico que é a próxima ação útil. Disabled state genérico é admissão de derrota de produto.
Pattern dominante no fluxo: ícone "?" discreto ao lado de jargão técnico (slippage, rotear, UniswapX, hook v4, Padrão) abre tooltip curto com link "Saber mais" pra docs externas. Três camadas de profundidade (skim → contexto → técnico) atende iniciante curioso e avançado completista, sem poluir a tela pra quem não precisa. Padrão a herdar com uma condição: a curadoria do conteúdo do tooltip importa tanto quanto a existência do pattern (vide fricção "microcopy vaga ou circular"), e a consistência editorial entre tooltips precisa ser mantida (vide fricção "inconsistência cross-tela").
Quando o erro é estrutural (saldo insuficiente), o feedback acumula camadas: cor vermelha em todos os campos derivados da quantidade errada + ícone ⚠ + banner textual + CTA contextual. Cada camada cobre limitação da outra (cor é instantânea mas não acionável; texto exige leitura mas é claro; ícone reforça em não-cromático; CTA é a saída). Padrão a herdar como "stack de feedback" pra qualquer erro de bloqueio.
"Auto" no slippage, "Padrão" no routing, progressive disclosure ao desligar Padrão — toggles automáticos sempre acompanhados de microcopy curta explicando o benefício ("rota mais eficiente"), não o mecanismo. Iniciante não precisa entender como funciona, só sabe o que ganha. Padrão a herdar: sempre que houver toggle "deixar o sistema decidir", explicar o resultado em uma frase sem jargão.
Linha inline no card Comprar (ícones) + top row do modal (ícones + ticker visível) evitam abrir modal completo pra destino comum (USDC, USDT, WBTC, ETH variants). Padrão a herdar: não forçar modal completo quando os 5 destinos comuns cobrem a maioria. Implementar com ticker visível desde o atalho inline (ver fricção cosmética sobre ícones ambíguos).
Os 3 cards de funding ("Compre criptos / Receber criptos / Transferência") só aparecem na tela 6, depois do usuário ter: conectado wallet vazia, digitado valor acima do saldo, selecionado token alvo, visto cor vermelha e banner amarelo. Cada etapa é chance de abandono. Os mesmos cards seriam infinitamente mais úteis na tela 1 (wallet conectada + saldo zero), antes de qualquer digitação. Diagnóstico real: a Uniswap defere pedagogia até estado de erro completo, em vez de oferecer no estado vazio onde mais importaria. Por que a solução óbvia falha: cards sempre visíveis poluem o widget pra quem tem saldo. Direcionamento Kotai: detectar "wallet conectada + saldo zero do token de origem" como gatilho único, expandir cards inline; quando saldo > 0, colapsar pra widget minimalista. Trade-off: mais um estado a manter, mas elimina o "clica no botão e descobre". Afeta iniciante diretamente.
Nos atalhos inline (3) e na seção "Fazer swap entre redes" do modal (4), o mesmo token (ETH, USDC) aparece em redes diferentes como chips paralelos, diferenciados só por badge minúsculo de rede. Pior na seção cross-chain do modal: 4 chips literais "ETH". Iniciante clica em "ETH" achando "é ETH" e cai numa rede sem gas, sem RPC configurada, sem allowance. Mais grave em atalho que promete decisão fácil — se o caminho rápido tem pegadinha de rede, viola a promessa. Diagnóstico real: o paradigma "token-na-rede como entrada plana" é o erro; o atalho deveria operar em "rede de destino com token fixo". Por que solução óbvia falha: rotular cada chip ("ETH Base", "ETH Arbitrum") consome espaço. Direcionamento Kotai: pra cross-chain, atalhos mostram redes (não tokens-na-rede); token fica fixado na escolha anterior. Modal completo via busca cobre quem quer mudar token+rede. Trade-off: muda paradigma do atalho. Afeta iniciante e intermediário.
"Rotear: Uniswap API" (7), "Inclui UniswapX" (9), "Pools v2/v3/v4/hook v4" (10) — vocabulário interno do Uniswap (versionamento de AMM, produto proprietário) exposto sem sub-label inline. O ícone "?" alivia mas exige clique; o termo visível por default já cobra atenção de quem não decodifica. Diagnóstico real: a Uniswap assume conhecimento de arquitetura interna como pré-requisito de uso. Por que solução óbvia falha: traduzir pra leigo ("Pools clássicas / eficientes / customizadas") esconde versionamento real e quebra rastreabilidade. Direcionamento Kotai: nome técnico + sub-label de uma linha por opção ("Pools v4 — versão mais recente, maior eficiência de gas"; "UniswapX — fontes alternativas que podem oferecer melhor preço ou gas zero"). Trade-off: copy contínua de manutenção (cada versão nova exige sub-label novo). Afeta iniciante e intermediário que tentam entender o que estão consentindo.
"ETH insuficiente para swap" (5) descreve sem dizer quanto falta nem o que fazer. "Rota mais eficiente" (9) — eficiente em quê? Preço, gas, velocidade? "Hooks V4 roteiam swaps por hooks pré-aprovados" (12) usa o próprio termo pra explicar. "Considerando pools v2, v3 e alguns v4" (13) não qualifica quais. Diagnóstico real: o pattern de tooltip existe e é correto (vide insight "pedagogia on-demand"), mas a curadoria de conteúdo falha — texto é tecnicamente honesto sem ser informacional. Por que solução óbvia falha: definir termo técnico em profundidade exige espaço; banner sempre visível polui. Direcionamento Kotai: copy de tooltip e banner sempre comunica resultado pro usuário ("Você tem 0 ETH. Pra trocar 100 ETH, adicione fundos." / "Melhor preço final, considerando taxas e slippage." / "Pools com lógica customizada — podem ter taxas dinâmicas ou condições de execução, mais variáveis pra avaliar antes de confiar."), não mecanismo. Trade-off: copy mais longa; ganho é definição não-circular. Afeta iniciante principalmente.
Três settings no painel principal (slippage / prazo / opções de negociação) aparecem com peso visual idêntico, apesar de risco semanticamente muito diferente — slippage e prazo são parâmetros de execução (iniciante mexe sem quebrar nada grave); "Opções de negociação" abre subpanel que pode quebrar quote e gerar perda real. No subpanel, ao desativar "Padrão", os 5 toggles vêm todos ON — o opt-out é semanticamente vazio até o usuário desligar algum. Iniciante curioso que mexe sem entender não tem warning. Por que solução óbvia falha: forçar tudo OFF barra avançado que só queria desligar UMA fonte; defaults curados injetam política editorial. Direcionamento Kotai: agrupamento explícito "Execução" vs "Avançado" no settings principal; ao desativar "Padrão", overlay de consentimento informado ("Você está prestes a configurar manualmente — mudanças afetam preço e podem fazer a transação reverter"). Trade-off: mais um modal de fricção, mas eleva consentimento pra nível compatível com impacto. Afeta intermediário curioso principalmente.
"Tarifa: Grátis" + "Taxa de rede: $2,04" (7) vs "swaps sem custos de gas" no tooltip do UniswapX (11) — usuário não sabe se vai pagar gas ou não. Microcopy do "Padrão" em (9) diz "Inclui UniswapX"; tooltip do "Padrão" em (13) diz "pools v2, v3 e alguns v4" e NÃO menciona UniswapX. Usuário que lê as três tem que reconciliar sozinho qual é a verdade. Diagnóstico real: features que se sobrepõem (UniswapX + pools versionadas; tarifa de protocolo + gas + cobertura de filler) são comunicadas em silos editoriais, não como sistema único. Por que solução óbvia falha: detalhar tudo em cada tela polui; consolidar única tela perde granularidade pra avançado. Direcionamento Kotai: editar copy "from the outside in" — começar pelo que o usuário paga/recebe (resultado consolidado), depois detalhar mecanismo. NUNCA descrever subsistemas isolados como se fossem o produto inteiro. Afeta todos os perfis — é falha de coerência editorial.
No subpanel manual de routing (10), os 5 toggles (UniswapX + pools v2/v3/v4/hook v4) vêm ON quando o usuário desliga o Padrão. Hook v4 (12), em particular, vem ON sem que o tooltip explique adequadamente o trade-off (vide fricção "microcopy circular"). Combinação: usuário desativa "Padrão" pra "escolher manualmente" → encontra tudo já marcado → não sabe o que cada toggle faz → mantém estado, achando que entendeu. Diagnóstico real: o ato de opt-out vira cosmético; o consentimento informado é mascarado por defaults agressivos. Direcionamento Kotai: quando toggle envolve risco real (lógica custom no swap, hook não-curado), vir OFF no modo manual; usuário ativa conscientemente. Trade-off: avançado precisa de cliques extras. Afeta intermediário curioso mais que iniciante.
"Tarifa: Grátis" lado a lado com "Taxa de rede: 2,04 US$" no detalhamento da quote. Os dois têm peso visual igual, mas "Grátis" é cognitivamente sticky — iniciante registra "swap é grátis", a taxa de rede passa despercebida. Promessa "tarifas zero" do hero quebra aqui. Tecnicamente honesto (tarifa de protocolo é zero, gas é da rede), comunicacionalmente enganoso pro target. Entra como item estrutural apesar de aparecer só na tela onde o detalhamento existe (não tem como recorrer em outras telas). Direcionamento Kotai: linha "Custo total da transação: ~X US$" acima do breakdown, somando tarifa + gas (ou indicando "0 via fillers" quando rota gasless aplica). Breakdown abaixo como detalhe pra quem quer auditar. Conecta diretamente com a oportunidade "Transparência radical sobre custo" abaixo. Afeta iniciante principalmente.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch — todos tratam wallet-conectada-sem-saldo como variação cosmética do estado padrão (mesmo widget, muda só o CTA). Os caminhos de funding (fiat on-ramp, transferir de outra carteira, transferir de exchange) só aparecem depois de o usuário tentar swap e falhar. Por que afeta nosso target: /swap é frequentemente o primeiro destino após conectar wallet nova. Iniciante sem saldo vê widget + botão isolado, não sabe o que o botão faz, e bouncea entre tabs ou abandona. Cada etapa antes da pedagogia aparecer é chance de abandono. Hipótese de diferenciação Kotai: tratar "primeira sessão pós-conexão + saldo zero" como estado próprio, não variação cosmética. Cards de funding (Comprar / Receber / Transferir) visíveis desde a primeira renderização, gated por saldo zero. Quando saldo > 0, colapsar pra widget minimalista. Trade-off: detecção de saldo em tempo real exige integração viva com a wallet; widget fica mais denso no estado vazio; um estado extra a manter no design system. Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes fazem igual (2) ✓ afeta iniciante diretamente (3) ✓ ninguém resolveu por questão de polish de estado, não impossibilidade (4) ✓ diferença altamente perceptível.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch, Jupiter — todos listam variantes de rede como entradas planas (ETH em Base, ETH em Arbitrum, ETH em Optimism como tokens separados num seletor). Por que afeta nosso target: iniciante clica em "ETH" sem entender que está escolhendo rede; cai em rede sem gas, sem RPC, sem allowance. Mais grave nos atalhos rápidos, onde a promessa é "decisão fácil". Hipótese de diferenciação Kotai: atalhos rápidos operam em "rede de destino" (ícones de Base, Arbitrum, Optimism, Polygon) com o token fixado na escolha anterior. Quem quer mudar token + rede simultaneamente usa o modal completo via busca, onde a rede é atributo explícito (não chip separado). Trade-off: muda paradigma do atalho — exige curadoria de qual token entra em qual atalho de rede; pode confundir usuário avançado acostumado ao paradigma plano. Passa nas 4 perguntas-teste? (1) ✓ todos os principais (2) ✓ afeta iniciante direto (3) ✓ ninguém resolveu por inércia de paradigma, não impossibilidade (4) ✓ diferença perceptível (atalho seguro vs roleta de rede).
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch — todos misturam "tarifa zero" (protocolo) com "taxa de rede" (gas) sem agregar num custo total. Aggregators que oferecem rota gasless (UniswapX, 1inch Fusion, CoW Swap, Jupiter/Jito) escondem isso atrás de tooltip/jargão em settings, em vez de destacar na quote. Por que afeta nosso target: iniciante saindo de CEX teme gas — é o argumento de venda principal. A Uniswap entrega "swap gasless via UniswapX" como feature dentro do modo Padrão ativo por default, mas exibe "Taxa de rede: $2,04" na quote. Usuário não sabe se vai pagar gas ou não. Comunicação fragmentada vira erosão de confiança. Hipótese de diferenciação Kotai: linha "Custo total estimado da transação" acima do breakdown, mostrando o número real que o usuário vai pagar (tarifa + gas, ou "0 via filler" quando rota gasless aplica). Quando a rota suporta gasless, headline visual destacado ("Você não paga gas neste swap") — não tooltip. Breakdown abaixo pra quem quer auditar. Posicionamento "DEX honesto sobre custo". Trade-off: depende de integração viva com aggregator/intent system pra saber quando a rota é gasless; UI tem que aceitar incerteza ("Taxa: $0–$2,04" antes da rota fechar); contraria narrativa de marketing "tarifas zero" (que enviesa quem usa o app a contar a história de gas separadamente). Se a Kotai não tem o aggregator integrado no v1, parte da promessa é vaporware — implementar primeiro a linha agregada (sem promessa gasless) e adicionar headline quando o aggregator entrar. Passa nas 4 perguntas-teste? (1) ✓ todos misturam (2) ✓ afeta iniciante direto (3) ✓ ninguém resolveu por tensão comercial (mostrar "Grátis" vende melhor) (4) ✓ diferença altamente perceptível — "você não paga gas neste swap" é claim viral.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch, Jupiter — todos defaultam ordenação por "volume 24h" ou "trending" no modal de seleção de token, exibindo bridged tokens e scam tokens no topo. Iniciante busca "USDT", vê "Binance Bridged USDT (BNB Smart...)" primeiro, clica achando que é o canônico. Por que afeta nosso target: modal de seleção de token é onde a maioria dos scams "pega" o iniciante pela primeira vez. Anti-scam delegado pra fontes externas (CoinMarketCap, CoinGecko) abdica da responsabilidade no momento da decisão. Hipótese de diferenciação Kotai: modal como tela de proteção ativa. Default: ordenação "tokens canônicos verificados" com critério público (listado em CG/CMC + idade mínima + auditoria do contrato). Trending vira filtro opt-in. Selo de verificação interpretável (azul "verificado" / amarelo "novo" / vermelho "cuidado") substitui endereço hexadecimal por default; hexa opcional em hover. Trade-off: curadoria contínua dos critérios; possibilidade de excluir tokens legítimos jovens; tensão real com narrativa "DeFi é permissionless, não censuramos" — sinalizado aqui porque é o ponto mais fraco da oportunidade. Vantagem: o target iniciante valoriza segurança acima de pureza ideológica; o avançado/influencer que reclama de "censura" não é nosso target. Passa nas 4 perguntas-teste? (1) ✓ todos defaultam por volume/trending (2) ✓ afeta iniciante direto (3) ⚠ razão de ninguém resolver é parte falta de investimento, parte decisão estratégica (narrativa permissionless) — pergunta mais fraca da oportunidade (4) ✓ diferença altamente perceptível.
Padrão atual da indústria: Uniswap, 1inch, PancakeSwap — todos misturam settings de execução (slippage, deadline) e settings de routing (pools, aggregators) num único nível, sem diferenciação de risco. Por que afeta nosso target: intermediário curioso entra em settings achando que tudo é "seguro de mexer". Mexe em routing achando que está ajustando slippage. Quebra quote sem entender por quê. Pra iniciante, settings é exatamente onde curiosidade vira erro caro. Hipótese de diferenciação Kotai: settings panel com dois agrupamentos visuais — "Execução" (slippage, prazo, parâmetros numéricos) e "Avançado" (routing, fontes de liquidez) — com o segundo grupo atrás de header colapsável e warning leve. Trade-off: decisão editorial contínua sobre bucket de parâmetros novos; um clique extra pra avançado. Passa nas 4 perguntas-teste? (1) ✓ todos misturam (2) ⚠ afeta intermediário curioso e iniciante que ousa entrar — leverage média-alta, não máxima — sinalizado aqui pra revisão de prioridade (3) ✓ é polish de hierarquia, não impossibilidade (4) ✓ diferença perceptível (app comunica "isso aqui é seguro mexer" vs "território avançado").
Função: Estado expandido do subpanel quando o toggle "Padrão" é desligado. Revela controles individuais de routing — UniswapX e pools por versão (v2, v3, v4, hook v4). Cada um vem ATIVADO por default.
Componentes
Regras de negócio
🟢 Insight — progressive disclosure de complexidade A arquitetura de "toggle único Padrão ON → granular OFF" é padrão correto de progressive disclosure: iniciante nunca precisa olhar pra v2/v3/v4; avançado tem acesso a controle fino. A complexidade existe e é exposta, mas só quando o usuário sinaliza interesse explícito ao desativar o Padrão.
^insight-1
🔴 Fricção 1 (estrutural — opt-out semanticamente vazio: todos vêm ON) O usuário desativa "Padrão" esperando "agora EU escolho". Encontra todos os 5 toggles já ativados. Ou seja: o estado pós-opt-out é funcionalmente idêntico ao pré-opt-out (mesma rota possível) até o usuário desligar algum toggle manualmente. O ato de desativar o Padrão fica cosmético até a próxima ação.
Pior: a expectativa do usuário ("vou escolher") choca com a UI ("já escolhi tudo por você"). Iniciante que chegou aqui por curiosidade pode pensar "ok, igual a antes, mas agora vejo as opções" — e sair sem mexer, achando que entendeu o sistema. Mas se mexer, pode quebrar quote sem entender o porquê (ex: desativar v4 num par que só tem liquidez em v4).
Por que solução óbvia falha: vir tudo OFF e exigir seleção barra o usuário avançado que queria só desligar UMA fonte. Vir com defaults curados (ex: só v4 + UniswapX ON) injeta política editorial que pode quebrar pares legados.
Direcionamento Kotai: ao desativar o "Padrão", mostrar overlay/tooltip ("Você está prestes a configurar manualmente o roteamento. Mantemos todas as fontes ativas até você desativar alguma. Mudanças afetam preço e podem fazer a transação reverter."). Aceita ou volta. Trade-off: mais um modal de fricção, mas eleva o consentimento informado pra um nível compatível com o impacto da decisão.
^friccao-1
🔴 Fricção 2 (estrutural — jargão "pools v2/v3/v4/hook v4" sem tradução) "Pools v4", "pools de hook v4", "pools v3", "pools v2" são nomes técnicos de versões de AMM da Uniswap — informação relevante pra dev/avançado, ininteligível pra resto do mundo. O iniciante que chegou aqui não tem modelo mental de "versões de pool" e o que cada uma implica (v2 = constant product simples; v3 = concentrated liquidity; v4 = hooks customizáveis).
Por que solução óbvia falha: traduzir pra leigo ("Pools clássicas / Pools eficientes / Pools customizadas") esconde versionamento real e quebra rastreabilidade. Mas mostrar só o jargão técnico esconde o que cada opção faz.
Direcionamento Kotai: nome técnico + sub-label de uma linha por toggle ("Pools v4 — versão mais recente, maior eficiência de gas"; "Pools v2 — versão clássica, ainda usada para pares legados"). Trade-off: mais texto vertical, mas torna a decisão informável.
^friccao-2
🔴 Fricção 3 (cosmética — título do relatório original "Slippage manual") Observação editorial: a tela não tem nada de slippage manual. Slippage é controlado no painel principal (#8). Esta tela é especificamente sobre routing. Título corrigido pra "Opções de negociação (Padrão desativado, controles granulares)".
^friccao-3
🟡 Oportunidade competitiva (média leverage — territory de progressive disclosure) Pergunta-teste: (1) ✓ Uniswap, 1inch, Jupiter — todos expõem controles granulares de routing/aggregator com jargão técnico nu, sem tradução por toggle. (2) ✓ Afeta intermediário que tenta entender (iniciante não chega aqui; avançado já sabe). (3) ✓ Razão de ninguém resolver: assume conhecimento de versões de AMM como pré-requisito. (4) ⚠ Diferença é perceptível pra intermediário, menos relevante pra iniciante (que ignora o painel) — leverage média, não alta.
Diferenciação Kotai: settings avançados com tradução de uma linha por opção, sem esconder o nome técnico. Trade-off: copy contínua de manutenção (cada nova versão de pool exige sub-label novo). Decisão estratégica: se o target é iniciante, esta tela pode ser deferida pra fase posterior do roadmap — não é diferenciador de primeira ordem.
^oportunidade-1

Função: Expansão do estado de erro com sugestões de funding visíveis inline. UI revela os mesmos 3 caminhos (Compre / Receber / Transferência) presentes na tela Carteira Conectada — Estado base, agora gatilhados pelo contexto de tentativa-de-swap-sem-saldo.
Componentes
Regras de negócio
🟢 Insight Quando o erro é estrutural (sem saldo), a UI expande mostrando caminhos concretos de resolução em vez de manter só um botão genérico. Os mesmos 3 cards da tela inicial pós-conexão aparecem contextualmente, criando consistência cross-tela: o usuário aprende uma vez ("comprar / receber / transferir") e reconhece em qualquer ponto de fricção. Padrão a herdar como "biblioteca de resoluções" — cada erro estrutural conhecido (sem saldo, rede errada, sem allowance) tem seu set de cards de resolução, reutilizáveis.
^insight-1
🔴 Fricção (estrutural — pedagogia chega tarde demais) Os 3 cards de funding aparecem só depois do usuário ter: (1) conectado wallet vazia, (2) digitado valor acima do saldo, (3) selecionado token alvo, (4) visto cor vermelha, (5) visto banner amarelo, e (6) ainda persistido sem desistir. Cada etapa é uma chance de abandono.
Pra iniciante, isso significa: vários ciclos de "tentei algo, deu erro" antes da UI sugerir "talvez você precise de fundos primeiro". Os mesmos cards seriam infinitamente mais úteis no estado #1 (wallet conectada com saldo zero, antes de qualquer digitação).
Por que a UI atual gatilha tarde: provavelmente decisão de "não poluir o widget vazio com sugestões". Mas widget vazio é justamente onde sugestão importa mais.
Direcionamento Kotai: detectar "wallet conectada + saldo zero do token de origem" como gatilho único pros 3 cards, sem exigir que o usuário tenha completado a fila de erros. Trade-off: widget visualmente mais denso no estado vazio, mas elimina ciclos de tentativa-e-erro.
^friccao-1
🔴 Fricção (cosmética — CTA atenuado duplica a função dos cards) "Adicionar fundos para fazer swap" agora cinza-rosa, redundante com os 3 cards que oferecem caminhos específicos. Por que manter? Provável continuidade visual com #1/#2/#5; o custo é fragmentar a hierarquia ("clique aqui OU clique aqui pra mais opções").
Direcionamento Kotai: quando os cards estiverem visíveis, esconder o CTA genérico. Trade-off: um elemento a menos pra animar entre estados; ganho é hierarquia limpa.
^friccao-2
🟡 Oportunidade competitiva (alta leverage — atravessa todo onboarding pós-conexão) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch — todos tratam wallet-conectada-sem-saldo como variação cosmética do estado padrão (só muda o CTA). (2) ✓ Afeta iniciante diretamente — é o estado mais comum pós-conexão de wallet nova. (3) ✓ Razão de ninguém resolver: questão de polish de estado, não impossibilidade. (4) ✓ Diferença perceptível — usuário sente quando o app antecipa "precisa de fundos? aqui está como" em vez de mostrar erro depois de várias tentativas.
Diferenciação Kotai: "estado conectado sem saldo" como contexto pedagógico, não como estado de erro. Cards de funding visíveis desde a primeira renderização (gated por saldo zero, não por fila de erros). Trade-off: detecção de saldo em tempo real exige integração viva com a wallet, e o widget fica mais denso no estado vazio.
^oportunidade-1

Função: Estado de erro completo (#5/#6) com detalhamento da quote expandido — Tarifa, Taxa de rede, Máx. de slippage, Rotear visíveis. Usuário vê o custo total da transação antes de decidir adicionar fundos.
Componentes
Regras de negócio
🟢 Insight 1 — detalhamento em estado de erro é decisão correta Mostrar o custo total da transação (Tarifa + Taxa de rede + Slippage + Rota) antes do usuário decidir adicionar fundos é transparência genuína: o usuário sabe exatamente quanto vai gastar antes de investir mental e financeiramente em adicionar saldo. Padrão a herdar — sempre mostrar custo total no estado de pré-execução, mesmo bloqueado.
^insight-1
🟢 Insight 2 — ícones "?" abrindo tooltip de help Pedagogia on-demand via ícone discreto evita poluição visual e atende dois perfis: iniciante clica e aprende, avançado ignora. Padrão a herdar — sempre que houver jargão técnico (slippage, rotear, taxa de rede), associar ícone de help. Trade-off: tooltips precisam de curadoria contínua de copy.
^insight-2
🔴 Fricção 1 (estrutural — "Tarifa: Grátis" confirma a fricção do hero) "Tarifa: Grátis" lado a lado com "Taxa de rede: 2,04 US$" é exatamente o ponto onde a promessa "tarifas zero do aplicativo" do hero quebra. Os dois itens têm peso visual igual, mas a palavra "Grátis" é cognitivamente sticky — iniciante lê primeiro, registra "swap é grátis", e a taxa de rede passa despercebida ou parece "outra coisa".
Pior: a Uniswap está sendo tecnicamente honesta (tarifa do protocolo é zero; gas é da rede, não do app), mas a honestidade técnica não basta se a comunicação total mistura "Grátis" e "2,04 US$" sem hierarquia clara.
Direcionamento Kotai: renomear "Tarifa" pra "Tarifa da Kotai" (autoria explícita) e mostrar "Custo total da transação: 2,04 US$" como linha agregada destacada acima do breakdown. Quem quer detalhe técnico desce; quem quer saber "quanto vou pagar" lê o número agregado. Trade-off: linha extra; ganho é eliminar a expectativa quebrada herdada do hero.
^friccao-1
🔴 Fricção 2 (estrutural — "Máx. de slippage 0,25% Auto" sem context-aware default) Slippage 0,25% com badge "Auto" é razoável pra pares líquidos (ETH/USDT), mas pra par ilíquido o mesmo "Auto" pode ser slippage demais e o usuário perde dinheiro, ou pouco demais e a transação reverte. O "Auto" mascara essa decisão — iniciante não sabe que slippage existe nem que tem trade-off, e o avançado pode querer ajustar manualmente sem perceber que pode.
Por que solução óbvia falha: forçar input manual de slippage barra o iniciante. Esconder completamente esconde uma fonte real de perdas em pares ilíquidos.
Direcionamento Kotai: badge "Auto" + microcopy curta quando o slippage saltar acima de threshold ("Auto: 5,2% — par com baixa liquidez, considere reduzir o valor"). Pra par tranquilo, "Auto" sozinho. Trade-off: copy condicional, exige curadoria de threshold por par.
^friccao-2
🔴 Fricção 3 (cosmética — "Rotear: Uniswap API" é jargão sem tradução) "Rotear" + "Uniswap API" é vocabulário técnico que diz nada pra iniciante e pouco pra intermediário. O ícone "?" alivia, mas o termo visível por padrão ocupa espaço com informação que 80% dos usuários não vai usar.
Direcionamento Kotai: ou esconder atrás de "Detalhes avançados" expansível, ou renomear ("Roteado via Uniswap" sem o sufixo API). Trade-off: avançado precisa de um clique a mais; ganho é menos jargão por default.
^friccao-3
🟡 Oportunidade competitiva (média leverage — vinculada à fricção 1) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch — todos misturam "tarifa zero / fee zero" com gas/taxa de rede sem agregar num "custo total" claro. (2) ✓ Afeta iniciante direto. (3) ✓ Razão de ninguém resolver: tensão comercial (mostrar "Grátis" vende melhor que "Custo: $2") + complexidade do gas que varia por rede e momento. (4) ✓ Diferença perceptível — usuário sente quando o app é honesto sobre o número total que ele vai pagar.
Diferenciação Kotai: linha "Custo total estimado da transação" acima do breakdown, mostrando soma realista (tarifa + gas + slippage no pior caso). Breakdown abaixo como detalhe pra quem quer auditar. Trade-off: contraria narrativa de marketing "tarifas zero", mas posiciona Kotai como "DEX honesto" — ângulo que ressoa com o target iniciante desconfiado.
Observação adicional (refresh da quote com X de dismiss) O X ao lado da linha "1 USDT = 0,000424226 ETH" sugere que o usuário pode fechar/pausar o refresh. Pattern raro e elegante — permite usuário travar a quote pra estudar sem o número pulando a cada bloco. Vale validar com o produto se o X realmente pausa o refresh ou só esconde a linha; se for pausar, é uma feature pequena de UX que respeita o tempo de decisão do usuário.
^oportunidade-1
Função: Subpanel acessado via "Opções de negociação > Padrão" do settings principal. Toggle único ativado com microcopy explicativa e menção a UniswapX como inclusão do modo padrão.
Componentes
Regras de negócio
🟢 Insight 1 — smart default com microcopy contextual Toggle "Padrão" ON acompanhado de microcopy explicando o benefício ("rota mais eficiente") é o jeito certo de defender uma decisão automática: o usuário não precisa saber o que faz, sabe o resultado (eficiência). Padrão a herdar — sempre que houver um toggle de "deixar o sistema decidir", explicar o ganho em uma frase, não em jargão técnico.
^insight-1
🟢 Insight 2 — back arrow + título preserva orientação Subpanel com seta back claramente posicionada permite usuário voltar sem perder contexto. Pequeno, mas é o tipo de polish que faltava em settings de DEX antigos.
^insight-2
🔴 Fricção 1 (estrutural — "Inclui ⚡ UniswapX" sem explicação na tela) "UniswapX" aparece em destaque (com ícone próprio e cor de marca) mas sem definição inline. Pra iniciante, é apenas um nome bonito. Pra intermediário, é parcialmente reconhecível mas o que significa "incluir UniswapX" na rota não está claro — é um aggregator? Uma camada off-chain? Uma fonte adicional de liquidez? Tudo isso ao mesmo tempo?
A realidade técnica (UniswapX é sistema intent-based / RFQ com fillers competindo off-chain pra dar melhor preço, depois settlement on-chain) é informação relevante: usuário precisa saber que a transação pode passar por fillers terceirizados, não apenas por pools clássicas. Mas a tela esconde isso atrás de um nome de marca.
Direcionamento Kotai: ao mencionar tecnologia/produto proprietário dentro de settings, adicionar microcopy curta inline ("via fillers que competem pelo melhor preço — settlement on-chain") + ícone "?" pra detalhe completo. Trade-off: mais texto na tela; ganho é o usuário sabendo o que está consentindo quando aceita o "Padrão".
^friccao-1
🔴 Fricção 2 (cosmética — microcopy "rota mais eficiente" é vaga) "Eficiente" em quê? Custo? Velocidade? Slippage? Resultado final? Pra iniciante que ainda monta o modelo mental do que é "rota de swap", o adjetivo isolado não basta.
Direcionamento Kotai: microcopy específica ("Melhor preço final, considerando taxas e slippage" ou "Menor custo total entre gas, taxa e perda de preço"). Trade-off: copy mais longa, mas honesta sobre o critério.
Observação adicional O ícone "?" ao lado de "Padrão" sugere que existe explicação on-demand — vale validar se o tooltip cobre o que falta na microcopy. Se já cobre, fricção 1 e 2 perdem urgência mas valem como "o que está em tooltip deveria estar visível por default quando se trata de promover produto proprietário (UniswapX)".
^friccao-2
Função: Painel de configurações de swap, acessado pelo ícone de engrenagem ao lado das tabs. Reúne três controles: slippage, deadline e routing.
Componentes
Regras de negócio
🟢 Insight "Auto" como default de slippage com badge visualmente leve é decisão correta — não força iniciante a digitar % manual nem esconde a configuração de avançado. O badge "Auto" comunica "está cuidando disso por você" sem cobrar atenção. Padrão a herdar como tratamento default pra qualquer parâmetro técnico (slippage, deadline, gas, routing).
Ícone "?" inline ao lado de "Slippage máximo" também é correto — pedagogia on-demand pra quem precisa, invisível pra quem não precisa.
^insight-1
🔴 Fricção 1 (cosmética — "30 minutes" em inglês) Bug i18n localizado: o valor "30 minutes" aparece em inglês num app em PT-BR. Mesma família dos bugs já identificados ("Canceling a limit has a network cost", lista de regiões em inglês). Fricção pequena, mas vira sinal de descuido acumulado.
Direcionamento Kotai: pipeline de i18n com varredura automática de strings sem tradução, e revisão manual em cada release de UI. Padrão básico, mas é onde a Uniswap deixa pontos visíveis na mesa.
^friccao-1
🔴 Fricção 2 (estrutural — três settings com pesos visuais idênticos misturando complexidades) "Slippage máximo", "Prazo para fazer swap" e "Opções de negociação" aparecem como três linhas iguais. Mas semanticamente são muito diferentes:
Pra iniciante curioso, tudo parece igualmente seguro de mexer. Não há warning de complexidade no item "Opções de negociação".
Direcionamento Kotai: dois agrupamentos visuais no settings panel — "Execução" (slippage, prazo) e "Avançado" (routing/pools), com o segundo grupo atrás de um header colapsável e/ou warning leve ("Configurações avançadas — pode afetar resultado do swap"). Trade-off: mais um clique pra avançado, mas filtra acidentes de iniciante.
^friccao-2
🟡 Oportunidade competitiva (média leverage) Pergunta-teste: (1) ✓ Uniswap, 1inch, PancakeSwap — todos misturam settings de execução e routing num único nível, sem diferenciação de risco. (2) ✓ Afeta iniciante diretamente — settings é exatamente onde curiosidade vira erro caro. (3) ✓ Razão de ninguém resolver: é polish de hierarquia, não impossibilidade. (4) ✓ Diferença perceptível — usuário sente quando o app diz "isso aqui é seguro mexer" vs "isso aqui é território avançado".
Diferenciação Kotai: settings panel com hierarquia explícita de risco. Trade-off: exige decisão editorial sobre o que conta como "execução" vs "avançado"; quando surgir parâmetro novo, decidir bucket.
^oportunidade-1

Função: Tooltip explicativo no hover/click do ícone "?" ao lado de "Ativar pools de hook v4". Define hooks v4 em uma frase.
Componentes
Regras de negócio
🟢 Insight — link "Saber mais" é caminho honesto pra técnico denso Reconhecer que tooltip curto não basta e oferecer "Saber mais" pra quem quer entender é o tratamento correto pra termos densos. Padrão a herdar — tooltip skim + link pra deep dive.
^insight-1
🔴 Fricção 1 (estrutural — definição circular não explica nada pro iniciante) "Os hooks V4 roteiam os swaps por meio de um conjunto de hooks pré-aprovados" usa o próprio termo "hooks" pra explicar "hooks". Pra iniciante, é zero informação. Pra intermediário, é só confirmação parcial de que existe um sistema de hooks — mas não diz o que hooks fazem (extensões customizadas em pools, lógica adicional no swap, plugins on-chain).
Por que solução óbvia falha: definir "hook" tecnicamente exige falar de smart contract, callbacks, lifecycle — território denso pra tooltip. Definir vagamente ("recursos extras") esconde risco.
Direcionamento Kotai: tooltip explicando o que hooks fazem na prática ("Pools com lógica customizada — podem ter taxas dinâmicas, condições de execução ou integrações com outros protocolos. Mais flexibilidade, mais variáveis pra avaliar antes de confiar."). Trade-off: copy mais longa; ganho é definição não-circular.
^friccao-1
🔴 Fricção 2 (estrutural — "pré-aprovados" sugere autoridade ausente) "Conjunto de hooks pré-aprovados" implica que existe alguém aprovando hooks — quem? Uniswap Foundation? Governance? Auditor terceirizado? Pra usuário consciente, isso é informação crítica (define modelo de confiança). A frase joga a palavra sem dar referência.
Por que solução óbvia falha: nomear autoridade compromete politicamente (se a Uniswap aprova, vira gatekeeper; se a governance aprova, depende de quorum lento; se auditor terceirizado, qual?).
Direcionamento Kotai: se houver curadoria, nomear ("Pools com hooks auditados pela equipe Kotai" ou "pela [nome do auditor]"). Se não houver, dizer ("Hooks listados sem curadoria — verifique cada pool antes de confiar"). Trade-off: assumir responsabilidade editorial vs transferir responsabilidade pro usuário; ambos honestos, mas a escolha define a marca.
^friccao-2
🔴 Fricção 3 (cosmética — toggle vem ON por default sem que o usuário tenha consentido) Conectando com a fricção 1 de #10: o toggle "Ativar pools de hook v4" vem ATIVADO por default quando o usuário desliga o Padrão. Combinado com o tooltip circular ("hooks são hooks"), o usuário não tem como decidir conscientemente se quer manter ativado. A opção mais comum vai ser deixar como está — o que pode ou não ser o que o usuário escolheria se entendesse o trade-off.
Direcionamento Kotai: quando o toggle envolve risco real (lógica custom no swap), vir OFF por default no modo manual; usuário ativa conscientemente.
^friccao-3


Função: Modal de seleção de token alvo (Comprar), acessado via botão "Selecionar token" do card Comprar. Inclui busca, filtro de rede, atalhos pra tokens populares, entrada pra cross-chain swap e lista trending por volume 24h.
Componentes
Regras de negócio
🟢 Insight 1 — chips populares com ticker visível Diferente da sugestão inline no card Comprar (vide #3, só ícones), aqui o atalho dos 5 populares tem ícone + ticker. Padrão a herdar dentro do modal — quando há espaço, ticker visível elimina ambiguidade. Tornar este o padrão pra atalhos em qualquer profundidade do flow, inclusive no atalho inline do card (que hoje exige hover pra descobrir o ticker).
^insight-1
🟢 Insight 2 — endereço de contrato pra distinguir tokens da trending Mostrar endereço encurtado (0xA0b8…eB48) pra tokens da lista trending é honesto sobre o fato de que múltiplos tokens compartilham nome/ticker, e dá ao usuário avançado uma forma de verificar canonicidade. Como princípio de transparência é correto. (Pra iniciante vira ruído — vide fricção 3.)
^insight-2
🔴 Fricção 1 (estrutural — ordenação default "volume 24h" expõe iniciante a scam vectors) "Tokens por volume de 24h" como ordenação padrão é justamente a métrica que scams exploitam: wash trading, pump-and-dump, token novo com volume artificial inflado. O primeiro item visível é "Binance Bridged USDT (BNB Smar..." — pra iniciante isso parece "USDT da Binance, deve ser oficial", mas é uma representação bridged, não o USDT canônico. Usuário que busca "USDT" vê esse primeiro, clica, e fica com token errado em rede errada.
Por que solução óbvia falha: remover a seção trending elimina utilidade legítima pra avançado descobrir tokens novos. Reordenar por "verificado" sem critério público vira política editorial frágil e atacável.
Direcionamento Kotai: ordenação padrão "tokens canônicos verificados" com selo claro e critério público (ex: listado em CoinGecko/CMC + idade mínima + auditoria do contrato), e "Volume 24h" como filtro opt-in. Pra iniciante, default seguro; pra avançado, um clique pra ver descoberta. Trade-off: curadoria contínua dos critérios, possibilidade de excluir tokens legítimos jovens, tensão com narrativa permissionless do DeFi.
^friccao-1
🔴 Fricção 2 (estrutural — "Fazer swap entre redes" com 4 chips "ETH" idênticos) Quatro chips literais "ETH" com badges minúsculos de rede como atalho cross-chain. Esta é a versão mais aguda da fricção "mesmo token, redes diferentes" que aparece em vários pontos do produto (modal Comprar #5, sugestões inline #3): aqui a UI EXIBE o problema explicitamente como feature. Iniciante clica em qualquer ETH achando "é ETH" e cai numa rede diferente do esperado, sem saldo de gas naquela rede, sem RPC configurada na wallet, etc.
Por que solução óbvia falha: rotular cada chip com a rede ("ETH Base", "ETH Arbitrum") consome espaço — 4 chips com rótulo dobrado não cabem na largura disponível. Reduzir pra 2-3 chips perde overflow.
Direcionamento Kotai: pra cross-chain, o atalho deve ser "rede de destino", não "token-na-rede". Mostrar 4 ícones de rede (Base, Arbitrum, Optimism, Polygon) e fixar o token na escolha já feita anteriormente. Trade-off: muda paradigma do atalho. Pra usuário que quer mudar token E rede simultaneamente, o modal completo via busca cobre.
^friccao-2
🔴 Fricção 3 (cosmética — endereço de contrato é ruído pra iniciante) Endereços hexadecimais (0xA0b8…eB48) na lista trending ajudam avançado a verificar canonicidade, mas pra iniciante são ruído incompreensível. Pior: a presença do hexa pode dar falsa sensação de legitimidade ("tem endereço, deve ser real") quando qualquer scam token também tem endereço.
Direcionamento Kotai: combinar selo de verificação interpretável (ícone azul "verificado" / amarelo "novo" / vermelho "cuidado") com endereço opcional via hover/expand. Mostrar primeiro o sinal interpretável, endereço como detalhe técnico colapsável.
^friccao-3
🟡 Oportunidade competitiva (alta leverage no target — anti-scam estrutural) Pergunta-teste: (1) ✓ Uniswap, PancakeSwap, 1inch, Jupiter — todos defaultam ordenação por volume 24h ou trending, exibindo bridged/scam tokens no topo. (2) ✓ Afeta iniciante diretamente — modal de seleção de token é onde a maioria dos scams "pega" o usuário pela primeira vez. (3) ✓ Razão de ninguém resolver: política editorial trabalhosa + tensão com narrativa "DeFi é permissionless, não censuramos". (4) ✓ Diferença perceptível — usuário sente quando o app organiza por confiança em vez de hype.
Este insight conecta diretamente com o relatório "Verificação de contrato — Anti-scam pattern" já existente no canvas: a Uniswap delega anti-scam pra fontes externas (CoinMarketCap/CoinGecko), e o modal interno favorece descoberta de tokens trending. A oportunidade Kotai é internalizar a camada anti-scam dentro do próprio modal.
Diferenciação Kotai: tela "Selecione um token" como tela de proteção ativa do iniciante (default: verificados; opcional: trending; cross-chain como seleção de rede, não de token-na-rede). Trade-off: curadoria contínua, decisão editorial sobre o que é "verificado", potencial fricção com narrativa permissionless do DeFi — vantagem é que o target iniciante valoriza segurança acima de pureza ideológica.
Observação adicional (banner cross-chain) O banner "Os swaps cross-chain chegaram" é announcement bem posicionado (aparece no momento que o usuário está prestes a escolher token, contexto em que cross-chain importa). Padrão a considerar pra Kotai: announcements de features novas devem aparecer onde a feature seria usada, não em home/notificação solta. Trade-off: exige instrumentação de quem já viu o banner pra não repetir após dismiss.
^oportunidade-1

Função: Estado de erro completo — usuário preencheu token de origem, valor (acima do saldo) e selecionou token alvo. Quote calculada e exibida apesar da falta de saldo. Banner textual finalmente aparece.
Componentes
Regras de negócio
🟢 Insight Quadruple feedback (cor + texto + ícone de aviso + CTA contextual) é padrão excelente para erro estrutural — cada camada cobre uma limitação da outra: cor é instantânea mas não acionável, texto é acionável mas exige leitura, ícone é visual reforçado, CTA é a saída concreta. Padrão a herdar como "stack de feedback" pra qualquer erro de bloqueio.
A decisão de mostrar a quote completa apesar do erro também é boa: usuário vê o que receberia se tivesse saldo, o que dá contexto pra decidir se vale a pena adicionar fundos. Sem a quote, ele teria que adicionar fundos no escuro.
^insight-1
🔴 Fricção (estrutural — quote completa sem saldo pode confundir iniciante) A quote "235726 USDT" exibida em branco e proeminente ao lado do banner "ETH insuficiente" envia mensagem mista pra iniciante: o número grande lê como "vou receber isso" enquanto o banner diz "não pode executar". Iniciante pode clicar no CTA achando que vai trocar, ou pior — não entender que a quote é hipotética e ficar paralisado.
Por que solução óbvia falha: esconder a quote em erro elimina o contexto útil que justifica o investimento mental de adicionar fundos. Atenuar visualmente a quote ajuda mas pode parecer bug.
Direcionamento Kotai: manter a quote completa, mas marcá-la como "Se você tivesse saldo, receberia 235726 USDT" com microcopy explicativa antes do número. Trade-off: copy ocupa espaço; ganho é eliminar a ambiguidade hipotético-vs-real.
^friccao-1
🔴 Fricção (cosmética — copy do banner é descritivo, não acionável) "ETH insuficiente para swap" descreve o problema mas não orienta. Iniciante lê isso achando "ah, meu ETH não chega" — mas quanto falta? Faltam 100 ETH (tem 0, precisaria 100)? Ou só uma fração?
Direcionamento Kotai: copy mais específica — "Você tem 0 ETH. Pra trocar 100 ETH, adicione fundos." Trade-off: copy mais longa, mas elimina o cálculo mental.
^friccao-2
Função: Tooltip explicativo que aparece no hover/click do ícone "?" ao lado de "UniswapX" no painel de opções de negociação granular. Define o produto e o benefício principal em uma frase.
Componentes
Regras de negócio
🟢 Insight 1 — pedagogia on-demand em camadas O tooltip resolve a fricção levantada em #9 (UniswapX promovido sem explicação inline): a explicação existe, gated por hover. Padrão a herdar — produto proprietário/jargão técnico promovido na UI tem que ter explicação inline acessível. O combo "?" + tooltip + "Saber mais" pra docs externas é três camadas de profundidade adequadas (skim → contexto → técnico).
^insight-1
🟢 Insight 2 — copy do tooltip destaca o ganho concreto "Melhores preços e swaps sem custos de gas" — duas promessas verificáveis e específicas, não jargão. Pra iniciante, "sem custos de gas" é especialmente forte: gas é o medo principal de quem está saindo de CEX. Padrão a herdar — copy de tooltip que comunica resultado (o que o usuário ganha), não mecanismo (como funciona).
^insight-2
🔴 Fricção (estrutural — feature crítica gated por hover, contradição cross-tela com #7) "Swaps sem custos de gas" é feature que merecia destaque de primeira ordem na UI principal de swap, não tooltip de settings. Iniciante que vê "Taxa de rede: 2,04 US$" na tela de quote (vide #7) provavelmente nem chega ao settings panel pra descobrir que existe forma gasless via UniswapX no modo Padrão — que já está ATIVO por default.
Pior: como UniswapX está dentro do "Padrão" ativo, o usuário pode estar SE BENEFICIANDO de gas zero sem perceber, então a "Taxa de rede: 2,04 US$" exibida em #7 pode estar errada ou sobrestimada (se o filler do UniswapX cobrir o gas, o usuário paga zero). Não consigo confirmar sem testar, mas a contradição visual entre "Taxa de rede: 2,04 US$" em #7 e "swaps sem custos de gas" neste tooltip é fricção real.
Por que solução óbvia falha: trazer "swap sem gas via UniswapX" pra tela principal pode confundir usuário que não sabe diferenciar quando UniswapX cobre e quando não cobre (depende do par, da liquidez disponível, do filler aceitar). Promessa falsa quebra mais a confiança do que feature escondida.
Direcionamento Kotai: linha "Taxa de rede" na tela de quote deve refletir o que o usuário vai realmente pagar depois do roteamento — se UniswapX/filler cobrir, mostrar "Taxa de rede: pago pelo filler" ou "0 (via UniswapX)". Trade-off: cálculo dinâmico, depende de cotação ativa de fillers; UI tem que aceitar incerteza ("Taxa de rede: até $X" ou "0–$X").
^friccao-1
🟡 Oportunidade competitiva (alta leverage — gasless como tese de produto) Pergunta-teste: (1) ✓ 1inch Fusion, CoW Swap, Jupiter (Jito), Across, UniswapX — todos têm camada intent-based/RFQ que pode entregar swap gasless, e TODOS escondem isso atrás de tooltip/jargão. (2) ✓ Afeta iniciante diretamente — "gas zero" é o argumento de venda principal pra quem vem de CEX. (3) ✓ Razão de ninguém destacar: complexidade técnica de quando aplica vs não aplica, medo de quebrar expectativa quando não aplica. (4) ✓ Diferença altamente perceptível — "você não paga gas neste swap" é claim viral.
Diferenciação Kotai: posicionar swap gasless (quando disponível) como headline visual na quote, não como configuração escondida. "Você não paga gas neste swap" como linha destacada acima do breakdown quando a rota for gasless; fallback transparente ("Esta rota cobra gas: ~$2") quando não for. Trade-off: depende de integração viva com aggregator/intent system. Se a Kotai não tem isso no v1, é vaporware. Mas estrategicamente, é o vetor de marketing mais forte pra captura de iniciante.
Observação adicional Curiosidade técnica vale registrar: UniswapX é gasless para o usuário mas alguém paga gas — o filler (que cobre via lucro no spread). Isso é honesto desde que o spread embutido seja menor que o gas que o usuário pagaria diretamente. Vale validar se a Kotai consegue ter relação direta com fillers que entregam essa equação no melhor estado pro usuário.
^oportunidade-1










Função: Tela principal de swap com carteira já conectada mas saldo zerado no token de origem. Estado padrão pra iniciante que conecta wallet vazia e cai direto em /swap.
Componentes
Regras de negócio
🟢 Insight CTA contextual ("Adicionar fundos para fazer swap" em vez de "Fazer swap" disabled) é o padrão central da tela — converte bloqueio em next-step acionável. Mesmo princípio aplicado em outras telas (Carteira Conectada — Estado base, Saldo insuficiente). Padrão a herdar como regra geral: quando o botão primário não pode executar, ele vira a próxima ação útil ("Aprovar token", "Trocar de rede", "Conectar carteira", "Adicionar fundos").
^insight-1
🔴 Fricção (estrutural — onboarding pobre comparado ao widget da home) Usuário que entra direto na URL /swap com wallet vazia vê apenas widget + um botão "Adicionar fundos". Comparado com a tela Carteira Conectada (que tem três cards explícitos: Compre criptos / Receber criptos / Transferência), esta tela é drasticamente mais pobre em onboarding. O iniciante perde toda a pedagogia de "como colocar dinheiro aqui" e fica com um botão sem saber pra onde leva — fiat on-ramp? endereço de depósito? transferência de exchange?
Por que solução óbvia falha: replicar os três cards aqui poluiria o widget que precisa ser scanneável e funcional pra usuário com saldo. Não pode ser sempre visível.
Direcionamento Kotai: detectar estado "wallet conectada + saldo zero" como estado de primeira sessão e expandir o widget com hints contextuais — três caminhos visíveis abaixo do CTA, com microcopy ("via fiat", "de outra carteira", "de exchange"). Quando o saldo for > 0, colapsar pra padrão minimalista. Trade-off: mais um estado a manter, mas elimina o "clica no botão e descobre".
^friccao-1
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap, 1inch — todos tratam wallet-conectada-com-saldo-zero igual a wallet-conectada-com-saldo: mesmo widget, mudando só o CTA. Pra iniciante, /swap é frequentemente o primeiro destino após conectar wallet, e a falta de orientação faz ele bouncear entre tabs ou abandonar.
Pergunta-teste: (1) ✓ todos fazem assim. (2) ✓ afeta iniciante direto — é o primeiro momento pós-conexão. (3) ✓ ninguém resolveu por questão de polish de estado, não impossibilidade. (4) ✓ diferença perceptível — usuário sente quando o app antecipa "vamos colocar fundos primeiro" em vez de mostrar botão isolado.
Diferenciação Kotai: tratar "primeira sessão pós-conexão" como estado próprio com onboarding visível dentro do widget, não como variação cosmética do estado padrão. Trade-off: detecção exige persistência local (localStorage, perfil de usuário) e curadoria do que mostrar e por quanto tempo.
^oportunidade-1

Função: Estado intermediário em que o usuário digitou um valor no card Vender mas não tem saldo no token. Feedback exclusivamente visual via cor, sem banner textual.
Componentes
Regras de negócio
🟢 Insight Cor vermelha aplicada simultaneamente em três pontos (input, conversão fiat, saldo disponível) cria redundância visual coerente: o erro está no MESMO dado representado em três formas. Padrão a herdar — quando há erro de quantidade, todos os campos derivados daquela quantidade compartilham o estado de erro.
^insight-1
🔴 Fricção (estrutural — erro silencioso pra quem não decodifica cor) A cor vermelha funciona como sinal de "algo errado", mas não é acionável: o iniciante vê vermelho e não sabe O QUE está errado (tipo de erro), POR QUE está errado (saldo insuficiente vs limite de transação vs problema de rede), nem COMO resolver. O CTA contextual "Adicionar fundos para fazer swap" entrega a solução, mas exige que o usuário cruze "vermelho + texto do botão" pra inferir "ah, é saldo".
Pior: cor sozinha falha em acessibilidade — daltônicos (deutans/protans) e leitores de tela não captam o sinal. WCAG explicitamente proíbe usar cor como único portador de informação.
Por que solução óbvia falha: adicionar texto explícito ("ETH insuficiente") em todas as etapas duplica informação que já aparece na #5 quando o estado fica completo. Mas adiar o texto até a #5 deixa este estado intermediário sem leitura clara pra quem precisa de mais que cor.
Direcionamento Kotai: aviso textual leve e inline já neste estado ("Você tem 0 ETH"), separado do banner formal que aparece com todos os campos preenchidos. Acompanhar cor com ícone (⚠) pra reforço não-cromático. Trade-off: mais um elemento textual no widget intermediário.
^friccao-1
🔴 Fricção (cosmética — sub-texto "0 ETH" ambíguo) O "0 ETH" no canto direito do card Vender representa o saldo disponível na carteira, mas visualmente parece reflexo do output ("você está vendendo 100, equivalente a 0 ETH?"). Pra iniciante, dois números no mesmo card sem rótulo explícito de qual é qual gera confusão.
Direcionamento Kotai: prefixar com rótulo curto ("Saldo: 0 ETH") no canto direito do card. Trade-off: mais um label, mas elimina ambiguidade. Padrão se aplica também ao card Comprar quando houver saldo do token alvo.
^friccao-2
Função: Sub-estado em que o card Comprar exibe linha de ícones de tokens populares como atalho de seleção, sem precisar abrir o modal "Selecionar token" completo.
Componentes
Regras de negócio
🟢 Insight Atalho de seleção rápida economiza um modal pra usuário que vai swapar pra um token popular (caso da maioria — stablecoins e WBTC dominam volume). Padrão a herdar: não force o usuário a abrir modal completo quando o destino comum está a um clique. Mantém o modal pra casos longos sem prejudicar a maioria.
^insight-1
🔴 Fricção 1 (estrutural — ícones sem ticker discriminam mal stablecoins) Os ícones de stablecoins (USDC, USDT, DAI) são todos circulares e visualmente similares — verde, azul, amarelo, com variações pequenas de saturação. Pior: aparecem duas variantes de USDC (mainnet e Base) com mesmo ícone, diferenciadas só por badge minúsculo de rede. Iniciante não distingue sem hover, e no mobile não há hover.
Por que solução óbvia falha: adicionar ticker visível ao lado de cada ícone ocupa espaço — com 5 chips lado a lado e ticker, o widget extrapola largura disponível. Reduzir pra 3 chips perde valor do atalho.
Direcionamento Kotai: chips com ticker visível por padrão e ícone como decoração secundária (formato pill: "USDC" com micro-ícone). Limitar a 3 sugestões fixas (USDC, USDT, ETH wrapped) e mover o resto pro modal completo. Trade-off: menos atalhos visíveis, mas cada um totalmente legível em mobile e desktop.
^friccao-1
🔴 Fricção 2 (estrutural — mesmo token em redes diferentes sem distinção forte) Mesma armadilha da tela "Selecione um token — Modal Comprar" (fluxo Comprar #5): duas variações de USDC (Ethereum / Base) aparecem como atalhos vizinhos sem comunicar que estão em redes diferentes. Iniciante clica no primeiro USDC sem saber qual rede está escolhendo, e a consequência aparece três telas depois — token na rede errada, sem saldo de gas naquela rede, etc.
A gravidade aqui é maior do que no modal completo: o atalho promete "decisão fácil", então a presença de pegadinha de rede no caminho rápido viola a expectativa.
Direcionamento Kotai: nos atalhos rápidos, tratar variantes de rede como atributo do token (não como tokens separados) — mostrar USDC único com a rede do token de origem como default implícito. Quem quer rede específica vai ao modal completo. Trade-off: menos opções simultaneamente acessíveis a um clique, mas elimina escolha cega no caminho rápido.
^friccao-2
🟡 Oportunidade competitiva (média leverage — atravessa todo seletor de token) Mesma oportunidade já levantada no fluxo Comprar #5: Uniswap, PancakeSwap, 1inch, Jupiter — todos listam variantes de rede como entradas planas. A fricção aqui é mais aguda porque o usuário está num atalho que deveria ser óbvio — se até o caminho rápido exige conhecimento prévio de rede, ele falha o propósito.
Diferenciação Kotai: atalhos como caminho seguro pro iniciante (sem decisão de rede embutida); modal completo como caminho expert (rede explícita). Trade-off: dois caminhos com semânticas distintas, exige curadoria de quais tokens entram em cada.
^oportunidade-1










Função: Modal final do flow Comprar dentro do Uniswap. Comunica que o controle passou pro provider externo e que o usuário deve continuar na aba aberta.
Componentes
Regras de negócio
🟢 Insight Disclaimer legal explícito do 3rd-party é compliance obrigatória e bem executada — usuário vê os termos do parceiro antes de prosseguir. Boilerplate necessário, não diferenciação.
^insight-1
🔴 Fricção (estrutural — handoff via nova aba sem fio condutor de retorno) Usuário termina o flow no Uniswap sendo despachado pra outra aba, onde faz KYC, paga, espera confirmação. Quando volta pro Uniswap (se voltar), não há estado intermediário que mostre "compra em andamento via MoonPay" — só portfólio vazio ou histórico. Iniciante que fecha a aba MoonPay errada, ou demora pra completar KYC, ou paga e não vê a cripto chegar imediatamente, fica sem ponto de verificação dentro do app principal. Resultado: muita ansiedade entre "paguei" e "recebi", e nenhuma forma de pedir suporte dentro do Uniswap.
A leitura inicial de "permitir fechar modal sem perder transação = respeita usuário" não se sustenta: o modal não diz "tudo bem fechar, segue rodando em background". Diz "vá pra outra aba, eu já não tenho mais o que fazer aqui". É fim de handoff visível, não respeito ao usuário.
Direcionamento Kotai: manter faixa persistente de "transação em andamento via [provider]" no app principal enquanto a compra externa não conclui, com último status reportado e link pra retomar na aba do provider. Mesmo sem webhook real-time, mostrar "Iniciada às 14:32 via MoonPay — aguardando confirmação. Pode levar até 30 min." reduz o vácuo. Trade-off: depende de webhook ou polling do provider, estado pendente persistido tem custo de manutenção.
^friccao-1
🟡 Oportunidade competitiva (alta leverage — momento de maior ansiedade do iniciante) Todos os concorrentes despacham pro provider e "soltam a mão" no handoff. Afeta iniciante diretamente — é o único momento em que ele paga dinheiro real. Ninguém resolveu porque depende de capacidade de integração com webhook, não impossibilidade. Diferença altamente perceptível: "o app me acompanhou até o fim" vs "o app me empurrou pra um lugar estranho e desapareceu".
Diferenciação Kotai: ser o DEX que mantém visibilidade do estado da compra externa dentro do app principal. Trade-off: integração mais profunda com providers, possivelmente menos providers no v1 em troca de mais profundidade nos que suportam webhook decente.
^oportunidade-1
Função: Modal de escolha de provider fiat e método de pagamento antes do handoff. Tela de máxima densidade de decisão do flow Comprar.
Componentes
Regras de negócio
🟢 Insight Mostrar múltiplos providers paralelamente é decisão correta — usuário com método específico (PIX, PayPal, Binance Cash Balance) pode escolher quem aceita o método dele em vez de cair em provider que rejeita. Pra BR, suportar PIX via dois providers é trust signal forte (não fica dependente de um único parceiro).
^insight-1
🔴 Fricção 1 (estrutural — zero transparência de fee no momento da decisão) A microcopy "Você seguirá para o portal do provedor para ver as tarifas da sua transação" é honesta sobre a falta, mas a falta em si é grave: usuário escolhe provider às cegas. Dois providers podem cobrar fees diferentes (5% vs 9%) pelo mesmo método (PIX), e usuário só descobre depois de comprometer a escolha. Pior: voltar pra trocar significa começar conversa de KYC do outro provider do zero.
Por que solução óbvia falha: mostrar "fee estimada" pode quebrar se integração não devolver fee precisa ou variar por valor/método/região.
Direcionamento Kotai: se integração devolver faixa (mín-máx) de fee por provider, mostrar inline ("PIX — taxa entre 4% e 6%"). Se não, ao menos mostrar ordem dos providers do mais barato pro mais caro por categoria de método, em vez de ordem comercial fixa. Trade-off: contraria preferência comercial do provider de aparecer no topo.
^friccao-1
🔴 Fricção 2 (cosmética — tabs de método duplicam função do provider) As tabs Banco/Débito/PayPal e a lista de providers fazem trabalho semanticamente sobreposto: ambas filtram por método. Não está claro se selecionar "Débito" filtra a lista pra mostrar só providers com débito, ou se é só visual. Iniciante pode escolher provider que não tem o método que tocou na tab.
Direcionamento Kotai: usar tabs apenas como filtro real da lista, com indicador visual de "X providers disponíveis pra [método]". Ou eliminar tabs e usar chips de filtro multi-select acima da lista.
^friccao-2
🟡 Oportunidade competitiva (média leverage — mais perceptível pro target BR/LatAm) Uniswap, MetaMask Portfolio, 1inch fiat — todos mostram providers sem fee comparável. Afeta iniciante direto. É fricção comercial com providers, não técnica. Usuário percebe quando escolhe provider sabendo que economiza X reais.
Diferenciação Kotai: tela de seleção de provider como tela de comparação real, não menu. Trade-off: relação comercial mais difícil com providers, possivelmente menos providers no início.
^oportunidade-1
Função: Modal de seleção do token de destino da compra.
Componentes
Regras de negócio
🟢 Insight Card educativo "Iniciar com ETH" antecipa pegadinha clássica do iniciante: compra USDC achando "quero stablecoin segura", descobre no primeiro swap que precisa de ETH pra gas, precisa voltar e comprar mais fiat. O card corta o loop antes dele começar. Padrão a herdar e expandir — mesmo princípio cabe em outros pontos (avisar antes de comprar token em rede que o usuário não usa, antes de fazer swap sem reserva pra gas).
^insight-1
🔴 Fricção (estrutural — afeta iniciante, atravessa todo on-ramp) Lista mistura tokens diferentes (ETH, USDC, USDT, DAI…) com o mesmo token replicado em redes diferentes, sem distinção visual forte e sem comunicar consequência da escolha de rede. Iniciante não tem modelo mental de "mesmo token em redes diferentes" — pra ele, USDC é USDC. Pior: o próprio card "Iniciar com ETH" entrega a mensagem certa pelo motivo errado, porque a lista também tem três variações de ETH. Iniciante clica no primeiro "Ethereum / ETH", recebe ETH na mainnet, depois tenta usar em swap configurado pra Base e descobre que está na rede errada.
Por que solução óbvia falha: renomear pra "USDC (Ethereum) / USDC (Base) / USDC (Unichain)" resolve display mas não resolve modelo mental. Usuário ainda não sabe qual rede ele quer porque essa decisão depende de onde ele pretende usar o token depois.
Direcionamento Kotai: agrupar "token" e "rede" como duas decisões separadas — primeiro escolhe o token (USDC, ETH…), depois a rede aparece como segundo passo com recomendação contextual ("Recomendado pra iniciantes: Base — gas mais baixo" ou "Você usa Base com mais frequência"). Trade-off: dois passos em vez de um, mas elimina escolha cega de rede. Pra avançado, atalho de busca direta ("USDC Base") mantém velocidade.
^friccao-1
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap, 1inch, Jupiter — todos listam mesmo token em redes diferentes como entradas planas com badge sutil. Afeta iniciante direto: token errado em rede errada é causa #1 de "perdi minha cripto" quando na verdade é "tá em rede que eu não sei acessar". Ninguém resolveu por questão de design + assume conhecimento.
Diferenciação Kotai: tratar "rede" como decisão de primeira classe na compra, não como atributo escondido no ícone do token. Trade-off: contraria a convenção visual da indústria, exige curadoria de qual rede recomendar por contexto.
^oportunidade-1
Função: Modal de seleção de país/região. Aparece no flow de Comprar e determina conjunto de providers, métodos de pagamento e moeda fiat exibidos nas telas seguintes.
Componentes
Regras de negócio
🟢 Insight Pré-seleção da região por geo + ícone de checked + posição fixa no topo da lista (separada da ordem alfabética) é padrão sólido — usuário vê imediatamente "estou aqui" e só interage com a lista se precisar mudar.
^insight-1
🔴 Fricção (cosmética — i18n parcial) Lista em inglês ("Brazil", "Aland Islands", "Albania") num app em PT-BR. Pra usuário BR procurar o próprio país, "Brasil" deveria aparecer localizado. Não é grave porque o item já está pré-selecionado no topo, mas vira problema pra usuário que queira mudar pra outra região (Argentina, México etc.). Mesma família de bug i18n de outros nós ("Canceling a limit has a network cost").
^friccao-1
🔴 Fricção (estrutural — consequência invisível da escolha de região) A região acopla a tela seguinte (lista de providers) e a moeda fiat exibida na tela de input. Mas o usuário não sabe disso no momento de escolher. Iniciante que muda de região por curiosidade volta e vê providers diferentes, moeda diferente, e talvez não consiga reverter pra estado anterior intuitivamente.
Direcionamento Kotai: ao escolher região, mostrar prévia da consequência abaixo da lista — "Brasil: providers MoonPay, El Dorado · métodos PIX, cartão · moeda BRL". Trade-off: lista mais densa, mas elimina escolha cega que afeta o resto do flow.
^friccao-2
Função: Cotação calculada. Botão Continuar ativo.
Componentes
Regras de negócio
🔴 Fricção (estrutural — paralelo visual enganoso entre swap e on-ramp) Output "0 ETH" com US$100 e botão Continuar ativo é dissonante. Sintoma: parece bug. Causa real: on-ramp não é swap. Em swap, cotação é determinística (vem do AMM) e o número exibido é o que executa. Em on-ramp, cotação só sai do provider depois do handoff — depende de fee do parceiro, método de pagamento, tier de KYC e cotação fiat do momento. A tela usa o mesmo molde visual do swap pra uma mecânica que não comporta o paralelo.
Por que solução óbvia falha: mostrar "valor estimado" (ex: ≈ 0.041 ETH) parece resolver, mas se o provider entregar 0.038 ETH por causa de fees + spread + variação fiat, a expectativa quebra piorando a fricção — vira sensação de bait-and-switch.
Direcionamento Kotai: separar visualmente os dois mundos. No estado pré-handoff, substituir o slot de output numérico por linha de status explícita: "ETH cotado pelo parceiro na próxima etapa — taxa final depende de método de pagamento e KYC". Mostrar faixa estimada apenas se a integração devolver low/high reais do provider, com fonte nominada.
^friccao-1
🟡 Oportunidade competitiva (alta leverage — atravessa todo on-ramp) Uniswap, PancakeSwap, 1inch, Jupiter — todos plugam on-ramp como tab dentro do mesmo molde visual do swap, sem sinalizar handoff a terceiro, KYC, fee de parceiro, ou que a cotação final não é a do app. Iniciante só descobre que existe um terceiro quando é despachado pra MoonPay/Coinbase no meio do fluxo, com KYC novo, fees novas, cotação diferente.
Diferenciação Kotai: explicitar o handoff antes de acontecer — badge "via parceiro fiat" na tab Comprar, microcopy de uma linha na entrada listando o provider, e na tela de cotação substituir a falsa quote por resumo do que vai acontecer. Trade-off: copy ocupa espaço, exige curadoria por provider e por região, contraria preferência comercial do parceiro de aparecer só depois do clique.
^oportunidade-1







Fluxo de tela única — página de detalhe de leilão CCA (Continuous Clearing Auction) capturada em estado concluído com provider marcado como "sem suporte". É o único ponto de presença da Uniswap em primary issuance via mecanismo de leilão contínuo. A tela concentra quatro decisões de produto que merecem herança direta para o Kotai: visualização da forma da demanda como gráfico nativo (1), narrativa de processo multi-fase com âncora temporal explícita (1), transparência honesta no failstate técnico de provider (1) e handoff direto pós-leilão para mercado secundário (1). O atrito principal está na camada informacional: iniciantes chegam a uma tela densa sem nenhum quadro mental sobre o que é CCA (ausência em desktop que o mobile endereça via modal — 1), encontram unidades heterogêneas entre as 4 KPIs (1), e um painel de ação com dois motivos de disable empilhados sem hierarquia semântica (1). Perfil mais afetado: iniciante em desktop — produto assumiu familiaridade com mecanismos CCA que esse perfil não tem.
Nota de escopo: fluxo com 1 tela analisada. Critérios de recorrência (≥2 telas) não se aplicam; fricções estruturais entram na seção principal com marcação
(estrutural, 1 tela); insights e fricção cosmética vão para Pontos isolados. Flow mobile (7 telas) permanece pendente — Fricção 4 pode ter peso revisado após essa análise.
Diagnóstico: a versão mobile da mesma página abre com modal "Este é um Leilão contínuo de liquidação" — explica em 1 frase o mecanismo e enumera 3 passos do usuário (definir orçamento, dar lance, receber tokens). Desktop entrega o iniciante direto numa tela com 4 KPIs técnicas + gráfico Preço/Demanda + painel de lance + cronograma (1) — sem esse quadro mental prévio. O problema não é a densidade; é chegar na densidade sem contexto.
Por que solução óbvia falha: replicar o modal bloqueante em desktop interrompe o usuário que já conhece CCA. Se o dismissed não for persistido, o modal reaparece em toda visita — atrito repetido para quem não precisa dele.
Alternativa concreta: banner colapsável persistente no topo da página (acima do banner "Negociar agora") — "O que é um leilão contínuo de liquidação? [Expandir]" — dismissable com estado persistido por usuário. Ou painel lateral informativo expansível que serve contexto sem bloquear a leitura da tela principal. Trade-off: mais um elemento no chrome superior; aceitar pelo ganho educacional crítico no primeiro acesso do iniciante.
Perfil afetado: iniciante em desktop (principal).
Diagnóstico: três das quatro KPIs usam ETH como unidade primária (Preço final, FDV no lançamento, Lances concentrados em); uma usa US$ primária (Volume comprometido). O olho os lê como comparativo, mas as unidades trocam entre cards (1) — "160,54K ETH" ao lado de "69,8 M US$" exige conversão mental constante antes de qualquer interpretação.
Por que solução óbvia falha: padronizar tudo em ETH torna invisível o tamanho real em fiat (160,54K ETH não diz nada para quem pensa em dólar); padronizar tudo em USD oculta o tamanho denominado em ETH (relevante para avaliar dilution de supply de ETH).
Alternativa concreta: toggle global "Denominação base" (ETH | USD) no canto da seção de KPIs — todas as 4 exibem unidade primária consistente + subscript fixo na outra. Trade-off: mais um controle de UI; resolve a fricção para todos os perfis ao custo de uma decisão única do usuário, sem esconder informação.
Perfil afetado: iniciante (principal) + intermediário.
Diagnóstico: "Leilão sem suporte" e "Leilão concluído" empilhados como avisos peers no mesmo painel (1). Os dois sinais têm consequências cognitivas opostas: "sem suporte" = nunca utilizável aqui; "concluído" = talvez depois. Tratados como peers, o usuário não sabe qual é o motivo real do disable — e não consegue antecipar se um leilão similar mas ativo seria funcional nesta interface.
Por que solução óbvia falha: mostrar só um esconderia informação relevante. Omitir "sem suporte" porque o leilão já acabou parece sensato, mas perde o sinal para usuários que chegam cedo em leilões ativos com provider sem suporte.
Alternativa concreta: separar as dimensões — "Sem suporte" como banner persistente no topo da página (estado do produto sobre este leilão, vale em qualquer fase temporal); "Concluído" como estado contextual do painel de lance apenas. Trade-off: requer decisão de design sobre prioridade visual entre os dois banners; custo aceito pelo ganho de clareza semântica.
Perfil afetado: iniciante + intermediário.
Padrão atual da indústria: CoinGecko, CoinMarketCap, DEX Screener, Uniswap, PancakeSwap — todos exibem 0,0₃155 (= 0,000155) sem qualquer mecanismo de tradução. Convenção que assume familiaridade prévia com a notação.
Por que afeta nosso target: iniciante vindo de CEX nunca viu essa notação — em CEX, preços pequenos aparecem como 0,000155 ou em sci notation (1,55e-4). Decodificar o subscript é obrigatório antes de comparar dois preços. Nesta tela a notação aparece em 4 pontos (KPIs, range de lances, stats — 1) — a fricção se multiplica. Um iniciante que lê 0,0₃155 como 0,03155 está tomando decisão com preço 200× errado.
Hipótese de diferenciação Kotai: (a) expansão visual no hover/tap: 0,0₃155 → tooltip "= 0,000155 ETH"; (b) modo global "Compacto / Expandido" nas preferências; (c) primeira ocorrência por sessão dispara micro-pílula de uma frase explicando a notação. Combinação ideal: (a) sempre disponível + (c) one-time.
Trade-off: expansão permanente polui preços do tipo 0,0₈… (muitos zeros); tooltip tem limitação em mobile. A combinação (a)+(c) cobre as limitações sem poluir a UI densa.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes principais fazem igual; (2) ✓ afeta iniciante diretamente; (3) ✓ razão = falta de investimento em design/copy, não impossibilidade técnica; (4) ✓ ganho perceptível — leitura direta de preço sem decodificar. → Aprovada.
Leverage: médio-alto — aplica a toda página de token com preço pequeno (não só Leilões; vale Tokens, Pools com memecoins). Família com 🟡 "educação inline para métricas DeFi".
Padrão atual da indústria: Uniswap exibe "% comprometido com LP" como número cru nas estatísticas. Bybit/MEXC nem expõem essa métrica. Nenhum concorrente a torna interpretável.
Por que afeta nosso target: "% comprometido com LP" define o slippage que o usuário vai encontrar ao clicar em "Negociar agora" logo após o leilão. Com 18% do volume convertido em liquidez de pool, o iniciante que clica no handoff imediatamente está entrando num pool com profundidade específica (1) — sem nenhuma pista de qual slippage esperar. É a métrica mais acionável do momento, exposta como label cru.
Hipótese de diferenciação Kotai: re-label para "Vai virar liquidez no spot: 18%" com microcopy contextual abaixo: "≈ 12,6 M US$ no pool — swaps de até X US$ com slippage <0,5%". Tooltip explicando o mecanismo de alocação de LP no protocolo CCA.
Trade-off: cálculo de slippage previsto exige modelo (depende de v3/v4, hooks, taxa do par). Aceitável se simplificado para range orientativo, não promessa de execução.
Passa nas 4 perguntas-teste? (1) ✓ nenhum concorrente torna a métrica interpretável — seja por omissão total (Bybit/MEXC não a expõem) ou por exposição crua sem contexto (Uniswap/PancakeSwap expõem como número solto); o padrão universal é "% LP = número sem interpretação"; (2) ✓ afeta iniciante diretamente; (3) ✓ razão = falta de copy interpretativa; (4) ✓ diferença perceptível — transforma número estatístico em previsão de UX do trade. → Aprovada.
Leverage: médio — específico de fluxos de leilão com handoff spot, mas crítico no momento da decisão de trade pós-issuance. Família com 🟡 "educação inline para métricas DeFi".







O fluxo de Leilões da Uniswap é tecnicamente sólido na arquitetura de filtros e na semântica de "verificado", mas carrega uma contradição central: promete marketplace de primary issuance ativo e entrega arquivo histórico de concluídos. Do hub de entrada (1) à lista expandida (7), o default por Volume comprometido combinado com o filtro Status em "Tudo" empurra leilões concluídos ao topo e priva o usuário de qualquer sinal de que algo está vivo agora. Iniciantes e intermediários são os mais afetados: chegam esperando descoberta de oportunidade em primary issuance e não conseguem distinguir o que é histórico do que é acionável sem manipulação ativa de filtros. O fluxo também concentra três oportunidades de diferenciação convergindo num mesmo eixo estratégico — transparência ativa para iniciante — que nenhum concorrente explorou de forma sistêmica.
Uniswap investe consistentemente em desambiguar o que "verificado" significa. O tooltip preventivo no hub (1) captura a interpretação errada antes de o usuário projetar significado ("não é endosso, não é recomendação") e reforça a posição de infraestrutura neutra. O filtro de primeira classe que inclui "Não verificado" como opção explícita (3) completa o sistema: transparência radical em vez de esconder projetos não aprovados. Decisão dupla bem calibrada — defensável legalmente, coerente como posicionamento, legível para iniciante.
Status, Verificação e Rede são dimensões independentes combináveis. O usuário que quer "Verificado + Ativo + Ethereum" compõe a query naturalmente sem precisar de preset editorial (4). A ordem estratégica das redes no dropdown (2) — Unichain primeiro, Ethereum segundo — comunica prioridade do produto sem leitura explícita. Padrão a herdar para Kotai: filtros como dimensões independentes, não como atalhos pré-definidos.
O disclaimer legal aparece como footer da tabela — no final da leitura natural do resultado — e não como header genérico de página (6). O link "Mostrar leilões ocultos" sinaliza curadoria silenciosa sem modal impositivo (7). Em ambos os casos, o produto opta por disclosure contextual: a informação de risco aparece próxima ao momento de uso, não como aviso ambiental que o usuário aprende a ignorar. Padrão a herdar.
Diagnóstico: dois vetores convergindo no mesmo efeito. (1) Sort default por Volume comprometido (1) privilegia quem acumulou mais volume ao longo da janela inteira — leilões concluídos que ficaram semanas abertos superam qualquer leilão ativo recente. (2) Filtro de Status em "Tudo" (4) mistura concluídos e ativos no mesmo ranking sem split visual. Resultado: em toda captura disponível — hub com 4 cards (todos "Concluído") e lista expandida de 40+ entradas (7) com 100% das células de "Tempo restante" dizendo "Concluído" — a página inteira parece um arquivo histórico. A promessa da tab "Leilões" (descobrir primary issuance) não é entregue na primeira visão.
Por que a solução óbvia falha: trocar default para "Ativo" zera a página quando não há leilão ativo (caso real do snapshot) — lista vazia parece mais quebrada que lista cheia de concluídos. Separar "verificados" e "não-verificados" em seções tipográficas fortes cria endosso por contraste que conflita com o ethos de infraestrutura neutra.
Alternativa: descolar o split do filtro. Banda fixa no topo "Ativo agora (N)" — mesmo vazia, com estado "Nenhum leilão ativo no momento — [me avise quando houver]" — seguida de "Encerrados recentes" ordenados por data de encerramento (mais recente primeiro). O filtro de Status vira refinement de cada banda, não gating de visibilidade. Trade-off: duas seções aumentam altura da viewport e exigem decisão editorial de "o que conta como recente"; aceitar em troca de comunicar a temperatura do mercado sem o usuário precisar filtrar.
Perfil afetado: iniciante (principal — não sabe que precisa filtrar) + intermediário.
O trigger do filtro de Rede (cluster de logos + chevron, 2) e o trigger de busca (ícone de lupa, 5) são os únicos controles da barra de filtros sem label textual, enquanto "Verificação ▾" e "Status ▾" têm label desde o início. Inconsistência interna de affordance recorrente nos dois controles. Solução incremental: "Rede ▾" + logo ativo para o filtro; input visível em desktop large para a busca.
Perfil afetado: iniciante.
Três oportunidades distintas convergindo no mesmo eixo estratégico. Implementadas juntas, formam um sistema que nenhum concorrente tem.
(A) Educação inline para métricas DeFi (FDV, TVL, Volume, Market Cap) Vista em 1, reforçada pelo caso isolado de busca em 6 (resultado único com FDV e Volume em micro-caps sem nenhuma régua de comparação para o iniciante).
Padrão atual da indústria: Uniswap, PancakeSwap, CoinGecko, DEX Screener — todos exibem métricas sem pedagogia contextual. Quem sabe, sabe; quem não sabe, decora um número.
Por que afeta o target: iniciante/intermediário aloca olhando "FDV" sem entender que é forward-looking. Confunde com market cap. Erra avaliação de risco sistematicamente.
Hipótese de diferenciação Kotai: micro-pílulas contextuais no 1º encontro com cada métrica — popover de uma frase com analogia ("FDV = preço × supply TOTAL, incluindo o que ainda não circula"). Marca como "entendido" após visualização; não repete. Leverage: toca Tokens, Pools, Leilões, Portfolio — não é feature de tela, é sistema.
Trade-off: requer estado por usuário (visto/não visto) e curadoria de copy por métrica; opt-out para avançado.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes fazem igual (2) ✓ afeta iniciante/intermediário diretamente (3) ✓ razão = falta de investimento em design + copy, não impossibilidade (4) ✓ entender FDV antes de alocar é diretamente acionável.
(B) Nudge contextual de risco ao filtrar "Não verificado" Vista em 3, com contrapartida estrutural no marco visual da lista densa (7).
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch, Sushi — filtrar "Não verificado" produz tabela visualmente idêntica à de verificados. Mesmo chrome, mesma densidade, zero diferença de tom.
Por que afeta o target: iniciante filtra por curiosidade, vê tabela familiar, e perde a noção de que está em território de risco maior. A escolha cognitivamente leve deveria ser pesada.
Hipótese de diferenciação Kotai: banner sutil acima da tabela ao filtrar "Não verificado" pela primeira vez — "Estes leilões não passaram pelo processo de verificação. Podem ser legítimos; podem não ser. Faça due diligence." Dismiss persistido por sessão. Se o sistema for cross-fluxo (Tokens "Spam", Pools "Não verificado"), vira família coerente de nudges de risco — não feature de tela, sistema de produto.
Trade-off: risco de paternalismo (Uniswap evita; Kotai mirando iniciante pode aceitar). Custo de gerenciar estado de dismiss.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes fazem igual (2) ✓ afeta sobretudo iniciante (3) ✓ razão = falta de investimento + receio de parecer paternalista, não impossibilidade (4) ✓ pode prevenir entrada em scam — ganho perceptível e acionável.
(C) Fenestração da curadoria silenciosa Vista em 7, família com a fricção de numeração com gaps (7).
Padrão atual da indústria: PancakeSwap e 1inch escondem spam silenciosamente sem affordance "mostrar tudo". Dexscreener exibe tudo sem filtro. Uniswap está no meio — esconde, dá link "Mostrar leilões ocultos" (7), mas não explica o critério. Em nenhum modelo o usuário sabe qual filtro foi aplicado e qual é o universo real.
Por que afeta o target: iniciante toma a lista de 40 como "o universo de leilões" e tira conclusões erradas sobre o ecossistema. Intermediário que percebe o link "Mostrar ocultos" não tem como avaliar se o critério é razoável ou se está perdendo coisa boa.
Hipótese de diferenciação Kotai: counter explícito + critério clicável no header da tabela — "Mostrando 40 leilões · 13 ocultos por: volume <$1, criado <24h, contrato não verificado [ⓘ ver critérios]". Critério visível inclui sinais manipulação-resistentes (idade do contrato, deploy verificado on-chain) para reduzir incentivo a gaming.
Trade-off: revelar critério numérico puro permite gaming trivial (volume mínimo $1,01 vira piada). Aceitável se o critério incluir sinais manipulação-resistentes; se for puramente threshold numérico, gaming é trivial. Pergunta-teste mais fraca desta oportunidade: (3) — a razão de ninguém ter feito é falta de investimento + medo de gaming, não impossibilidade. Aceitar o trade-off desde que o design do critério seja robusto.
Consequência de 2ª ordem: se fenestrar a curadoria virar padrão sistêmico (Tokens, Pools, NFTs), Kotai constrói uma marca de "DEX que mostra como pensa" — leverage de posicionamento, não só UX local.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes são opacos de formas diferentes (2) ✓ afeta iniciante e intermediário (3) ✓/⚠ razão = falta de investimento + medo de gaming — aceitar com critério robusto (4) ✓ confiança via transparência é perceptível.
Convergência estratégica: (A) educa o usuário sobre o que os números significam; (B) avisa quando ele está em território de risco maior; (C) explica qual filtro foi aplicado à lista. Implementadas juntas, formam o sistema "DEX que mostra como pensa" — diferencial de posicionamento, não só de UX. Leverage: alto para iniciante; nenhum concorrente implementou as três em conjunto.
(estrutural, 1 tela)(estrutural, 1 tela)(estrutural, 1 tela)A lista 40+ da tela 7 é UX de power user (analista varrendo emissões de primary issuance). O target iniciante/intermediário do Kotai raramente chegará aqui naturalmente — e se chegar, a densidade atual não serve. Copiar essa profundidade significa construir tela para ninguém do target. Recomendação: default do Kotai numa visão curada (verificados ativos + próximos lançamentos + encerrados recentemente) com escape "modo avançado" opt-in para a lista densa. Não é fricção da Uniswap — é decisão estratégica de produto que a análise deste fluxo evidencia.
Os drafts de lote permanecem em analises/uniswap/_consolidado/_drafts/leiloes-lote-1.md e leiloes-lote-2.md como audit trail.












Função: Visualizar o catálogo completo de pools ranqueado por TVL desc, sem filtros aplicados.
Componentes (observações da visão completa):
Regras de negócio:
(par × versão × fee) cada combinação = entrada de tabela independente.rede também participa do produto cartesiano (vide Fricção 1 de Pools #3) — exacerba a multiplicação.🟢 Insight 1 — Transparência radical na cauda longa. Listar pool #100 com TVL 4,3 M US$ ao lado de pools de US$ 130M no topo é decisão deliberada de neutralidade — Uniswap mostra tudo, não cura para um top-N estético. Coerente com tese de "infraestrutura neutra, não curadora". Padrão a herdar pra Kotai com ressalva — transparência sem fenestração vira lista de armadilhas (vide Fricções 2, 3 e 4). ^insight-1
🟢 Insight 2 — Vol/TVL como coluna final revela cauda viva. Em sort por TVL desc, pool #100 CULT/ETH (TVL 4,3 M) ainda mostra Vol/TVL 0,54 — pool pequeno mas com yield real. A última coluna funciona como "verdade silenciosa" da tabela: enquanto sort força hierarquia por estoque, Vol/TVL revela onde o capital realmente trabalha. Confirma o Insight 1 de Pools #1 (posição = leitura final). ^insight-2
🔴 Fricção 1 — Fragmentação do mesmo par em ≥8 instâncias sem agregação (estrutural — afeta LP novo e leitor comparativo, leverage alto)
🔴 Fricção 2 — Vol/TVL extremo (>5) exibido cru sem sinalização de wash trading (estrutural — vetor de scam invisível)
🔴 Fricção 3 — Renda anual ≥100% exibida sem marcação pedagógica (estrutural — vetor FOMO)
🔴 Fricção 4 — Cauda longa com tokens de qualidade heterogênea sem fenestração da curadoria (estrutural — afeta posicionamento antiscam, leverage alto)
🟡 Oportunidade competitiva 1 — Sinalização interpretativa de outliers em Vol/TVL e APR (família "pedagogia anti-FOMO")
🟡 Oportunidade competitiva 2 — Verificação por token em pool (filtro + badge)
Família consolidada — "transparência ativa para iniciante" cresceu pra 4 fios convergentes:
Para Kotai, essas não são oportunidades isoladas — formam um sistema pedagógico anti-FOMO que pode ser tese de produto distinta de "DEX para iniciante". O risco de implementar uma sem as outras é virar paternalista pontual; implementar como sistema vira posicionamento.
Observação adicional (paginação ausente): 100 entradas sem paginador visível sugere top-100 fixo ou scroll infinito. Top-100 fixo esconde pools de longuíssima cauda (>100) que podem ser legítimos (pool jovem, par novo); scroll infinito performa mal em viewport mobile e prejudica recuperação de posição ("onde eu estava?"). Pra Kotai, decisão a tomar — paginador clássico, scroll com âncora de rank visível, ou top-N + busca como entrypoint pra cauda.



Função: Mesma tela de Pools com a lupa de busca expandida em input "Procurar pools". Filtro inline sobre a tabela, sem modal.
Componentes adicionais (em relação a #1)
Regras de negócio
🟢 Insight 1 — Busca inline preserva contexto da tabela. Diferente de modal (que tira o user da view), o input expande no mesmo eixo da linha de filtros e a tabela continua visível atrás. Pattern de "refinement progressivo" — Protocolo + Rede + Search compõem filtros, não competem por estado de viewport. Padrão a herdar pra Kotai — buscas que refinam tabela existente devem permanecer na mesma viewport; só vira modal quando a busca tem escopo cross-página. ^insight-1
🟢 Insight 2 — Search como cidadã equivalente aos outros filtros. Mesma altura, mesmo nível visual, mesmo eixo de Protocolo ▾ e Network selector. Sinaliza que busca textual é só mais uma dimensão de refinement — não privilegiada (como search global do header) nem escondida (como busca de submenu). Padrão a herdar — quando search é dimensão de filtro, tratar como filtro; quando é entrypoint global, separar visualmente. ^insight-2
🔴 Fricção 1 — Trigger lupa sem label até clicar (cosmética; mesma família de Leilões #2, #5)
🔴 Fricção 2 — Empty state vazio em catálogo gigante (estrutural-leve; menos grave que Leilões #5)
Sobre 🟡 oportunidade: considerei mas descartei. Search em tabela densa é convenção universal (Excel, Linear, Notion, todo DEX); empty state pobre é resolvível com curadoria editorial, não com paradigma novo. Não chega a diferenciador competitivo estrutural. Manter no escopo de polish.

Função: Restringir a lista de pools por blockchain. Dropdown ancorado no cluster de logos de rede.
Componentes
Regras de negócio
🟢 Insight 1 — Solana na lista (única non-EVM) sinaliza ambição cross-VM real. Concorrentes diretos (PancakeSwap, 1inch) mantêm-se exclusivamente EVM. Uniswap quebra a barreira EVM/SVM, e isso aparece de forma quieta — sem manchete, só como mais uma rede na lista. Padrão a herdar pra Kotai — se a ambição é multi-VM, sinalize discretamente desde o primeiro produto; multichain como atributo de catálogo ≠ marketing de feature. ^insight-1
🟢 Insight 2 — Badge "Novo" em Tempo comunica evolução sem inflar permanente. Adicionar rede é decisão estratégica visível ao user, mas sem virar manchete permanente ("Novo" expira). Padrão útil — features/integrações novas aparecem como sinal contextual, não viram chrome eterno. Aplicação ampla pra Kotai (novos pares, hooks v4, etc.). ^insight-2
🟢 Insight 3 — "Todas as redes" como default reconhece o modelo mental atual. Iniciante e intermediário não pensam em rede como entrada do funil; pensam em ativo/par e descobrem rede como atributo. Default que agrega cross-chain respeita esse modelo. Padrão a herdar — onde a rede é dimensão de filtro (não decisão de carteira), default agregado. ^insight-3
🔴 Fricção 1 — "Todas as redes" como default em Pools é semanticamente diferente do que em Tokens (estrutural — afeta interpretação da tabela inteira)
🔴 Fricção 2 — Sem busca interna em lista escrolável (cosmética; convenção problemática)
🔴 Fricção 3 — Sem contagem de pools por rede (cosmética; mesma fricção de Leilões #2)
🟡 Oportunidade competitiva — Modelo de objeto "Pool canônico" para agregação cross-chain
Observação adicional (ordem das redes como vetor de influência): Unichain em 3º lugar (antes de Base/Arbitrum, redes com mais volume) é decisão de cross-promo — vetor sutil de influência sobre escolha. Não é fricção (consistente com Leilões #2 observação), mas pra Kotai vale registrar: ordem em seletores de rede pode ser organizada por liquidez, uso do user, ou estratégia comercial — a decisão deve ser explícita, não default acidental herdado de "como nós listamos no admin".

Função: view mobile equivalente da pool detail WISE/ETH v2 0.3%. Mesma identidade da entidade do desktop (Telas 1–3) reorganizada em layout de coluna única: header compactado → big stat → chart → toggle de tipo → CTAs. Sidebar de Estatísticas (APR / TVL / Volume / Tarifas) não aparece neste viewport — presumivelmente foi empurrada pra baixo do chart (visível em telas posteriores do flow mobile) ou suprimida pela hierarquia mobile-first.
Componentes
app.uniswap.org + back/refresh).Pools › WISE / ETH (presente em mobile, não confirmado nas capturas desktop — distinção a checar).WISE / ETH + chips v2 0.3% + setinha de inverter par (↑↓) + 0x21b8…596E com copy + menu overflow (•••).100,00 a 600,00 US$ e eixo X 15:00 | 6/05 | 03:00 — datas e horas misturadas no mesmo eixo. Duas barras dominantes coladas próximas ao centro/direita (~400 e ~440 US$).Preço | Volume ✓ | Liquidez ancorado abaixo do chart.Regras de negócio
15:00 (hora) com 6/05 (data) — sinaliza que o intervalo 1D atravessa fronteira de dia (chart cruza meia-noite).🟢 Insight 1 — Eixo X com data inline (6/05) resolve parcialmente a Fricção 3 da Tela 2 desktop. A versão mobile mostra 15:00 | 6/05 | 03:00 no eixo, ancorando temporalmente o gráfico (o usuário vê que o range cruza dia). No desktop, o mesmo chart aparece com 22:00 – 11:00 sem data — ambíguo. A regra de breakpoint do produto força mobile a ser mais explícito (menos espaço → ticks mais econômicos → data passa a ser tick). Aqui mobile é mais pedagógico que desktop. Padrão a herdar pra Kotai: forçar âncora de data no eixo X em qualquer chart, em qualquer breakpoint — não tratar desktop como "tem espaço, dispenso a data". ^insight-1
🟢 Insight 2 — CTAs primários como barra inferior fixa preservam ação durante scroll. Mesmo quando o usuário rola pra ver Transações (Tela 5 / Mobile2), os botões "Fazer swap" e "+ Adicionar liqu…" permanecem ancorados embaixo. Decisão correta — em mobile, o entrypoint da ação não pode depender de scroll-up. Padrão a herdar pra Kotai: CTAs primários de página de entidade ficam em sticky bar, não em hero card que sai do viewport. ^insight-2
🟢 Insight 3 — Breadcrumb Pools › WISE / ETH mantido em mobile. Em mobile-first é comum apagar breadcrumbs (espaço caro), substituindo por botão de voltar. Aqui o produto mantém — o usuário sempre sabe que está dentro da Pools list (a entidade pai do pool). Diferencia mobile orientado a navegação hierárquica de mobile orientado a fluxo linear. Padrão a herdar. ^insight-3
🔴 Fricção 1 — APR / TVL / Volume / Tarifas (sidebar inteira de saúde do pool) sumiram do entrypoint mobile (estrutural — quebra de paridade informacional crítica entre breakpoints) ^friccao-1
APR 0,00% + TVL 135,3 M US$ ↑1,27% + Volume 24h 4,2 mil US$ ↓81,84% + Tarifas — o conjunto de KPIs que diagnosticam saúde da pool. Em mobile, este viewport mostra big stat (1,3 mil US$ Há um dia) e chart — não há APR, não há TVL, não há delta de volume, não há saldo do pool. O usuário mobile que pretende clicar em "+ Adicionar liqu…" (botão visível, sticky e acessível) não recebe nenhum sinal de que o pool está com APR 0,00% e Volume 24h ↓81,84% antes de prosseguir. A barriga do flow LP em mobile pula o sinal de "este pool está morto", sinal que no desktop está justaposto ao botão.APR 0% • TVL 135M • Vol 24h ↓82%. Três métricas, sem labels longos, deltas com seta. Quando o usuário toca em qualquer chip, expande para um drawer com explicação contextual (a mesma narrativa proposta na Fricção 2 da Tela 2: "Pool com volume baixo, fees insuficientes pra gerar renda anual"). Trade-off: adiciona 32–40 px de altura no topo; ganho: paridade informacional preservada + entrypoint mobile não vira armadilha.🔴 Fricção 2 — Badge "Os dados podem estar desatualizados" sobreposto à área desenhável do chart (estrutural — oclui informação primária com aviso secundário) ^friccao-2
Última atualização: 11:18 (há 9 min). Stale deixa de ser banner e vira propriedade do dado. Trade-off: exige timestamp confiável da fonte; ganho: chart preserva área desenhável e ainda assim sinaliza staleness.🔴 Fricção 3 — Big stat 1,3 mil US$ no mobile diverge de 4,2 mil US$ no desktop (mesmo "Há um dia"), e a divergência não tem âncora temporal (estrutural — mesma raiz da Fricção 2 desktop, manifesta agora entre breakpoints) ^friccao-3
Há um dia vira tooltip-on-tap mostrando janela exata (Últimas 24h: 10/05 11:27 → 11/05 11:27 — atualiza a cada 30s). Sem ocupar superfície adicional, mas existe pro usuário que duvidou. Trade-off: tooltip em mobile exige tap explícito; ganho: ambiguidade temporal vira fact disponível sob demanda.🔴 Fricção 4 — + Adicionar liqu… truncado em sticky bar mobile (mesma fricção 4 da Tela 2 desktop, agora estrutural) (estrutural-cosmética — CTA primário truncado num breakpoint onde truncamento mata o affordance) ^friccao-4
+ Liquidez perde o verbo (Adicionar) e pode soar como "ir pra página de liquidez"; usar só ícone (+) sem texto destrói affordance.Adicionar liquidez / Comprar / Vender. O produto decide qual ação é prioritária pra mobile e amplifica essa; o resto desce de hierarquia. Trade-off: perde simetria visual entre os dois CTAs; ganho: nenhum CTA primário truncado.🟡 Oportunidade competitiva — Strip horizontal de KPIs de saúde do pool acima do chart em mobile (não esconder a saúde atrás do scroll) ^oportunidade-1
APR 12% • TVL 8M • Vol ↑20% em verde discreto; em pool morto, mostra APR 0% • TVL 135M • Vol ↓82% com semáforo de cor. Tap em qualquer chip abre bottom sheet com explicação narrativa (vide Fricção 2 da Tela 2 desktop). Em mobile a sidebar não existe — o chip-strip é a única superfície de saúde no entrypoint, então tem que ser inteligível por si só.Observação adicional — paridade desktop ↔ mobile como princípio. A análise expõe que mobile NÃO é "desktop reorganizado". As Fricções 1 e 4 saltam de cosméticas (desktop) para estruturais (mobile) por causa do constraint de viewport: o que cabe na sidebar lateral do desktop não tem lar natural em mobile. Decisão pendente pra Kotai: em vez de "design desktop primeiro, comprime pra mobile" (caminho que produz justamente essas fricções), decidir mobile-first quais KPIs sobrevivem no entrypoint da entidade e quais ficam atrás de scroll/tap. A sidebar desktop deveria ser uma expansão do chip-strip mobile, não o contrário.
Ordem-limite com preço de mercado preenchido + Expiração visívelFunção: estado seguinte ao da Tela 9 — usuário tocou em Mercado (chip selecionado) e o card Preço-limite reagiu: label mudou de Preço-limite pra Quando 1 WISE valer, e o input foi auto-preenchido com o preço atual em ETH (0,0000550306). Linha de Expiração revelada abaixo dos campos Vender/Comprar com chips 1 dia / 1 semana / 1 mês / 1 ano.
Componentes
Fazer swap | Ordem-limite ✓ | Comprar | Vend).Quando 1 🦄 WISE valer (em vez de "Preço-limite" estático da Tela 9) + setinha de inversão ↑↓.0,0000550306 (8 dígitos decimais significativos) + pílula ETH.Mercado ✓ / +1% / +5% / +10% (mesma fileira).0 + WISE ▾.↓).0 + ETH ▾.Expiração cinza + chips 1 dia / 1 semana ✓ (selecionada) / 1 mês / 1 ano.Confirmar (disabled).Regras de negócio
1 semana (não a opção mais curta nem a mais longa — middle ground).Mercado selecionado não trava o input — usuário pode editar livremente após o auto-preenchimento.🟢 Insight 1 — Label contextual Quando 1 WISE valer substitui Preço-limite no momento certo. A copy estática "Preço-limite" é jargão técnico; "Quando 1 WISE valer" é linguagem natural — "eu quero executar a ordem quando 1 WISE valer X ETH". A mudança acontece exatamente quando o usuário tem dado pra ler (preço preenchido), não no estado vazio (onde a frase seria ambígua). Padrão a herdar pra Kotai: copy de label deve mudar de estática (vazia) pra contextual (preenchida), traduzindo jargão pra frase em prosa quando há dado a explicar. ^insight-1
🟢 Insight 2 — Auto-preenchimento do preço atual ao selecionar Mercado reduz fricção de cálculo. Em vez de exigir que o usuário cole o preço de mercado, o chip Mercado preenche o campo. Usuário que quer ordem-limite "exatamente no mercado" (caso degenerado mas válido) ganha o ato gratuito. Padrão a herdar — chip ativo deveria sempre preencher o campo, não apenas marcar visualmente. ^insight-2
🟢 Insight 3 — Expiração com chips humanos (1 dia / 1 semana / 1 mês / 1 ano) em vez de date picker. Calendário/datetime picker em mobile é frição ergonômica conhecida (scroll de mês, ano, hora). Chips de "1 X" cobrem 95% dos casos. Padrão a herdar — preset chips para domínios temporais quando precisão de segundo/minuto não importa. ^insight-3
🟢 Insight 4 — Default de 1 semana em Expiração é escolha conservadora-pragmática. Não é a opção mais curta (1 dia, agressiva, força recriar a ordem cedo) nem a mais longa (1 ano, perigosa, esquece ordem ativa por meses). 1 semana cobre cenário típico de "esperando preço subir/cair". Padrão a herdar: default em flow de risco financeiro deve ser safe-middle, não extremo. ^insight-4
🔴 Fricção 1 — Linha de Expiração só aparece depois que o card Preço-limite é preenchido — não há aviso na Tela 9 de que ela existe (estrutural — feature crítica revelada por progressive disclosure tardio) ^friccao-1
Confirmar (se valores preenchidos) sem ter encontrado Expiração — produto silenciosamente aplica algum default (1 semana?). Em ordem-limite, expiração é input crítico: ordem com expiração 1 ano em pool morto pode ficar aberta cobrando gas de cancelamento futuro; ordem com 1 dia pode expirar antes do preço bater. Progressive disclosure aqui escondeu o que deveria ser visível desde o início.1 semana pré-selecionado mesmo no estado vazio. O input não exige preenchimento (chips já cobrem), então não polui o estado vazio com "campo obrigatório a preencher". Trade-off: sheet ganha ~50 px de altura no estado vazio; ganho: zero feature crítica escondida.🔴 Fricção 2 — Label Quando 1 🦄 WISE valer é contextual mas a unidade no input (0,0000550306 + ETH) é difícil de ler em mobile (estrutural — pedagogia em label, mas perdida no número) ^friccao-2
0,0000550306 é 8 dígitos decimais. Em fonte grande mobile o número ocupa quase toda a largura do card. Iniciante lê e... não tem heurística. Quantos zeros são? É menor ou maior que o preço de ontem? 5,5 × 10⁻⁵ é nada visível pra quem não decoda decimais. O label virou prosa ("Quando 1 WISE valer"), mas o número permaneceu jargão técnico.5,50 × 10⁻⁵ ETH) é pior pra usuário não-quant; conversão pra USD (0,21 US$) muda a unidade do par e perde a relação fundamental WISE↔ETH; mostrar dois números (ETH + USD) polui o card.0,0000550306 ETH ≈ 0,21 US$ em cinza pequeno (eyebrow USD). Mantém a precisão técnica no campo (ETH, 8 decimais) + entrega leitura intuitiva em fiat (USD). Usuário lê "ah, então quero vender quando 1 WISE valer 21 centavos" e decide. Trade-off: +16 px de altura; ganho: tradução automática técnica → intuitiva.🔴 Fricção 3 — Expiração 1 ano apresentada como opção igual às demais — sem aviso de risco de ordem dormente longa (estrutural — opção carregada sem semáforo) ^friccao-3
1 dia / 1 semana / 1 mês / 1 ano têm tratamento visual idêntico. Em produto financeiro com aprovação de token (allowance) atrás da ordem, ordem com expiração 1 ano significa que a aprovação WISE→contrato fica ativa por 1 ano. Se o contrato for comprometido ou o usuário esquecer da ordem, exposição é longa. Iniciante mobile toca 1 ano sem decodar consequência. Risco silencioso embutido no chip mais longe da seta.1 ano é overengineering — caso válido existe (LP que quer venda de tail risk); avisar com modal a cada seleção é fricção excessiva.1 ano recebe eyebrow de aviso discreto — ícone ⚠ pequeno ao lado do chip + microcopy abaixo dos chips quando 1 ano é selecionado: "Ordens longas mantêm aprovação ativa. Considere revogar após executar." Aviso pedagógico no momento exato da decisão, sem bloquear. Trade-off: polui levemente o chip; ganho: usuário aprende sobre allowance sem precisar ler docs.🟡 Oportunidade competitiva — Tradução automática técnica → intuitiva em qualquer campo numérico com unidade não-fiat ^oportunidade-1
0,0000550306 ETH). Conversão pra USD existe em outros lugares (carteira, page de token), mas não anotada inline no widget de operação. Usuário precisa fazer ginástica mental ou abrir outra view.≈ 0,21 US$ em eyebrow muda decisão visceralmente.Observação adicional — auto-foco no input após chip selecionado. Captura não mostra cursor visível, mas pelo comportamento esperado, ao tocar em chip Mercado o input deveria manter foco ou abrir teclado virtual pra edição manual. Decisão a tomar pra Kotai: chip preenche e mantém teclado aberto (incentiva edição manual) ou chip preenche e fecha teclado (chip foi a decisão final). Ambas defensáveis. Não é fricção desta tela; é decisão arquitetural a calibrar com teste de usuário.
Comprar (on-ramp fiat → ETH com seletor BRL mas input em US$)Função: tab Comprar ativa no bottom sheet — fluxo de on-ramp (entrada de fiat pra cripto) iniciado a partir do contexto da pool WISE/ETH. Header sticky da pool voltou a aparecer (vs Telas 9–10 onde sumiu). Card de comprar exibe seletor de moeda fiat com bandeira do Brasil, input gigante em US$0 e chips de presets em dólar; abaixo, card menor seleciona token de destino (ETH), CTA disabled e aviso âmbar repetido sobre WISE-CEX.
Componentes
WISE / ETH v2 0.3% + 0x21b8…596E (versus Telas 9–10 onde o sheet em full-screen comeu o header).Fazer swap | Ordem-limite | Comprar ✓ | Vend).Você está comprando em cinza pequeno + seletor de moeda fiat: bandeira do Brasil 🇧🇷 + chevron ▾ à direita.US$0 (centralizado, fonte enorme).100US$ / 300US$ / 1000US$.ETH + chevron › (afford de trocar token).Insira um valor (disabled).Regras de negócio
Comprar é on-ramp (fiat → cripto), não swap entre tokens.ETH (e não WISE, apesar do contexto ser a pool WISE/ETH e WISE ser o "token destacado" do par).US$0 e presets em US$.🟢 Insight 1 — Header sticky da pool voltou. A Tela 8 (Fazer swap) tem header sticky; Telas 9–10 (Ordem-limite expandido) perdem; aqui na Tela 11 ele voltou — sugere que Comprar cabe na altura padrão do sheet sem promover pra full-screen, então o header sobrevive. Bom sinal arquitetural — produto preserva contexto quando o conteúdo permite. Padrão a herdar: medir altura do conteúdo do sheet por tab; expandir só se obrigatório. ^insight-1
🟢 Insight 2 — Chips de preset (100 / 300 / 1000 US$) em on-ramp são pedagogia visual + redução de fricção. Iniciante que nunca comprou cripto não sabe "quanto comprar" — chips de 3 ordens de grandeza entregam ancoragem visual (100 = experimental, 300 = padrão, 1000 = sério). Padrão a herdar pra Kotai: presets em on-ramp devem cobrir 3 ordens de grandeza, não apenas 3 valores próximos. ^insight-2
🔴 Fricção 1 — Seletor de moeda mostra 🇧🇷 mas input e presets estão em US$ — moeda exibida e moeda operada estão divergentes (estrutural — bandeira é mentira de localização) ^friccao-1
100US$ e vê o input mudar pra US$100. Confusão imediata: a bandeira é só visual? A moeda nominal é dólar, mas o pagamento será via PIX/cartão em reais (com conversão escondida)? Ou o usuário precisa ter saldo em USD? O produto não responde. Iniciante mobile fica travado tentando descobrir o que aquela bandeira significa.R$0 muda o significado do "1000 US$" (que vira "1000 R$" — valor totalmente diferente — ou "≈ 5000 R$" via conversão dinâmica) e quebra os chips de preset; remover a bandeira tira a indicação de geo, deixando ambíguo "qual a moeda de pagamento".R$0 (input + chips em reais: R$500 / R$1.500 / R$5.000) + eyebrow ≈ US$100 em cinza. Bandeira no seletor confirma "você está pagando em reais". Se o usuário trocar pra 🇺🇸 USD, input vira US$0 com chips em USD. Moeda exibida = moeda de pagamento; conversão exibida como eyebrow. Trade-off: requer FX rate confiável (já necessário pra cobrança), localizar chips de preset por moeda; ganho: zero ambiguidade.🔴 Fricção 2 — Token de destino default = ETH, ignorando que o contexto da pool é WISE/ETH e o "token destacado" é WISE (estrutural — quebra do princípio "ações herdam contexto" estabelecido nas Telas 8/9) ^friccao-2
Fazer swap) pré-selecionou WISE em Vender (correto: contexto herdado). Na tab Comprar, o produto pré-seleciona ETH como token a comprar — quebra a lógica do contexto. Usuário que veio à pool detail querendo "comprar WISE com fiat" precisa trocar o token destino manualmente (tap em ETH → chevron → seletor). Em mobile esse tap extra rejeita o caso de uso mais óbvio do flow.🔴 Fricção 3 — Aviso âmbar sobre WISE-CEX persiste na tab Comprar onde o usuário está comprando ETH (não WISE) (cosmética-estrutural — aviso irrelevante por inércia) ^friccao-3
🟡 Oportunidade competitiva — Localização sistêmica de on-ramp (moeda nominal = moeda de pagamento, com conversão como eyebrow) ^oportunidade-1
US$100 no input, paga R$502 no PIX, e perdeu transparência da cobrança real.R$502 desde o início — com ≈ US$100 como eyebrow — entrega transparência que diferencia.R$500 / R$1.500 / R$5.000 para BRL, MX$2.000 / MX$6.000 / MX$20.000 para MXN, etc.). Conversão pra USD como eyebrow + timestamp do FX rate. Quando moeda de pagamento muda (usuário troca seletor), tudo recalcula.Observação adicional — flow Comprar na pool detail vs flow Comprar global. A tab Comprar aparece tanto aqui (no contexto da pool) quanto provavelmente em outros pontos do produto (header, page do token, possivelmente CTA de portfolio vazio). Decisão a tomar pra Kotai: o token default muda por contexto? Aqui na pool WISE/ETH default = ETH (Fricção 2). No header global default seria qual? Consistência arquitetural importa: se cada entrypoint pré-seleciona token diferente, o usuário não constrói modelo mental. Documentar como matriz [entrypoint × token default × razão] antes de portar pro Kotai.
Ordem-limite (estado inicial vazio)Função: quinto estágio do bottom sheet do widget — usuário trocou de tab Fazer swap (Tela 8) pra Ordem-limite. Sheet expandiu pra full-screen (header sticky da pool desapareceu). Layout muda em relação à tab anterior: ganha card de Preço-limite acima dos campos Vender/Comprar, com chips de presets de preço (Mercado / +1% / +5% / +10%) e aviso âmbar específico de ordem-limite no rodapé.
Componentes
Fazer swap / Ordem-limite ✓ (selecionada) / Comprar / Vend (truncado).Preço-limite + setinha de inverter par (↑↓) no canto direito.0 à esquerda + pílula ETH (avatar + símbolo) à direita.Mercado ✓ (selecionado, fundo claro) / +1% / +5% / +10%.0 + pílula WISE ▾ (seletor de token).0 + pílula ETH ▾.Confirmar (disabled, fundo escuro).Regras de negócio
Mercado (sem markup positivo) — default conservador: ordem dispara no preço atual.+1%/+5%/+10% aplicam markup acima do preço de mercado (assumindo que ordem-limite default é vender acima/comprar abaixo). Direção do markup não é exposta na UI.🟢 Insight 1 — Aviso âmbar explicativo + link "Saber mais" em produto que default é mudo é decisão pedagógica correta. Pela primeira vez no flow, o produto reconhece que o usuário precisa de pedagogia adicional. Ordem-limite tem comportamento não-óbvio (preço pode bater e a ordem não executar — caso clássico: liquidez seca antes do fill). Em vez de assumir que o usuário sabe, produto escreve "isso pode não funcionar; clique aqui pra entender". Padrão a herdar pra Kotai: quando a feature tem modo de falha não-intuitivo (slippage alto, sandwich attack, MEV, expiração de ordem), o aviso de risco é cidadão de primeira classe — não tooltip escondido. ^insight-1
🟢 Insight 2 — Chips Mercado / +1% / +5% / +10% reduzem cognitive load do markup. Sem os chips, usuário precisa calcular: "preço atual é X; quero vender 5% acima, então X × 1,05". Chip resolve em 1 tap. Pedagogia visual extra: chips mostram a unidade (% acima do mercado) e a direção esperada (acima = vender mais caro). Padrão a herdar pra Kotai: presets numéricos pra qualquer campo com cálculo derivado de uma âncora (slippage, markup, range de LP, expiração). ^insight-2
🟢 Insight 3 — Inversão da unidade de preço (↑↓ ao lado de Preço-limite) permite ler o limite na unidade que faz sentido. Vender WISE por ETH? O limite faz mais sentido lido em ETH por WISE ou em WISE por ETH? Setinha resolve. Padrão a herdar — inversão de unidade é comutativa, não destrutiva. ^insight-3
🔴 Fricção 1 — Bottom sheet promove pra full-screen e o header sticky da pool desaparece, quebrando o contexto "estou operando na pool WISE/ETH" (estrutural — perda de identidade da entidade no momento da operação) ^friccao-1
Ordem-limite, o sheet expande pra ocupar quase 100% do viewport e o header sticky some. Usuário que chega na Tela 9 vendo um seletor com "Preço-limite" + "Vender 0 WISE" + "Comprar 0 ETH" pode esquecer/duvidar de qual pool está operando — especialmente após meio minuto preenchendo. Em DeFi, operar no pool errado é dano financeiro: pool WISE/ETH v2 0,3% vs pool WISE/ETH v3 0,05% são contratos distintos com slippage diferente. Sem âncora visual, usuário pode achar que está em outra pool.WISE/ETH v2 0.3% em 1 linha discreta. Não é o card completo (sem endereço, sem ícones de copy), só identidade visível. Trade-off: ~24 px adicionais no topo do sheet; ganho: contexto preservado mesmo em full-screen.🔴 Fricção 2 — Direção do markup nos chips (+1% / +5% / +10%) é ambígua sem contexto de "vendendo ou comprando" (estrutural — chip semanticamente carregado mas mudo) ^friccao-2
+5% significa o quê exatamente? Se usuário está vendendo WISE por ETH (Vender 0 WISE → Comprar 0 ETH), +5% provavelmente é "preço 5% acima do mercado, ordem executa se WISE valorizar 5%". Mas se trocar a direção (Vender ETH → Comprar WISE), +5% ainda é "5% acima" do mesmo lado? Inverte automaticamente pra -5%? Iniciante mobile precisa de 2–3 testes pra calibrar mental. Pior: o chart de preço (Tela 4 mobile, agora soterrado pelo sheet) não está visível pra calibrar contra "qual é o preço atual + 5%".+1% por +0,0000550… ETH é incompreensível em mobile (8 dígitos); explicar com tooltip-on-tap em cada chip polui.+5% (preço 0,0000578 ETH) em duas linhas (label + valor). Quando usuário toca, valor preenche no input. Trade-off: chip vira mais alto (de 24 → ~40 px); ganho: zero ambiguidade de direção/cálculo.+ é favorável ao lado vendedor; iniciante não tem heurística.🔴 Fricção 3 — Aviso âmbar de "ordem pode não executar" sem expor quando isso acontece (estrutural — pedagogia parcial) ^friccao-3
Pool com pouca liquidez · Expiração antes do alvo) com link "Saber mais" no fim. As 2 causas mais comuns rotuladas explicitamente; "Saber mais" cobre o resto. Trade-off: aviso fica ~24 px mais alto; ganho: usuário decoda qual cenário ele está correndo nesta pool específica (pool morto = pouca liquidez = causa A muito provável).🟡 Oportunidade competitiva — Persistência de identidade da entidade em qualquer sheet/modal/full-screen acessório ^oportunidade-1
Observação adicional — link "Saber mais" em rosa. O texto "Saber mais" usa a cor primária do produto (rosa), sinalizando link. Padrão correto, mas em texto âmbar com tom de aviso, a cor rosa pode soar promocional ("clique aqui pra explorar"). Conflito sutil entre cor de marca e tom de aviso. Não é fricção a corrigir agora — registrar pra Kotai: links pedagógicos dentro de avisos talvez devam usar underline + cor neutra em vez da cor primária, pra não competir com o tom do aviso.
Função: quarto estágio do scroll. Card de Estatísticas residual no topo (saindo do viewport) e a section Links entra em foco com 3 entradas — pool WISE/ETH + token WISE + token WETH — cada uma com avatar, label (truncado), símbolo, endereço encurtado, ícone de copy e ícone de abrir externo. É o equivalente mobile da section Links da Tela 3 desktop.
Componentes
WISE / ETH v2 0.3% + 0x21b8…596E + copy + •••).Saldos do pool + TVL 133,6 M US$ ▼3,07% + Volume 24h 1,3 mil US$ ▼89,48% + Tarifas 24h 3,95 US$.P… + WISE / … (par truncado) + pílula 0x21b8…596E + copy + ícone abrir.Wise… (nome truncado de "Wise Token" ou similar) + WISE + pílula 0x66a0…5bd6 + copy + abrir.Wrapp… (truncado de "Wrapped Ether") + WETH + pílula 0xC02a…6Cc2 + copy + abrir.Fazer swap + + Adicionar liqu….Regras de negócio
P…, Wise…, Wrapp… — 3 a 5 caracteres apenas.🟢 Insight 1 — Separação pool/tokens mantida em mobile. A pedagogia que o Insight 4 da Tela 3 desktop reconhece (distinguir entrada do pool de entrada dos tokens individuais) sobrevive ao breakpoint mobile. 3 linhas, 3 affordances claras de "vá pro contrato do pool" / "vá pro contrato de cada token". Padrão a herdar pra Kotai. ^insight-1
🟢 Insight 2 — Avatares preservam contexto visual da entidade mesmo com label truncado. Mesmo que Wrapp… não diga nada, o ícone azul do WETH (E ou Ξ estilizado) entrega "isso é Ether wrapped" pro usuário que já viu o token antes. Decisão correta de redundância visual — quando texto não cabe, ícone carrega. Padrão a herdar: sempre que houver lista de entidades em mobile, manter avatar mesmo descartando label. ^insight-2
🟢 Insight 3 — Endereço encurtado em pílula com copy + abrir é affordance familiar. Padrão universal em DeFi mobile (Etherscan, Zerion, DeBank fazem igual). Convenção válida. ^insight-3
🔴 Fricção 1 — Labels truncados (P…, Wise…, Wrapp…) destroem a única chance de rotular o papel de cada contrato (estrutural — destrói a 🟡 Oportunidade 2 da Tela 3 desktop antes mesmo dela existir) ^friccao-1
WISE / ETH, WISE, WETH) sem rotular pool-vs-token. Mobile piora: o produto colocou o que parece ser o nome do contrato (Pool…, Wise…, Wrapp…) e truncou catastroficamente. Iniciante mobile lê P…, Wise…, Wrapp… e tem menos decodificação que no desktop — P… pode ser Pool, Pair, Protocol, qualquer coisa. Pior: o produto mostra que ele sabe qual o nome do contrato (renderiza Wrapp…) mas não dá espaço pra exibir. Decisão de truncar caracteres em vez de quebrar linha ou diminuir font-size.POOL / TOKEN em cinza extra-small (8–9 px, uppercase), uma linha acima do símbolo. Descarta o nome longo (Pool/Wise…/Wrapped Ether) e substitui pela categoria funcional. O nome volta a aparecer só quando o usuário toca em "abrir" e chega na page do token (page de Wrapped Ether deixa o nome completo onde tem espaço). Trade-off: perde info "este é Wrapped Ether vs Lido ETH"; ganho: zero ambiguidade de "pool vs token".Wrapp… como Wrapped Ether porque já viu antes; iniciante não.🔴 Fricção 2 — Endereço pílula recebe os dois ícones de ação (copy + abrir) na mesma altura, sem hierarquizar qual é mais útil (cosmética-estrutural — affordance duplicada igualmente acessível) ^friccao-2
🔴 Fricção 3 — Section Links sem distinção visual entre contrato do pool (1) e contratos dos tokens (2) — separação só por ordem (estrutural — convenção implícita por posição, não explícita) ^friccao-3
WISE / … com slash; as outras têm símbolo único). Em mobile, com WISE / … truncado, a única pista de "esta é a pool" é a presença de dois avatares overlapped na 1ª linha. Quem decoda isso? Intermediário talvez. Iniciante clica em qualquer dos três esperando ir pro mesmo lugar.Contrato do pool e Contratos dos tokens cria duas mini-sections com altura adicional; usar background diferente nos dois grupos polui visualmente.POOL / TOKEN resolve duas fricções com uma intervenção. Vale registrar como fricção dependente da Fricção 1 (resolvida junto).🟡 Oportunidade competitiva — Eyebrow tipográfico POOL / TOKEN na section Links, aplicado em ambos os breakpoints ^oportunidade-1
POOL em 1 linha; TOKEN em 2 linhas) acima de cada entrada. Em mobile a intervenção paga duas vezes — resolve Fricção 1 (label truncado inútil) + Fricção 3 (separação implícita).Observação adicional — sem section "Pool incentives" ou "Reward tokens" em pool morto. A view exibe apenas Estatísticas e Links. Pool ativo em concorrentes (Aerodrome, Velodrome, Curve) costuma ter section adicional pra reward tokens / incentives ativos. Este pool WISE/ETH v2 não tem — o produto omite a section em vez de mostrar "Sem incentivos ativos" ou similar. Decisão correta (mostrar vazio polui), mas vale registrar: pra Kotai, quando portar para pools com incentivos, esta tela vai ganhar uma 5ª region entre Estatísticas e Links. Decisão a tomar: nova section ou expandir Estatísticas?
Função: equivalente mobile da Tela 1 desktop (modal flutuante de swap), aqui implementado como bottom sheet que sobe pela base do viewport e cobre 70% da tela. Header de identidade do pool segue visível no topo (sticky); Estatísticas ficam parcialmente atrás de overlay; o widget de swap toma o foco da tela com tabs, dois campos (Vender/Comprar), quick-amount chips, botão primário e aviso CEX.
Componentes
WISE / ETH v2 0.3% + 0x21b8…596E + setinha inverter par + •••) — visível mas escurecido por overlay.Estatísticas em background, escurecido (E…statísticas parcialmente visível).Fazer swap ✓ (selecionada, com background escuro destacado) / Ordem-limite / Comprar / Vẽd (Vender truncado em 3 letras).Vender em cinza, input 0 em fonte grande, avatar WISE + pílula WISE (token selector). Linha de quick-amount: chips 25% / 50% / 75% / Máx. à esquerda; saldo 0 WISE à direita.↓ em círculo) entre os dois campos.Comprar, input 0, avatar ETH + pílula ETH. Linha auxiliar: 0 US$ à esquerda (cotação USD do valor digitado).Insira um valor (disabled, fundo escuro).Regras de negócio
0 WISE reflete que o usuário está desconectado (mesma indicação implícita do desktop "Insira um valor" disabled).↓ entre Vender/Comprar) presente em ambos os breakpoints.🟢 Insight 1 — Bottom sheet é a forma certa de modal em mobile (ergonomia do polegar + grab handle). A escolha de bottom sheet em vez de modal flutuante (como desktop Tela 1) resolve estruturalmente a 🔴 Fricção 1 da Tela 1 desktop ("modal cobre o chart"). Em mobile, o chart já foi rolado pra cima (não está no viewport), então cobrir o chart não acontece. Bottom sheet preserva header sticky (contexto da pool) e ocupa zona do polegar. Padrão a herdar pra Kotai: modais em mobile devem ser bottom sheets, não dialogs centrados. ^insight-1
🟢 Insight 2 — Quick-amount chips (25% / 50% / 75% / Máx.) em mobile são ganho real sobre desktop. Desktop Tela 1 não tem essa fileira de chips — usuário digita valor à mão. Em mobile, com teclado virtual cobrindo metade da tela, digitar é caro; tap em chip é gesto natural. Mobile inova sobre desktop aqui, não regride. Padrão a herdar pra Kotai: shortcut chips de percentual para qualquer campo de "valor a operar" — em ambos os breakpoints (desktop merece ganhar isso de volta). ^insight-2
🟢 Insight 3 — Aviso regulatório CEX preservado e ancorado no widget mesmo em bottom sheet mobile. O texto âmbar "WISE não é negociado nas principais bolsas centralizadas dos EUA" persiste dentro do sheet, abaixo do CTA primário. Mesma decisão correta da Tela 1 desktop (Insight 2): aviso de risco visível durante todo o preenchimento, não popup ao final. Trust signal preservado entre breakpoints. ^insight-3
🔴 Fricção 1 — Tab Vender truncada para Vẽd (3 caracteres) — corte mais agressivo da view inteira do flow (estrutural — tab de navegação ilegível) ^friccao-1
Fazer swap / Ordem-limite / Comprar / Vender) tentam caber numa largura de ~360px. A primeira (Fazer swap) ocupa espaço dobrado por estar selecionada; o resto se espreme. Vender vira Vẽd — não é abreviação, é corte ortográfico cego (cortou no meio da letra e com til/acento). Iniciante mobile vê 4 tabs com a última ilegível. Pior: essas tabs são também as 4 ações primárias do widget de operação — perder legibilidade de qualquer uma quebra o seletor.Vender pra Send mistura idioma; trocar pra ícone-only destrói affordance (especialmente em produto onde Comprar/Vender são verbos semanticamente carregados); diminuir font-size canibaliza acessibilidade.Trocar | Avançado ▾. "Trocar" cobre Fazer swap; o dropdown Avançado lista Ordem-limite, Comprar (on-ramp), Vender (off-ramp). Hierarquia editorial: trocar é a ação default da pool detail; on/off-ramp são auxiliares contextuais. Trade-off: perde acesso 1-clique para Comprar/Vender; ganho: nenhuma tab truncada + hierarquia mais honesta.Vẽd é Vender) + intermediário rolando rápido.+ Adicionar liqu…) + Fricção 1 da Tela 3 desktop (Vender WIS…). Mesma raiz transversal: copy em PT-BR mais longo que EN não foi reauditado por breakpoint. Hierarquia: estrutural em mobile, padrão a corrigir.🔴 Fricção 2 — Bottom sheet abre sem o saldo do usuário visível, mas o quick-amount Máx. está habilitado (estrutural — affordance disponível sem contexto pra exercê-la) ^friccao-2
0 WISE de saldo (visível à direita dos quick-amounts). Mesmo assim, os chips 25%, 50%, 75%, Máx. estão renderizados com aparência de habilitados (mesma cor/borda dos demais). Iniciante toca em Máx. → preenche 0 → continua com botão Insira um valor. Loop curto, sem feedback do porquê nada aconteceu. Pior: o usuário não decoda que precisa conectar carteira pra os chips funcionarem — eles parecem prontos pra uso. Inversão: produto deveria sinalizar "conecte carteira" antes de oferecer 25/50/75/Máx.0. Affordance preservada (chips sempre visíveis), mas estado é honesto. Trade-off: dois estilos do mesmo componente.🔴 Fricção 3 — Bottom sheet cobre Estatísticas (saúde do pool) no momento exato em que o usuário decide operar (estrutural — replica a 🔴 Fricção 3 da Tela 1 desktop em outra dimensão) ^friccao-3
APR 0% • TVL 133M • Vol ↓89% em chips compactos, acima das tabs. Quando o usuário sobe o bottom sheet pra operar, leva os 3 sinais junto. Trade-off: adiciona ~36 px no sheet; ganho: paridade informacional ao ato de decisão preservada.🔴 Fricção 4 — Cotação USD do valor digitado (0 US$) só aparece no campo Comprar, não no campo Vender (cosmética — assimetria de pedagogia entre os dois campos) ^friccao-4
Comprar exibe 0 US$ (sob o input zerado, em cinza pequeno) — sinaliza "este é o valor equivalente em dólar". O campo Vender não tem essa linha — saldo 0 WISE aparece, mas cotação USD do valor Vender não. Resultado: usuário digita 1000 WISE, vê em Comprar a equivalência em ETH + USD, mas não vê quanto vale o 1000 WISE que ele está vendendo. Assimetria de pedagogia: produto trata Vender como "input cru" e Comprar como "output decodado".X US$ ao Vender duplica a info (mesmo valor de Comprar até taxa); poluição de números.🟡 Oportunidade competitiva 1 — Quick-amount chips (25/50/75/Máx.) trazidos pro desktop ^oportunidade-1
MAX, único shortcut). Mobile já tem 25/50/75/Máx. O produto inverteu a hierarquia esperada: deu ao mobile (onde digitar é caro) os chips, mas não deu ao desktop (onde digitar é fácil mas comparação por percentual ainda é útil).25 / 50 / 75 / 100% em ambos os breakpoints, com tooltip on-hover (desktop) mostrando o valor absoluto antes do tap (25% = 12,3 ETH). Mobile mantém o comportamento atual + tooltip on long-press.🟡 Oportunidade competitiva 2 — Strip de saúde do pool persistente dentro de sheets de ação ^oportunidade-2
Observação adicional — bottom sheet sem indicação visível de "deslize pra fechar" além do grab handle. O grab handle é a única affordance de dismiss (não há X no canto superior). Padrão iOS/Android nativo (Apple Maps, Google Maps usam igual), portanto convenção válida. Mas iniciante mobile pode não decodar — toca no grab handle em vez de deslizar. Decisão a tomar pra Kotai: aceitar a convenção (default) ou adicionar X redundante (mais explícito mas menos elegante). Por enquanto, convenção válida — descartar como fricção, mas registrar pra teste futuro com iniciantes.
Função: terceiro estágio do scroll vertical da pool detail mobile. Header de identidade do pool segue sticky no topo; abaixo, o produto finalmente revela o que o desktop entrega na sidebar lateral: card APR total (em isolado, fonte grande) seguido de section Estatísticas (Saldos do pool, TVL, Volume 24h, Tarifas 24h) em grid 2×2. Footer da view começa a expor o título Links, indicando que a próxima section é a de contratos.
Componentes
APR total em cinza pequeno + valor 0,00% em fonte gigante, encapsulado em pílula com borda arredondada (visualmente "card destacado").519,7 M WISE + avatar ETH 28,6 mil ETH em duas linhas. Não há barra de proporção (a versão desktop usa barra colorida; aqui são só dois pares ícone+valor empilhados).133,6 M US$ + delta ▼ 3,07% em vermelho. Nota: o desktop (Tela 2) mostrou ↑1,27%; aqui está ↓3,07%. Captura em janela diferente → KPI mudou de positivo pra negativo. Mesma família da Fricção 3 da Tela 4 mobile (drift temporal entre breakpoints sem âncora).1,3 mil US$ + delta ▼ 89,48% em vermelho. Desktop mostrou ↓81,84% — degradação acelerada na janela de captura.3,95 US$ (desktop mostrou 12,62 US$ na Tela 3 — caiu 68% no intervalo entre capturas).Links começa a aparecer no rodapé (parcialmente coberta pela sticky bar).Fazer swap + + Adicionar liqu… (mesma fricção 4 das Telas 4/5).Regras de negócio
🟢 Insight 1 — APR isolado em card separado mantém hierarquia herdada do desktop. A decisão de não fundir APR no grid 2×2 de Estatísticas preserva a sinalização "este é o número que o LP olha". Em mobile, a tentação seria juntar tudo num grid 3×2 ou 4×2; o produto resiste e gasta uma "linha inteira" do scroll só pro APR. Padrão a herdar pra Kotai: KPIs que disparam decisão (APR pra LP, preço pra trader, fee pra swap) merecem card próprio, não célula de grid. Em mobile a regra pesa mais: scroll é caro, mas hierarquia visual é mais cara. ^insight-1
🟢 Insight 2 — Grid 2×2 com 4 KPIs em estrutura paralela facilita varredura. Saldos / TVL / Volume / Tarifas ocupam 4 quadrantes simétricos, com label cinza pequeno + número grande + delta colorido. Layout previsível pra qualquer pool. Padrão a herdar: KPIs comparáveis vivem em grid paralelo, não em lista enumerada. ^insight-2
🟢 Insight 3 — Deltas in-place (▼ 3,07% colado ao número) preservados do desktop em mobile. Mesma decisão da Tela 2 (#3 Insight) replica em mobile sem corte — variação é atributo do número, não card separado. Paridade desktop↔mobile em pelo menos esta decisão (contraste com a Fricção 1 da Tela 4 onde paridade é quebrada catastroficamente). ^insight-3
🔴 Fricção 1 — APR 0,00% em fonte gigante isolado em card próprio, sem qualquer pedagogia contextual (estrutural — replica e amplifica a Fricção 2 da Tela 2 desktop) ^friccao-1
0,00% antes de qualquer outra métrica. Sem caption, sem tooltip-on-tap, sem narrativa explicativa. O usuário sai dali com a conclusão "este pool não rende" sem entender que o 0% é função direta de Volume baixo + TVL alto.0,00% "grita".0,00% — "Pool com volume baixo nas últimas 24h. Fees insuficientes pra gerar renda anual perceptível." — gerada por regra de bucket (4–5 templates pré-escritos disparados por situação real: APR=0 + Vol baixo, APR alto + Vol concentrado, APR alto + Vol distribuído, etc.). Em mobile o ganho é maior porque a tela é menor e cada linha precisa carregar mais informação por pixel. Trade-off: exige classificação correta de bucket (errar é pior que silêncio) + i18n.🔴 Fricção 2 — Saldos do pool perdeu a barra de proporção; virou só dois números empilhados (estrutural — perda de pedagogia visual entre breakpoints) ^friccao-2
28,6 mil ETH | 519,6 M WISE) era exatamente o sinal pedagógico que entregava em segundos "este pool está desbalanceado/balanceado". Mobile descarta a barra e mostra dois pares avatar+valor empilhados verticalmente. Iniciante mobile vê 519,7 M WISE + 28,6 mil ETH e não decoda proporção de capital — precisa converter mentalmente (519,7 M × preço WISE) vs (28,6 mil × preço ETH), o que iniciante não faz. Decisão de breakpoint sacrificou o melhor sinal pedagógico do card.52% WISE • 48% ETH). Ocupa ~16 px adicionais de altura. Trade-off: mais altura no card; ganho: pedagogia visual de "qual lado pesa mais" preservada em ambos os breakpoints.🔴 Fricção 3 — Volume 24h 1,3 mil US$ no Card Estatísticas mobile diverge do big stat 1,3 mil US$ "Há um dia" do topo (Tela 4 mobile) e do 4,2 mil US$ do desktop (estrutural — três valores diferentes pro "mesmo" KPI sem reconciliação) ^friccao-3
1,3 mil US$ Há um dia. Esta tela mostra Card Estatísticas Volume 24h: 1,3 mil US$ ▼ 89,48%. Desktop Tela 2 mostrou Volume 24h: 4,2 mil US$ ↓81,84%. Três números, mesmo conceito ("volume das últimas 24h"). Em mobile os dois batem (1,3 mil = 1,3 mil), bom — mas o usuário não vê por que batem (mesma janela amostrada simultaneamente). Em comparação com desktop, ele vê drift. Pior: o delta passou de ↓81,84% (desktop) pra ▼ 89,48% (mobile, captura ~minutos depois) — degradação real do pool aconteceu na janela de captura, e mobile carrega a foto mais pessimista. Iniciante não decoda essa narrativa; lê dois números diferentes e duvida do produto.Última atualização: 11:28 (há 14s). Todos os KPIs da página derivam da mesma snapshot daquele timestamp. Eliminação da divergência entre big stat e card Estatísticas vira garantia arquitetural, não coincidência. Mobile e desktop diferem porque foram capturados em momentos diferentes — mas dentro de uma única tela, garantia de consistência. Trade-off: exige snapshot coerente no backend.🟡 Oportunidade competitiva — Card de KPIs com expansão narrativa on-tap (KPI → micro-history em bottom sheet) ^oportunidade-1
TVL 133,6 M ▼3,07% não tem caminho pra decodar o que mudou (quantos LPs saíram? que evento disparou? é normal pra esta pool?).TVL ▼3,07% abre bottom sheet com mini-chart de TVL 7d + caption automática "Saíram 4,2 M US$ nas últimas 6h, distribuídos entre 3 LPs".Observação adicional — preview do Links no rodapé sem ainda mostrar o conteúdo. A tela termina exibindo só o título Links no rodapé, mas as entradas (P… WISE/..., Wise…, Wrapp…) só aparecem na Tela 7 mobile. Este "preview" do título é deliberado — o produto sinaliza "tem mais coisa pra rolar" sem revelar o conteúdo. Decisão de scroll-hint elegante (melhor que "scroll indicator" genérico). Não é fricção; é padrão de scaffolding mobile bem-feito. Vale registrar como técnica a herdar: título da próxima section visível no fim da view atual como fold tease.
Função: view mobile equivalente da Tela 3 desktop após o usuário rolar pra baixo a partir da Mobile1. Header de identidade do pool (WISE / ETH v2 0.3% + endereço) fica sticky no topo; abaixo aparece o título de section Transações e uma tabela colapsada em 3 colunas: Horário / Tipo / USD. CTAs continuam ancorados em barra inferior fixa, agora flutuando sobre o conteúdo da tabela.
Componentes
app.uniswap.org).WISE / ETH + chips v2 0.3% + setinha inverter par + 0x21b8…596E com copy + overflow •••. Breadcrumb (Pools › WISE / ETH da Mobile1) desaparece após scroll — só a identidade segue ancorada.Transações (h2 grande, sem deltas/contagem).Horário / Tipo ⇅ (toggle de sort) / USD.4h | Vender WIS… | 40,50 US$ · 5h | Vender WIS… | 384,97 US$ · 5h | Vender WIS… | 421,22 US$ · 10h | Comprar W… | 0,0812 US$ · 12h | Comprar W… | 0,150 US$ · 14h | Vender WIS… | 420,51 US$ · 15h | Vender WIS… | 28,80 US$ · 16h | Vender WIS… | 11,34 US$ · 17h | Comprar W… | 0,0500 US$.Fazer swap (rosa) + + Adicionar liqu… (truncado) — sobrepostos à última linha visível da tabela (17h | Comprar W… | 0,0500 US$).WISE, ETH e Carteira da versão desktop (Tela 3) estão ausentes — não há indicação visual de que existem e foram cortadas (sem scroll horizontal hint, sem chevron).Regras de negócio
Vender WIS… / Comprar W…) — desktop e mobile ambos erram aqui, mas mobile tem menos espaço de defesa.🟢 Insight 1 — Card de identidade do pool em sticky-top durante scroll preserva âncora "estou neste pool". Ao rolar pra ver Transações, o usuário não perde o contexto de qual pool está auditando (par + versão + fee + endereço continuam visíveis). Decisão correta — sem essa âncora, scroll longo em mobile transforma a tabela em "lista de trades de um pool qualquer". Padrão a herdar pra Kotai: header de entidade em mobile vira sticky compacta, não rola junto com o conteúdo. ^insight-1
🟢 Insight 2 — Cores buy/sell preservadas na coluna Tipo mesmo com o texto truncado. O usuário que não decoda Vender WIS… ainda consegue ler direção do fluxo da pool só pela cor das linhas (3 vermelhas seguidas no topo, depois alternância). Sinal visual sobrevive à perda textual — pedagogia salvada por cor. Padrão a herdar: quando texto vai ser truncado em layout mobile, garantir que um sinal visual paralelo (cor, ícone, peso) carregue o significado central. ^insight-2
🟢 Insight 3 — Toggle de sort (⇅) preservado na coluna Tipo em mobile. Affordance de ordenação não foi sacrificada por economia de espaço — usuário ainda consegue reordenar buy/sell em mobile. Diferencia produto que entende "tabela mobile é ainda uma tabela" de produto que entende "tabela mobile é uma lista resumida". Padrão a herdar. ^insight-3
🔴 Fricção 1 — Colunas WISE, ETH e Carteira descartadas (não escondidas) na versão mobile, sem qualquer affordance pra acessá-las (estrutural — perda de informação primária sem caminho de recuperação) ^friccao-1
Carteira (contraparte do trade, sinal mais forte pra distinguir bot/humano/agregador, vide Fricção 2 da Tela 3 desktop) nem WISE/ETH (quantidades por token que permitem inferir preço de execução de cada trade). A view mobile é versão mutilada do mesmo dado, sem aviso.Vender WIS…); scroll horizontal sem affordance descobrível é discoverability ruim e quebra paradigma de scroll vertical estabelecido na tela.› discreto na borda direita de cada linha. Trade-off: requer dois toques pra info que desktop entrega em um olhar; ganho: paridade informacional preservada sem espremer tabela.🔴 Fricção 2 — Sticky bar de CTAs sobrepõe a última linha visível da tabela (e qualquer linha que role pra baixo) (estrutural-cosmética — área de scroll efetiva reduzida sem aviso) ^friccao-2
Fazer swap + + Adicionar liqu… estão sobre a linha 17h | Comprar W… | 0,0500 US$ — a linha fica visível só parcialmente atrás do botão. Pior: como a sticky bar é translúcida/sólida (não confirmável da captura, mas pelo visual parece sólida), a linha está oculta atrás dos CTAs. O usuário precisa rolar além do esperado pra "passar" pela sticky bar e ver a linha completa. Em rolagem rápida, ele literalmente não vê a última linha do dia.🔴 Fricção 3 — Coluna Tipo truncada para Vender WIS… / Comprar W… no mobile (mesma fricção da Tela 3 desktop, peso elevado) (estrutural — mobile reduz espaço útil sem repensar copy) ^friccao-3
Vender [símbolo] e Comprar [símbolo] quando o pool tem só 2 tokens e o símbolo é redundante. Em mobile, o problema vira caso garantido: largura de coluna é menor por construção, o token vira WIS… (3 caracteres + reticências), e o usuário nem decoda qual é o token (é WISE? Outro WIS…?). A solução já proposta no desktop (Fricção 1 Tela 3) — ícone+cor sem texto — entrega em mobile ganho maior, porque libera 60–80px que podem entrar na coluna USD (que neste mobile aparece com casas decimais extensas: 0,0500, 0,0812) ou abrir espaço para chevron de expand (vide Fricção 1 deste relatório).Tipo vira ícone+cor (↓ vermelho = sell / ↑ verde = buy). Texto removido. Largura recuperada vai pra USD (que pede mais dígitos significativos em mobile pra distinguir 0,0500 de 0,0812) ou pra chevron ›.🔴 Fricção 4 — Título Transações sem contagem total, sem filtro temporal, sem indicação de range coberto (estrutural — section sem âncora de cobertura) ^friccao-4
Transações e abaixo 9 linhas indo de 4h (4 horas atrás) a 17h (17 horas atrás). Não sabe: (a) quantas transações totais a pool teve nas últimas 24h, (b) se essas 9 são todas ou se há mais via scroll, (c) se pode filtrar por buy/sell ou por janela temporal (Hoje, 7 dias, 30 dias). Em mobile, ausência de filtros temporais é mais grave que em desktop — power user vai pro Dune; iniciante mobile não tem como dimensionar "a pool está ativa ou parada?" mesmo olhando a tabela.Hoje | 7d | 30d em barra horizontal acima da tabela ocupa altura; copiar o card "n transações nas últimas 24h" como header polui a hierarquia tipográfica.Transações — 9 nas últimas 24h • 6 vender, 3 comprar — uma linha cinza, font menor, sem CTA. Filtros temporais ficam sob demanda (tap no subtitle abre seletor 24h / 7d / 30d). Trade-off: exige cálculo no client; ganho: usuário decoda imediatamente "9 trades em 1 dia = pool fraco".🟡 Oportunidade competitiva 1 — Tabela mobile expansível por linha (collapsed essencial / expanded completo) ^oportunidade-1
› no canto direito de cada linha; tap abre bottom sheet de 60% da tela com card detalhado (Horário, Tipo, USD, quantidade WISE, quantidade ETH, Carteira com badge via roteador / EOA, link Etherscan). Reutiliza o ponteiro de "rotulagem semântica" (🟡 Tela 3 desktop) — em mobile a rotulagem paga ainda mais, porque o dado é mais escasso na superfície.🟡 Oportunidade competitiva 2 — Subtitle narrativo automático em section de Transações ("9 trades em 24h, atividade concentrada em 1 trader") ^oportunidade-2
Transações, linha cinza gerada por regras: 9 trades em 24h • 6 vender, 3 comprar • 67% do volume em 1 trade às 5h. Computado client-side com os dados já carregados. Cresce e encolhe conforme densidade (em pool ativo: 1.247 trades em 24h • 52% buy • 4 carteiras concentram 60%).Observação adicional — sticky bar inferior e "thumb zone" mobile. A sticky bar com Fazer swap + + Adicionar liqu… fica exatamente no terço inferior do viewport — zona ergonômica do polegar em uso a uma mão. Decisão correta de ergonomia. Mas convida a tap acidental: usuário rolando rápido com polegar direito pode roçar no botão "Fazer swap" e disparar o widget. Decisão pendente pra Kotai: sticky bar com CTAs de ação real (transação) deveria exigir tap deliberado (talvez com leve elevação visual ao toque, ou separação de 16px da borda inferior) — não confiar só em "o usuário não vai roçar". Não é fricção desta tela isoladamente (não há captura de tap acidental), mas é decisão arquitetural a tomar antes de espelhar o padrão pro Kotai.


Função: view canônica da pool detail após scroll, agora exibindo histórico de transações da pool e a section de Links com contratos (pool + tokens individuais). Header e chart permanecem âncoras no topo; a parte abaixo do chart é o "fundamento on-chain" do pool.
Componentes (adicionais ao já mapeado em Tela 2)
Horário (relativa: 5h, 6h, 7h, 8h, 11h, 12h, 13h, 18h, 1d) / Tipo (toggle de sort) / USD / WISE / ETH / Carteira.USD em US$ (de 0,02 a 3.592,01), WISE em quantidade do token (até 27.679,34), ETH em quantidade pequena (≤1,51941), Carteira em endereço encurtado (0xC63F…5B98).WISE / ETH → 0x21b8…596E + ícones copy/abrir externo (contrato do pool / par).WISE → 0x66a0…5bd6 + copy/abrir (contrato do token WISE).WETH → 0xC02a…6Cc2 + copy/abrir (contrato do token WETH).Regras de negócio
🟢 Insight 1 — Transações inline na pool detail eliminam a viagem ao explorer externo. O user pode auditar fluxo recente sem abrir Etherscan em outra aba. Trust signal por exposição direta — o produto não esconde o livro de eventos. Padrão a herdar pra Kotai: dados on-chain canônicos pertencem dentro da entidade, não em link externo. ^insight-1
🟢 Insight 2 — Cores buy/sell + endereços encurtados clicáveis = leitura de fluxo em segundos. A coluna Tipo com cor (verde compra / vermelho venda) entrega ao olho a direção dominante em poucos segundos. Carteiras como cluster de copy + abrir reforçam que o user pode investigar contraparte sem fricção. ^insight-2
🟢 Insight 3 — Tarifas 24h exposta como número absoluto (12,62 US$) ao invés de só % implícita. Ver "12,62 US$ de fee em 24h" sobre TVL de 135,3 M US$ é a confirmação visceral do APR 0,00% do card de cima — o user fecha a história: pouco volume → pouca fee → renda anual zero. Padrão a herdar: KPIs em valor absoluto ao lado de KPIs em razão criam "loop de leitura" que valida o número grande. ^insight-3
🟢 Insight 4 — Section Links separa explicitamente contrato do pool e contratos dos tokens. Decisão pedagógica importante — sinaliza que pool e tokens são entidades distintas (pool = contrato de LP que segura ativos; token = contrato de ERC-20 individual). Iniciante que clica em "WISE" e cai na page de token, depois clica em "WISE/ETH" e cai no pool, aprende a distinção on-chain por exposição. Padrão a herdar pra Kotai — não fundir links de contratos heterogêneos. ^insight-4
🔴 Fricção 1 — Coluna "Tipo" trunca tokens ("Vender WIS…" / "Comprar W…") e duplica símbolo do par a cada linha (cosmética-estrutural — quebra de legibilidade comparativa) ^friccao-1
🔴 Fricção 2 — Endereços de Carteira não distinguem humano de bot/MEV/contrato (estrutural — leitura de fluxo enganosa) ^friccao-2
0xe16A…2D3e em sequência (6h, 6h, 7h — provavelmente bot ou roteador de agregador). Sem essa info, iniciante interpreta "3 swaps recentes" como atividade distinta de 3 traders, quando é 1 ator. Modelo mental de "fluxo da pool" fica distorcido — o pool parece mais ativo do que está.0xe16A…2D3e → "via roteador Uniswap"). Sem inferência de bot vs humano (que é editorial); só rotulagem de contratos conhecidos (que é fato). Trade-off: exige manter base de contratos conhecidos atualizada; ganho: user decoda "isso aqui veio de outro DEX/agregador".🔴 Fricção 3 — Section "Links" sem rotular o papel de cada contrato (estrutural-leve — pedagogia perdida apesar de bem estruturada) ^friccao-3
WISE / ETH, WISE, WETH (símbolos), não Contrato do pool, Contrato do token WISE, Contrato do token WETH. Iniciante que vê três entradas semelhantes com endereços diferentes não decoda por que são três. Clica em "WISE" pensando que vai pro pool e cai numa page do token. A separação existe mas é mensagem implícita.POOL em cinza acima de WISE / ETH; TOKEN em cinza acima de WISE e WETH. Eyebrow tipográfico, não verboso, mas explícito. Trade-off: adiciona altura à section; ganho: zero ambiguidade.🟡 Oportunidade competitiva 1 — Rotulagem semântica de contratos conhecidos no histórico de transações ^oportunidade-1
🟡 Oportunidade competitiva 2 — Header "POOL" / "TOKEN" como eyebrow em listas de contratos ^oportunidade-2
POOL / TOKEN) acima de cada entrada da section Links. Pedagogia gratuita no nível de copy.Observação adicional — paginação da tabela. A tabela de transações exibe ~10 linhas sem paginador visível; cobertura de ~1 dia de atividade (mais antigo = "1d"). Em pool ativo (não este caso), com centenas de transações/hora, scroll infinito da tabela vira fricção real de browser performance + perda de posição. Pra Kotai, decisão a tomar: paginação clássica ("Página 1 de 47"), top-N + "ver mais", ou filtros temporais (Hoje / 7d / 30d) como entrada antes do scroll. Não é fricção desta tela (este pool é morto, 10 linhas cobrem 1 dia inteiro), mas é decisão arquitetural pendente quando o padrão for portado pra pools ativos.


Função: view canônica da pool detail sem overlays — chart no centro, sidebar de estatísticas à direita, tabela de transações ancorada abaixo (visível ao rolar, vide Tela 3).
Componentes
0x21b8…596E + setinha de inverter par + ícones (chart, share, "…"). Nota: ordem do par aparece ETH/WISE aqui contra WISE/ETH na Tela 1 (mesmo contrato).500 a 5000 US$ e eixo X 22:00 – 11:00; um único bar dominante às 06h (~3500 US$) e um menor às 11h (~500 US$).1H / 1D ✓ / 1W / 1M / 1Y / ALL.Preço / Volume ✓ / Liquidez.Regras de negócio
🟢 Insight 1 — Default em Volume (não Preço) reconhece que a view é "do pool", não "do token". A escolha de Volume como tipo default é decisão arquitetural correta — o user que está na pool detail está pensando em saúde do pool (atividade, fees, profundidade), não em trajetória de preço do token (que pertence à page do token). Concorrentes (PancakeSwap, 1inch) frequentemente caem no default Preço por simetria com page de token, criando ambiguidade. Padrão a herdar pra Kotai: o default de visualização de uma entidade reflete a intenção do user que chegou ali, não a métrica mais flashy. ^insight-1
🟢 Insight 2 — Saldos do pool como barra de proporção, não como dois números soltos. A barra (28,6 mil ETH | 519,6 M WISE) entrega visualmente o desbalanceamento entre as duas reservas — qualquer LP novo vê de um olho que o pool está dominado por um lado em valor. Ler dois números separados (28,6 mil ETH × preço + 519,6 M WISE × preço) exige conversão mental. Padrão a herdar: quando duas grandezas concorrem por share de uma entidade, exibir como proporção visual antes de números brutos. ^insight-2
🟢 Insight 3 — Deltas % com cor e seta in-place, sem badge separado. ↑1,27% em verde colado ao TVL; ↓81,84% em vermelho colado ao Volume 24h. Sem KPI card separado, sem "Δ:" como label. Padrão a herdar pra Kotai: variação relativa é atributo do número, não entidade separada. ^insight-3
🔴 Fricção 1 — Ordem do par inverte entre Tela 1 ("WISE/ETH") e Tela 2 ("ETH/WISE") com o mesmo contrato 0x21b8…596E (estrutural — quebra de modelo mental "estou na mesma pool?") ^friccao-1
Pools › ETH/WISE em foco + (WISE/ETH) em cinza ao lado. Ou: âncora explícita "Mostrando como [ETH/WISE]" + setinha pra inverter. Trade-off: polui header com duplicação; ganho: user nunca duvida se navegou pra outro pool.🔴 Fricção 2 — APR total 0,00% em fonte gigante sem qualquer pedagogia (estrutural — número grande e mudo) ^friccao-2
🔴 Fricção 3 — Chart de Volume sem âncora temporal e com pico isolado não-contextualizado (cosmética-estrutural — leitura ambígua) ^friccao-3
22:00 – 11:00 sem indicação de qual dia, e o gráfico apresenta um pico isolado às 06h (~3500 US$) que domina o canvas. A tabela de transações da Tela 3 mostra "11h Vender WIS… 3592,01 US$" — ou seja, o pico todo é provavelmente uma única transação, não atividade distribuída. Iniciante interpreta o pico como "houve um momento de muita atividade" quando na verdade foi "houve um swap grande". A diferença é interpretativamente enorme: atividade distribuída sugere pool vivo; transação grande isolada sugere o oposto (alguém saindo do pool / dump).06h – 07h: 1 transação (3.592 US$) em vez de só 3.500 US$. Trade-off: exige join chart × transactions; ganho: user decoda atividade real do pool.🔴 Fricção 4 — CTA "+ Adicionar liqu…" truncado em desktop largo (cosmética; mas é CTA primário) ^friccao-4
🟡 Oportunidade competitiva — Pedagogia narrativa do chart: do "número" para a "história" ^oportunidade-1
N transações, % do volume em 1 transação, tipo dominante: buy/sell) — vira "headline do chart" antes do user precisar interpretar.Observação adicional — sidebar como home das estatísticas vs Tela 1 sidebar com "X Fechar". Aqui (Tela 2) a sidebar é permanente: APR + Estatísticas vivem ali sem dispensa. Na Tela 1 a mesma sidebar tem "X Fechar" no header. Isso reforça a interpretação de que na Tela 1 o "X Fechar" fecha o modal, não a sidebar — mas o posicionamento à esquerda de "Adicionar liquidez" criou a ambiguidade da Fricção 2 da Tela 1. Vale tratar como mesma decisão arquitetural a corrigir nas duas telas.
Função: página de detalhe da pool WISE/ETH v2 0.3% (0x21b8…596E) com widget de swap como modal flutuante posicionado sobre o chart de preço. Permite negociar no mesmo contrato exibido sem trocar de view.
Componentes
WISE / ETH + version v2 + fee 0.3% + setinha de inverter par + endereço encurtado + ícones (chart toggle, share, "…").1H / 1D ✓ / 1W / 1M / 1Y / ALL.Regras de negócio
🟢 Insight 1 — Tokens pré-selecionados a partir do contexto do pool. O modal abre com WISE→ETH já preenchido na direção do par. Em vez de tratar swap como destino independente (Negociar → escolher tokens → confirmar), trata como sub-ação contextual da pool. Padrão a herdar pra Kotai: quando o user já está em uma entidade (pool, token, leilão), a ação default herda os parâmetros visíveis — reduz cliques e elimina a chance de o user fazer swap no pool errado. ^insight-1
🟢 Insight 2 — Aviso de risco regulatório inline, não em modal de confirmação. "WISE não é negociado nas principais bolsas centralizadas dos EUA" aparece antes do user digitar valor, ancorado no widget de swap. Diferente do padrão "popup de confirmação no final" (que o user dismissa por inércia), o aviso fica visível durante todo o preenchimento. Trust signal sem fricção transacional. Família com a 🟡 "pré-visualização rica de transação DeFi" — aqui o copy é minimalista mas o posicionamento é correto. ^insight-2
🔴 Fricção 1 — O modal cobre exatamente o chart, eliminando o contexto visual no momento da decisão (estrutural — afeta o ato de decidir o swap em si) ^friccao-1
🔴 Fricção 2 — "X Fechar" no header da sidebar, não do modal (cosmética; quebra de affordance) ^friccao-2
🔴 Fricção 3 — APR total 0,00% e Volume 24h -81,84% visíveis ao lado do widget de swap sem aviso de pool inativa (estrutural — vetor de loss aversion silencioso) ^friccao-3
🟡 Oportunidade competitiva 1 — Pré-visualização rica do swap antes de "Insira um valor" ^oportunidade-1
🟡 Oportunidade competitiva 2 — Sinalização inline de pool inativa no momento da execução ^oportunidade-2
Observação adicional — divergência entre tabs do widget e ações da página. O widget tem 4 tabs (Fazer swap / Ordem-limite / Comprar / Vender), e a página tem 2 CTAs (Fazer swap / + Adicionar liquidez) que reaparecem na sidebar da Tela 2. Há overlap conceitual: "Comprar/Vender" no widget vs "Fazer swap" como tab do widget e CTA da página. Não é fricção desta tela (decisão arquitetural compartilhada com Negociar/Buy/Sell em outra parte do produto), mas vale registrar pra Kotai: quando há múltiplos verbos para a mesma ação (swap = comprar = vender, dependendo da direção), o produto carrega ambiguidade lexical que custa um clique de "qual é qual" pra todo iniciante. Decisão a tomar: uniformizar o vocabulário ou aceitar a redundância como cobertura de modelos mentais diferentes.




Função: Hub de descoberta de pools de liquidez /explore/pools — analytics globais + tabela ranqueada + filtros ortogonais (Rede, Protocolo, Search).
Componentes
Regras de negócio
🟢 Insight 1 — Vol/TVL como métrica final da tabela (posição = leitura final). Posicionar Vol/TVL como última coluna da tabela é decisão deliberada — é a coluna que o olho lê por último antes de decidir. Diferente de APR, que é forward-looking e manipulável por recompensas inflacionárias, Vol/TVL é backward-looking (observado) e impossível de manipular (volume real / TVL real). Padrão a herdar pra Kotai — quando duas métricas competem por hierarquia de decisão, priorizar a observada sobre a projetada. ^insight-1
🟢 Insight 2 — TVL segmentado por versão como sinal de migração do ecossistema. Os 3 KPIs separados (TVL v2 970M / v3 1,22B / v4 719M) comunicam saúde de adoção sem precisar de gráfico — usuário avançado lê tese ("v3 ainda lidera, v4 crescendo, v2 legado vivo") em uma linha de KPIs. Padrão útil pra Kotai se houver versões/forks importantes; gratuito se não houver. ^insight-2
🟢 Insight 3 — Mistura de versões no default em vez de fragmentação forçada. Iniciante não sabe distinguir v2/v3/v4 (e não deveria precisar), então default "Tudo" entrega lista única. Versionamento aparece como dimensão opcional de refinement, não pré-requisito. Padrão a herdar — complexidade de protocolo escondida atrás de filtro, não imposta como decisão inicial. ^insight-3
🔴 Fricção 1 — Sort default por TVL desc enterra atividade real sob TVL parado (estrutural — afeta posicionamento pedagógico do produto)
🔴 Fricção 2 — Múltiplos "ETH/USDC" sem dimensão de desambiguação visível (estrutural — afeta legibilidade comparativa)
🟡 Oportunidade competitiva 1 — "Renda anual do pool" como APR opaco vs leitura pedagógica
🟡 Oportunidade competitiva 2 — Sort default por TVL como dogma DeFi questionável para iniciante
Observação adicional (coluna PR da recompensa toda em "—"): em todas as 9 linhas visíveis, PR da recompensa = "—". Faz sentido — pools de mainnet Ethereum não têm incentivos externos via Uniswap. Mas a coluna sempre presente vira ruído visual nessa rede. Considerar coluna adaptativa por rede (some quando 100% das linhas filtradas têm "—", aparece quando Base/Unichain com incentivos). Não é fricção atual (não é problema visível desta tela isolada), mas é decisão de design pra Kotai quando portar o padrão multi-chain.




O fluxo Pools da Uniswap funciona principalmente como explorer de liquidez — discovery hub primeiro, ferramenta de ação segundo. O produto acerta em decisões de default que respeitam o modelo mental do usuário: protocolo e rede chegam como dimensões de refinement, não como pré-requisitos (1, 3); Vol/TVL como coluna final entrega métrica observada e resistente a manipulação (1). O atrito, porém, concentra onde mais dói para o target: sort default que enterra atividade real atrás de TVL parado (1), fragmentação de pares que converte catálogo coerente em 8+ instâncias homônimas sem critério de decisão (1, 4), e ausência total de sinalização pedagógica para métricas extremas que funcionam como armadilha invisível (4, 4). O perfil mais prejudicado é o LP iniciante: chega com a pergunta "onde posso prover liquidez?" e encontra 100 linhas sem critério de escolha inteligível. As fricções estruturais principais não são pontos isolados — formam sistema coerente de "transparência ativa ausente": educação inline de métricas, sort por atividade, fenestração de curadoria, e sinalização de outliers são peças do mesmo posicionamento de produto.
Decisão deliberada de posicionamento: Vol/TVL como coluna final é a última que o olho lê antes de decidir (1). Diferente de APR (forward-looking, manipulável via recompensas inflacionárias), Vol/TVL é backward-looking e impossível de falsificar — volume real dividido por TVL real. A mesma coluna age como "verdade silenciosa" em sort por TVL desc: pool #100 CULT/ETH com TVL 4,3M ainda mostra Vol/TVL 0,54 (4), revelando capital que efetivamente trabalha mesmo no final do ranking. Pattern duplo: posição como leitura final + hierarquia semântica "observado > projetado". Padrão a herdar para Kotai: quando duas métricas competem por posição de destaque, priorizar a observada sobre a projetada.
Duas dimensões técnicas, mesma lógica: protocolo default "Tudo" (1) agrega v2+v3+v4 porque iniciante pensa em par, não em versão de AMM; rede default "Todas as redes" (3) agrega cross-chain porque iniciante pensa em ativo, não em rede. Em ambos os casos, a complexidade técnica aparece como filtro de refinement opcional, não como decisão inicial obrigatória. Padrão a herdar para Kotai: onde a dimensão é arquitetural e não faz parte do modelo mental do usuário, default é agregado — complexidade como filtro, não como portão de entrada.
WISE/ETH v2 lidera o ranking com TVL 135,3M US$, mas Renda anual 0,00% e Vol/TVL <0,01 (1) — pool legado parado monopolizando a posição #1. A mesma hierarquia se mantém por 100 linhas (4): ETH/USDC v3 com Vol/TVL 0,80 fica na linha 2, atrás do pool inativo. Sort default por TVL não é só preferência de ordenação — é o critério que define hierarquia de autoridade visual. Posição #1 é interpretada pelo iniciante como "esse é o pool mais importante", quando na realidade é o pool mais inativo do ecossistema.
Por que a solução óbvia falha: sort por Vol/TVL desc penaliza pools jovens com yield momentaneamente alto (volume desproporcional ao TVL) e faz pools legítimos de grande TVL caírem. Alternativa: sort por Volume 1d desc (volume bruto, não razão) — pools parados como WISE/ETH caem naturalmente; pools de cauda tóxicos são contidos por threshold de TVL mínimo separado. Trade-off: perde a leitura clara de "maior pool da rede" — aceitar se o sort for explicitamente nomeado ("Mais ativos") com opção de sort por TVL a um clique. Perfil afetado: iniciante (principal) + intermediário.
Em modo "Todas as redes" e versão "Tudo", ETH/USDC aparece em pelo menos 8 linhas distintas: v2 0,3%; v3 0,3%; v3 0,05%; v3 0,01%; v4 0,3%; v4 0,05%; v4 0,01%; v4 0,0008% (4). Versão menor do mesmo problema já visível nas primeiras telas: linhas 2, 4 e 7 são "ETH/USDC v3" com fees diferentes, sem dimensão de rede visível que explique se são pools distintos em redes diferentes ou o mesmo pool com fee tier diferente na mesma rede (1).
Para o LP iniciante, cada fee tier tem distribuição de volume diferente — o yield real depende de qual fee tier o swap router concentra mais fluxo. Sem essa informação disponível inline, a decisão de "onde aportar em USDC/ETH" é loteria.
Por que a solução óbvia falha: linha única agregada por par perde a granularidade de fee tier, que é onde mora a estratégia v3/v4 com ticks concentrados; esconder fee tiers com TVL baixo é editorial (define quem é "oficial"). Alternativa: entrada "ETH/USDC" como linha pai expansível com TVL e Vol/TVL somados cross-fee-tier e cross-chain, sub-linhas revelando (versão, rede, fee, TVL individual, % do volume agregado). User compara pares no nível alto, escolhe execução no nível baixo. Trade-off: exige modelo de par canônico (vide 🟡 Oportunidade "Par canônico cross-chain"). As duas decisões são complementares. Perfil afetado: iniciante (principal — vê 8 "ETH/USDC" e não tem critério) + intermediário planejando LP.
Em Tokens, "Todas as redes" funciona porque o mesmo token tem versão canônica cross-chain (USDC é USDC). Em Pools, cada (token-A, token-B, rede, fee) é entidade distinta com TVL, yield e risco independentes (3). Em modo "Todas as redes", a tabela mistura ETH/USDC Ethereum, ETH/USDC Base e ETH/USDC Arbitrum sem coluna de rede visível — iniciante não decoda se são o mesmo pool em redes diferentes ou pools com fee tier diferente na mesma rede. O default que funciona em Tokens é problema em Pools porque o modelo de objeto é diferente: token tem canônico cross-chain; pool não tem.
Por que a solução óbvia falha: trocar default para Ethereum específico cria viés de rede e força decisão prematura de funil. Alternativa: manter "Todas as redes" como default + agrupamento visual por rede dentro da tabela quando o filtro está nesse estado — sublinha tipográfico sutil antes de cada bloco de rede, mantendo sort global por TVL mas com âncora de transição visual. Trade-off: quebra levemente a leitura tabular pura; ganho é desambiguação de "é o mesmo pool ou são pools diferentes?". Perfil afetado: iniciante (principal) + intermediário multi-chain.
Dois vetores complementares na mesma tela: ETH/USDT #59 com Vol/TVL 23,86 (2386% giro diário — inviável para pool legítimo sem wash trading, MEV, ou flash loans) (4); ETH/ASTEROID #94 com APR 474,75% e outros pools de cauda com APR triple-digit (4). Ambos funcionam como catnip visual para o iniciante que ainda usa o framework "número alto = melhor pool".
O agravante: a própria Uniswap pedagogiza Vol/TVL como métrica decisora (1). Ao ensinar o usuário a usar Vol/TVL como referência de qualidade, o produto implicitamente valida "quanto maior, melhor" — o que para Vol/TVL 23,86 é armadilha direta.
Por que a solução óbvia falha: filtro automático de outliers esconde pools legítimos durante campanhas de incentivo real (LM genuíno pode disparar volume agudo pontualmente). Alternativa: badge sutil quando Vol/TVL > 3,0 e APR > 100% com tooltip pedagógico específico por tipo ("Volume excepcionalmente alto pode indicar wash trading ou incentivo temporário — verifique trajetória antes de aportar"). Threshold visível e desativável por usuário avançado. Trade-off: threshold é opinião — aceitar revelando o critério explicitamente. Perfil afetado: iniciante (principal).
Tokens como SIERRA/USDC, ETH/ASTEROID, ELON/ETH e ROCH/ETH intercalados com pools de blue-chip ao longo das 100 linhas sem badge de verificação por par nem fenestração editorial (4). Contraste direto com Leilões #7 (que tem badge ✓ nas primeiras linhas e "Mostrar leilões ocultos" no rodapé) — em Pools a neutralidade é total, sem sinalização de risco diferenciada.
O risco específico de LP vai além do trade: trader iniciante perde só o swap em token scam; LP iniciante pode perder toda a posição via rug pull por mint maligno ou one-side liquidity drain — vetor mais devastador e menos conhecido.
Por que a solução óbvia falha: verificação de par exige que ambos os lados sejam verificados; o caso mais comum é um lado blue-chip + outro lixo (ETH/SCAMTOKEN), o que torna a semântica de "par verificado" ambígua. Alternativa: filtro "Apenas pools com tokens verificados em ambos os lados" + badge ⚠ em pools com pelo menos um token não-verificado. Default = mostrar tudo (neutralidade mantida); badge sinaliza, filtro empodera. Copy obrigatório: "verificado = critérios objetivos do token; não é recomendação de aportar como LP". Trade-off: verificação de token tem caveat conhecido (verificado ≠ seguro); aplicar a pares amplifica o caveat — aceitar com copy claro. Perfil afetado: iniciante LP (principal).
Padrão atual da indústria: Uniswap, PancakeSwap, Curve, Aerodrome exibem APR e Vol/TVL como números crus — sem janela de cálculo especificada, sem indicação de IL, sem aviso de outlier. ETH/USDC v3 0,3% mostra "87,68% Renda anual" (1) sem ancoragem ("estimativa baseada em 7d, não inclui IL"). ETH/USDT com Vol/TVL 23,86 e ETH/ASTEROID com APR 474,75% ficam ao lado de pools legítimos (4) sem distinção visual.
Por que afeta o target: iniciante toma o número como promessa de retorno, aporta esperando 87% ao ano, e descobre IL depois. Para outliers: número alto é sinal automático de "melhor opção" para quem ainda usa heurística de valor nominal. O preço da confusão é IL real + capital travado em pool de cauda.
Hipótese de diferenciação Kotai: (a) re-label "Renda anual estimada (7d, sem IL) ⓘ" + tooltip explicando IL com link para simulador; (b) badge automático para Vol/TVL > 3,0 e APR > 100% com tooltip pedagógico contextual por tipo de outlier. Versão MVP: apenas label correto + tooltip. Versão avançada: coluna adicional "Yield líquido observado (30d)" — APR descontado de IL realizado, calculado retroativamente — pool com APR projetado alto mas yield líquido baixo fica explícito.
Trade-off: threshold é opinião com pretensão de neutralidade — aceitar revelando o critério explicitamente. Cálculo de IL retroativo é custoso — versão MVP desvincula as duas entregas sem perder o diferencial principal. Importante: (a) e (b) são entregáveis desacoplados com escopo e MVP distintos — (a) afeta todos os pools com qualquer APR e pode ir a ar sem (b); (b) afeta apenas pools com métricas extremas e é extensão independente. Implementar (a) sem (b) é perfeitamente válido e não compromete o diferencial principal.
Passa nas 4 perguntas-teste? (1) ✓ universal entre concorrentes (2) ✓ afeta iniciante diretamente (3) ✓ razão = receio editorial + falta de threshold canônico (4) ✓ número extremo deixa de ser convite e vira pergunta.
Leverage alto — afeta toda lista com métricas de rendimento (Pools, Leilões, Tokens com staking). Família com educação inline de outros fluxos; esta é a instância mais econômica de impacto porque "renda anual" é o número que define alocação.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch tratam cada (token-A, token-B, rede, fee) como entrada de tabela independente, sem agregação cross-chain ou cross-fee (3). Resultado em escala: ETH/USDC em ≥8 linhas na mesma tabela (4). Nenhum DEX oferece visão "par como entidade" porque isso exige canonical mapping de token cross-chain — decisão arquitetural que não foi feita.
Por que afeta o target: modelo mental do usuário é "par de ativos"; o produto entrega "par × rede × fee" como produto cartesiano flat. Iniciante vê 8 "ETH/USDC" aparentemente iguais e não tem critério de escolha. Intermediário multi-chain ainda precisa ler ícone de rede linha por linha para comparar yields.
Hipótese de diferenciação Kotai: entrada "ETH/USDC" como linha pai com TVL + Vol/TVL agregados cross-fee-tier e cross-chain, expansível em sub-linhas por (rede, fee, TVL individual, % do volume agregado roteado pelo par). User decide par no nível alto, execução (rede, fee) no nível baixo.
Trade-off: exige canonical mapping cross-chain (USDC nativo vs bridged, WETH vs ETH) — risco semântico se mapeamento for incorreto; misturar bridged-USDC com nativo-USDC cria confusão pior que a fragmentação atual. As duas decisões são complementares: canonical mapping de token + agregação de pool por par. Família com 🟡 "Token canônico" de Modal Token — mesma raiz arquitetural aplicada em dimensão diferente.
Passa nas 4 perguntas-teste? (1) ✓ universal entre concorrentes (2) ✓ iniciante e intermediário direto (3) ✓ decisão arquitetural, não impossibilidade técnica (4) ✓ primeira tela mostraria pares em vez de instâncias.
Leverage estrutural — define a hierarquia de exploração da página inteira e resolve simultaneamente as Fricções 2 (fragmentação de pares) e a semântica problemática de "Todas as redes".
Padrão atual da indústria: Uniswap, PancakeSwap, Curve, 1inch — todos ordenam pools por TVL desc por default. Convenção desde 2020; nenhum DEX principal quebrou esse padrão.
Por que afeta o target: vide Fricção "Sort default por TVL". TVL ≠ utilidade; pools mortos com TVL alto sobem; iniciante interpreta posição como autoridade. A diferença na primeira impressão é concreta: pool #1 vira ETH/USDC ativo (Vol/TVL 0,80) em vez de WISE/ETH parado (Vol/TVL <0,01) (1).
Hipótese de diferenciação Kotai: sort default por Volume 1d desc (atividade observada), com label explícito "Mais ativos" + opção de sort por TVL a um clique. Primeira impressão da página mostra onde o capital efetivamente trabalha.
Trade-off: DEX que fizer isso vai ouvir "vocês escondem o maior pool da rede" de power user — aceitar se o sort for explicitamente nomeado e o sort por TVL acessível. Segundo: sort por Vol. 1d não penaliza pools de alta TVL + alta atividade (ficam no topo de qualquer forma — é só pools inativos que caem).
Passa nas 4 perguntas-teste? (1) ✓ universal — nenhum DEX mudou o default (2) ✓ afeta iniciante direto (3) ✓ inércia de convenção + argumento "TVL = profundidade de liquidez" que favorece pool grande mas inativo (4) ✓ diferença perceptível na primeira tela — pool #1 muda completamente.
Leverage estrutural — define a primeira impressão da página inteira. Família com 🟡 sort de Leilões e com a Fricção "Sort por TVL" acima; versão do mesmo eixo aplicada como diferencial competitivo.
Padrão atual da indústria: nenhum DEX expõe filtro "pools com tokens verificados em ambos os lados" no nível de lista (4). Verificação de token existe em explorers (Etherscan) e dentro de páginas de token individual, mas não como dimensão de filtragem de pool. A lacuna é de modelo de objeto: verificação foi construída para tokens isolados, não para pares.
Por que afeta o target: risco específico de LP vai além do trade — trader perde só o swap em token scam; LP pode perder toda a posição via rug pull por mint maligno. Pool de cauda com token honeypot prejudica LP iniciante de forma mais devastadora que qualquer swap isolado. Vertical de LP é sistematicamente menos protegida que a de trade em todos os DEXs.
Hipótese de diferenciação Kotai: filtro "Apenas pools verificados" + badge ⚠ em pools com pelo menos um token não-verificado. Default = mostrar tudo (neutralidade mantida); badge sinaliza risco, filtro empodera escolha ativa. Copy obrigatório: "verificado = critérios objetivos do token, não é recomendação de aportar como LP".
Trade-off: verificação de token tem caveat conhecido (verificado ≠ seguro); aplicar a pares amplifica o caveat. Aceitar com copy claro e consistente.
Passa nas 4 perguntas-teste? (1) ✓ concorrentes ignoram verificação em pool (2) ✓ afeta LP iniciante diretamente (3) ✓ modelo de verificação construído para tokens, não pares; receio editorial sobre curadoria de pares (4) ✓ LP filtra "apenas seguro" e vê tabela colapsar para subset confiável — diferença imediata e perceptível.
Leverage alto — toca tese antiscam aplicada a LP, vertical menos protegida que trade. Família com Leilões #3 (banner "Não verificado") e Leilões #7 (fenestração da curadoria); é a extensão natural dessas proteções ao contexto de provisão de liquidez.
Consolidado equivalente de Pools para PancakeSwap ainda não disponível. Adicionar quando produzido. Referência futura: Consolidado Pools PancakeSwap.





















Função: entrada do fluxo de criação de posição de liquidez. URL /positions/create?currencyA=NATIVE¤cyB=undefined&chain=ethereum&fee=undefined — Etapa 1 (Selecionar par + Nível de tarifas) ativa; Etapa 2 (Definir faixa de preço e valores de depósito) pendente. Versão default = v4.
Componentes
Suas posições › Nova posição.-- nível de tarifas (placeholder) + subtexto "A porcentagem que você ganhará em tarifas" + botão Mais ▾.Regras de negócio
🟢 Insight 1 — Stepper vertical explícito reduz ansiedade de "quanto falta". Mostrar "Etapa 1 / Etapa 2" antes do user começar é decisão pedagógica importante: criar posição de LP é processo de várias decisões (par, fee, range, valores), e iniciante que entra sem âncora de "quantos passos isso vai ter" tende a abandonar. Concorrentes (PancakeSwap v3, 1inch LP) frequentemente jogam tudo num formulário único com 8 campos — stepper sinaliza progressão. Padrão a herdar pra Kotai: qualquer fluxo com >3 decisões interdependentes ganha stepper visível. ^insight-1
🟢 Insight 2 — ETH pré-preenchido como Token A reduz cliques sem decisão estratégica. Em Ethereum mainnet, ETH é o lado mais comum de qualquer par de LP. Pré-preencher como Token A reduz o caminho para o caso 90% sem forçar nada (o user pode trocar). Padrão a herdar — defaults pegam o caso comum, não o caso "neutro". ^insight-2
🟢 Insight 3 — Microcopy pedagógica abaixo de cada section, não em tooltip ⓘ. "Escolha os tokens para os quais você deseja fornecer liquidez", "O valor ganho por oferecer liquidez. Escolha um valor compatível com sua tolerância a risco e estratégia." — explicação inline, sempre visível, em copy que evita jargão técnico. Concorrentes escondem essas frases em ⓘ que iniciante não passa o mouse. Padrão a herdar — instrução de campo de formulário DeFi vive abaixo do label, não em hover. ^insight-3
🔴 Fricção 1 — Seletor de versão (v2/v3/v4) é o controle de maior peso da página com hierarquia visual de configuração secundária (estrutural — afeta posicionamento pedagógico do fluxo inteiro) ^friccao-1
/v2, /v3, sem prefixo em v4). É a decisão que mais impacta o trade-off de capital eficiente vs simples vs customizável. E está com peso visual igual a "Redefinir" — um botão que zera o formulário. O CTA principal da página parece a confirmação ("Continuar"); o chip de versão parece accessory. Inversão completa de hierarquia.🔴 Fricção 2 — "Adicionar um hook (Avançado) ⓘ" é jargão técnico misturado a campos pedagógicos (estrutural — vetor de intimidação) ^friccao-2
🔴 Fricção 3 — Campo "Nível de tarifas" com placeholder -- nível de tarifas + botão "Mais ▾" tem affordance ambígua (cosmética-estrutural — bloqueia o user no campo crítico) ^friccao-3
-- nível de tarifas (parece input) + botão lateral Mais ▾ (parece "ver mais opções"). Não está claro se: (a) clicar no campo abre lista (b) preciso digitar (c) "Mais ▾" é onde a lista mora (d) o campo é só rótulo e a interação é só pelo "Mais ▾". Em v4, fee tier é decisão estratégica (tier baixo = mais swaps mas menos fee/swap; tier alto = ao contrário), e a UI não orienta o user a explorar.🟡 Oportunidade competitiva — Assistente de seleção de versão (v2 / v3 / v4) baseada em perfil ^oportunidade-1
Observação adicional — URL como state machine. A URL ?currencyA=NATIVE¤cyB=undefined&chain=ethereum&fee=undefined carrega todo o estado do formulário (par, rede, fee tier, e na Tela 2 também a versão como path segment /v2). Decisão de produto a herdar — em fluxos compartilháveis (LP, swap, leilão), URL parametrizada permite linkar setups específicos ("deposite WISE/ETH em v2 0,3%"). Não é fricção desta tela; é boa prática a registrar.
Função: mesma página em estado de Etapa 1 quase completa — versão trocada para v2, Token B preenchido (WISE), fee tier implícita (v2 fixa em 0,3%). URL /positions/create/v2?currencyA=NATIVE¤cyB=0x66… (path /v2 agora).
Componentes (diff em relação à Tela 1)
0x66…).Regras de negócio
🟢 Insight 1 — Microcopy do "Nível de tarifas" é dinâmica e explica trade-off da versão. "Todos os pools v2 têm tarifa fixa de 0,3%. Para mais opções, oferte liquidez no v4." — em 2 frases o produto explica (a) por que não tem campo de fee aqui, (b) onde está a flexibilidade. Diferente de remover o campo silenciosamente (o que confundiria "cadê o nível de tarifa?"), o produto mantém a section visível e usa o espaço para educar. Padrão a herdar pra Kotai: quando uma decisão é eliminada por contexto, manter a section visível e explicar o motivo é mais pedagógico que remover. ^insight-1
🟢 Insight 2 — Stepper adapta o label da Etapa 2 conforme a versão. "Definir faixa de preço e valores de depósito" (v4) → "Inserir valores de depósito" (v2). O stepper não é decorativo — comunica diferença arquitetural via label. User vê em segundos: "em v2 só preciso colocar valores; em v4 também preciso definir range". Padrão a herdar — labels de stepper são contrato com o user, devem refletir realmente o que vai acontecer no passo. ^insight-2
🟢 Insight 3 — Botão "Continuar" muda visualmente quando habilita. Disabled = outline cinza; habilitado = preenchimento branco sólido. Feedback de validação sem texto auxiliar ("preencha os campos acima"). Padrão simples e correto. ^insight-3
🔴 Fricção 1 — Cross-sell pra v4 ("Para mais opções, oferte liquidez no v4") sem explicar o trade-off (estrutural — empurra iniciante pra versão errada) ^friccao-1
🔴 Fricção 2 — Não há sinalização de que o user vai aportar em pool existente vs criar pool novo (estrutural — vetor de aporte em pool morto) ^friccao-2
🔴 Fricção 3 — "v2" como label técnico sem contexto do que muda pro user (estrutural — versão como caixa-preta verbal) ^friccao-3
🟡 Oportunidade competitiva — Card de pré-visualização do pool destino antes do depósito ^oportunidade-1
Observação adicional — caso "pool ainda não existe" tem semântica completamente diferente. Em v2 com par novo, o primeiro provedor de liquidez define o preço inicial do par (a razão entre os dois lados vira o preço de mercado). Risco enorme: definir preço fora do mercado real cria oportunidade de arbitragem que drena valor do LP no primeiro bloco. Esta tela não distingue "vou aportar em pool existente" de "vou criar pool novo" — semânticas e riscos diferentes recebem a mesma UI. Não é fricção desta captura (o pool existe), mas é decisão de design a registrar pra Kotai: caso "primeiro LP" precisa de UX dedicada com warning de definição de preço inicial.
Função: popover ancorado no chip de versão, listando as outras versões disponíveis para criação de posição. Trocar versão muda a URL e o conteúdo de toda a página (stepper, campos, default de fee, presença de hooks).
Componentes
Regras de negócio
🟢 Insight 1 — "Nova posição de v4 / v3" como label, não "Trocar para v4 / v3". Sinaliza que clicar = redefinir o formulário, não toggle in-place. User entende que perde estado (par preenchido, fee escolhida) ao trocar — ou pelo menos é avisado pela forma do verbo. Padrão a herdar pra Kotai — quando trocar uma dimensão reseta o resto, a label deve refletir "começar de novo", não "ajustar". ^insight-1
🔴 Fricção 1 — v2 (estado atual) omitido do dropdown gera dúvida "em qual estou?" (cosmética; convenção problemática em decisão de alta consequência) ^friccao-1
<select> é omitir o atual; mas o user que abriu o popover sem intenção firme não tem feedback "você está em v2" — só infere por exclusão (vejo v4 e v3, então estou em v2). Em decisão de alta consequência (versão muda toda a página), o ônus de inferência é fricção real.🔴 Fricção 2 — Versões listadas sem qualquer descrição do que muda (estrutural — decisão técnica sem assistência) ^friccao-2
🔴 Fricção 3 — Sem aviso de perda de estado ao trocar versão (estrutural — destrutivo silencioso) ^friccao-3
🟡 Oportunidade competitiva — Versão como cartões comparativos, não como dropdown ^oportunidade-1
Observação adicional — convenção de "Nova posição de Vx" vs label do chip "Posição de v2". O chip mostra "Posição de v2"; o dropdown mostra "Nova posição de v4". Há uma inconsistência sutil: o chip omite "Nova" (sugere "estou em" estática), o item do dropdown inclui "Nova" (sugere "começar de novo"). Coerente com a semântica (chip = estado, item = ação), mas o user que lê depressa pode achar que o chip diz "minha posição existente é v2" — quando na verdade só significa "este fluxo de criação está configurado pra v2". Não é fricção crítica, mas vale registrar.
Função: popover ancorado na engrenagem (⚙) do canto superior direito da página. Permite ajustar dois parâmetros de transação que se aplicam ao envio do depósito de LP — slippage máximo + deadline de transação.
Componentes
Regras de negócio
🟢 Insight 1 — Settings em popover ancorado, não em página separada. Mantém o user no contexto da criação de posição. Padrão correto — alterar slippage não é decisão arquitetural, é ajuste fino que não merece navegação dedicada. Padrão a herdar pra Kotai: settings que afetam um fluxo específico vivem no contexto do fluxo, não em "Preferências globais". ^insight-1
🟢 Insight 2 — Chip "Auto" exibe o valor calculado (2.5%), não esconde a heurística. Diferente de "Auto" como caixa-preta (que muitos apps usam — "deixa que a gente decide"), aqui o user vê o número que o sistema escolheu. Transparência sobre o automatismo. Padrão a herdar pra Kotai — "Auto" sempre exibe o valor concreto que está aplicando, com chip indicando que o valor vem do sistema, não de input manual. ^insight-2
🔴 Fricção 1 — "30 minutes" em inglês no meio de UI em PT-BR (cosmética; quebra de i18n; convenção problemática) ^friccao-1
🔴 Fricção 2 — "Prazo final da transação" tem ambiguidade entre tempo absoluto e tempo relativo (estrutural-leve; semântica de label) ^friccao-2
🔴 Fricção 3 — Slippage "Auto = 2,5%" sem contexto da decisão automática (estrutural — "Auto" semântico vs "Auto" estático) ^friccao-3
🟡 Oportunidade competitiva — Settings contextualizadas ao par/pool escolhido ^oportunidade-1
Observação adicional — popover sem botão "Salvar". Padrão de popover de settings sem botão de confirmação aplica mudanças no perder foco (clicar fora). Isso é convenção válida em settings reversíveis (Notion, Linear, Figma). Em settings que afetam dinheiro real (slippage = quanto preço você aceita pior; deadline = quando a transação expira), a ausência de confirmação pode levar a "salvei sem querer" — user clica fora pensando que estava cancelando. Não é fricção evidente desta captura (não há prova de problema), mas vale registrar: settings que alteram parâmetros financeiros podem merecer um padrão diferente do popover comum.
O fluxo Visualizar Pool cobre 11 telas de detail view de uma pool — desktop (telas 1–3) e mobile (telas 4–11), incluindo os widgets de swap, ordem-limite e on-ramp contextualizados no par. Dois perfis chegam aqui com intenções distintas: o LP avaliando saúde do pool antes de aportar/retirar liquidez, e o trader querendo operar diretamente do contexto. O produto acerta em dois eixos: entrega contexto herdado da entidade para as ações (tokens pré-selecionados, chart por Volume, breadcrumb), e aplica presets chips de forma consistente em toda decisão financeira. A tensão estrutural concentra-se em dois padrões opostos: o widget de execução se desacopla sistematicamente dos sinais de saúde da pool no momento exato da decisão — o modal desktop cobre o chart (1), os KPIs somem da fold mobile antes do CTA de liquidez (4), o bottom sheet cobre Estatísticas (8) — e a copy em PT-BR, mais longa que EN, nunca foi reauditada por breakpoint, gerando truncamentos em cinco componentes distintos (2, 7, 8). O perfil mais afetado em ambos os eixos é o iniciante: não tem heurísticas internas para compensar sinais ausentes, e não infere o que está por trás do texto cortado.
O produto trata ações como sub-eventos da entidade onde o usuário já está, não como destinos independentes. O widget de swap abre com WISE→ETH pré-selecionados porque o par da pool já estava em contexto (1); o chart default é Volume (não Preço) porque quem está na pool detail pensa em saúde de infraestrutura, não em trajetória de token (2); o breadcrumb Pools › WISE/ETH mantém-se em mobile (4); e o bottom sheet de swap preserva os tokens pré-selecionados do par (8). Padrão a herdar para Kotai: quando o usuário está em uma entidade, qualquer ação derivada herda os parâmetros visíveis — elimina cliques e o risco de operar no par errado.
Toda decisão financeira com âncora numérica recebe preset chips: 25 / 50 / 75 / Máx. no campo de saldo a vender (8); Mercado / +1% / +5% / +10% no preço-limite (9); 1 dia / 1 semana / 1 mês / 1 ano na expiração (10); 100 / 300 / 1.000 US$ no on-ramp (11). Padrão: eliminar cálculo cognitivo sempre que o input tem uma âncora natural (saldo, preço de mercado, período). Em mobile — onde digitar é caro — o ganho é maior. Padrão a herdar em ambos os breakpoints.
Risco e variação são atributos do número, não entidades separadas. O aviso CEX âmbar fica visível durante todo o preenchimento do swap (1 e (8) — não popup no final. Deltas ↑1,27% e ↓81,84% ficam colados ao TVL e ao Volume 24h (2 e 6). Na Ordem-limite, o aviso "pode não executar" com link "Saber mais" é cidadão de primeira classe (9). Padrão a herdar: feature com modo de falha não-intuitivo (slippage, ordem-limite, MEV) recebe aviso inline antes da confirmação, nunca após.
A tabela de transações completa (desktop) (3) e colapsada em trio essencial (mobile) (5) entregam o livro de eventos sem exigir abertura de Etherscan. Trust signal por exposição direta — o produto não esconde o passado. Padrão a herdar para Kotai: dado on-chain canônico pertence dentro da entidade, não em link externo. A section Links com contratos do pool e dos tokens individuais reforça esse padrão (3).
O card de identidade do pool (WISE / ETH v2 0.3% + endereço) fica sticky durante o scroll (5) — usuário auditando a tabela de transações sempre sabe em qual pool está. CTAs Fazer swap e + Adicionar liquidez ficam em sticky bar inferior (4) — acesso à ação não depende de scroll-up. Padrão a herdar: em page de entidade mobile, header compacto e CTAs primários são sticky independentes; o conteúdo rola entre eles.
Diagnóstico: o produto trata o widget de execução (swap, ordem-limite) como superfície autônoma, sem responsabilidade de carregar o contexto da pool onde o usuário está operando. As manifestações são quatro e pioras progressivamente:
+ Adicionar liquidez pode nunca ter visto APR 0,00% e Volume ↓82%.Ordem-limite, o sheet expande para full-screen e o header sticky da pool desaparece (9) — usuário perde até a âncora de "qual pool estou operando". Em DeFi, operar no pool errado (v2 vs v3, fee 0,3% vs 0,05%) é dano financeiro.Por que a solução óbvia falha: reduzir o modal/sheet para deixar o chart visível espreme o widget e força scroll interno; modal semi-transparente cria ruído visual; mostrar só o número de APR sem narrativa repete a Fricção "APR mudo" (ver abaixo).
Alternativa: duas intervenções independentes — (a) no desktop, swap ocupa permanentemente a sidebar quando ativado, empurrando Estatísticas para baixo (não para fora), e o chart permanece intacto; (b) em qualquer sheet/bottom sheet de ação, um chip-strip compacto de saúde (APR 0% • TVL 133M • Vol ↓89%) fica ancorado no topo do sheet, abaixo do grab handle e acima das tabs — usuário leva os três sinais consigo ao abrir o widget. Esse strip é o mesmo proposto na 🟡 Oportunidade competitiva 1 (ver abaixo). Trade-off: ~36 px adicionais no topo de cada sheet; ganho: nenhum ato de decisão acontece sem sinal de saúde da pool.
Perfil afetado: iniciante (principal — sem heurística interna de slippage em pool morto) + intermediário em decisão rápida.
Diagnóstico: copy em PT-BR é sistematicamente mais longo que EN e nunca foi reauditado por breakpoint. O padrão aparece em cinco componentes distintos, confirmando que é problema de processo (internacionalização sem QA de layout), não de tela isolada:
+ Adicionar liqu… truncado em desktop (2) e em sticky bar mobile (4, 5). Em mobile o corte é garantido por design — dois botões dividem a barra. Agravante: "liquidação" tem conotação financeira negativa (margin call); iniciante pode ler + Adicionar liqu… como "adicionar liquidação".P…, Wise…, Wrapp… — 3 a 5 caracteres visíveis (7). O produto sabe o nome completo do contrato (renderiza Wrapp…, ou seja, "Wrapped Ether"), mas não deu espaço. A única pista textual de contexto foi cortada antes de ser útil.Vender truncada para Vẽd no bottom sheet (8) — corte ortográfico com diacrítico no meio, não abreviação. Usuário não decoda.Por que a solução óbvia falha: abreviar manualmente cada string ("+ Liquidez", "Sell", "P") perde verbo ou contexto; aumentar viewport de cada componente individualmente é whack-a-mole.
Alternativa: QA de layout em PT-BR como etapa obrigatória no ciclo de release — checklist de "todos os CTAs, tabs e labels foram testados nos breakpoints mobile/desktop em PT-BR". Para os casos atuais: dois CTAs em coluna na sticky bar (Fazer swap / Adicionar liquidez, full-width cada); section Links com eyebrow POOL / TOKEN substituindo labels de nome longo (ver 🟡 Oportunidade 5); barra de tabs com quatro itens reduzida para Trocar | Avançado ▾ em mobile. Trade-off: reestruturação de layout em três superfícies; ganho: nenhum label primário truncado em nenhum breakpoint.
Perfil afetado: iniciante (principal — não infere o texto cortado) + todos os perfis no CTA (que precisa ser inequívoco).
Diagnóstico: o card APR ocupa o maior peso visual da seção de saúde em ambos os breakpoints — em desktop (2), compete com o card de Estatísticas; em mobile (6), é a primeira coisa que o usuário lê ao rolar para a seção de saúde, antes de TVL, Volume e Tarifas. O número 0,00% grita; o motivo sussurra. Iniciante fecha a página com a conclusão "este pool não rende" sem entender que APR zero é função direta de Volume baixo + TVL alto — o 12,62 US$ em Tarifas 24h sobre 135,3 M US$ em TVL revela o 0% (3), mas somente quem cruza os dois números decoda. Em mobile, com o APR card ainda mais isolado (6), a leitura correta exige dois scrolls adicionais.
Por que a solução óbvia falha: tooltip ⓘ "sussurra" enquanto o número "grita"; microcopy genérica "Calculado sobre fees 24h" é técnica demais para o iniciante e não explica este pool.
Alternativa: caption narrativa contextual abaixo do valor, gerada por bucket de situação real — APR 0,00% + "Pool com volume baixo nas últimas 24h. Fees insuficientes para gerar renda anual perceptível." Em pool ativo com APR alto, a caption muda. Trade-off: classificação errada de bucket produz diagnóstico errado (pior que silêncio) — exige 4–5 templates conservadores bem definidos.
Perfil afetado: iniciante (principal) + intermediário que não cruza Vol/TVL automaticamente.
Diagnóstico: o design mobile é cópia comprimida do desktop, não hierarquia repensada. Duas perdas críticas:
+ Adicionar liquidez fica acessível na sticky bar mobile enquanto o sinal de APR 0% e Vol ↓82% ainda não foi visto.519,7 M WISE / 28,6 mil ETH. Iniciante mobile não tem como converter mentalmente quais são os valores relativos de capital; perdeu o sinal pedagógico mais eficiente do card.Por que a solução óbvia falha: subir toda a sidebar acima do chart consome o viewport inteiro; manter só o APR sem contexto repete a fricção "APR mudo"; barra de proporção em quadrante de 140px não renderiza bem em proporções extremas.
Alternativa: chip-strip compacto antes do chart (APR 0% • TVL 135M • Vol ↓82%) em mobile como substituto da sidebar desktop, com tap-to-expand para drawer contextual (o strip vira o ponto de entrada para a explicação narrativa do APR). Barra de proporção de saldos: versão horizontal full-width abaixo dos dois números do quadrante, com labels percentuais inline (52% WISE • 48% ETH). Trade-off: strip adiciona ~36 px no entrypoint; barra adiciona ~16 px no card de saldos.
Perfil afetado: iniciante (principal — depende mais da hierarquia do produto para filtrar pools ruins) + LP intermediário avaliando aporte.
Diagnóstico: tela 1 exibe o par como WISE/ETH; tela 2, o mesmo contrato 0x21b8…596E, exibe ETH/WISE. A setinha de inverter par existe no header e é funcional — mas quando o usuário fecha o modal de swap e volta ao estado base, a inversão persiste. Iniciante que não decoda "par é comutativo" interpreta a mudança como "naveguei para um pool diferente" (2). O endereço 0x21b8…596E é o único identificador que não muda, mas iniciante não lê endereços.
Por que a solução óbvia falha: fixar ordem canônica tira a utilidade da setinha (caso real: trader pensa em "ETH em termos de WISE" vs "WISE em termos de ETH").
Alternativa: manter a setinha, mas exibir âncora explícita de orientação no header — Mostrando ETH/WISE ↕ onde o ↕ é a setinha e "Mostrando" deixa claro que há uma orientação ativa. Breadcrumb em Pools › WISE/ETH permanece na ordem canônica (alfabética ou por liquidez) independentemente da inversão. Trade-off: header ganha um label; ganho: usuário sabe que está controlando a visualização, não navegando para outro pool.
Perfil afetado: iniciante (principal) + intermediário em navegação rápida entre múltiplos pools.
Diagnóstico: Há um dia é label rolante — a janela de 24h se move a cada segundo, e barras de volume saem conforme o tempo passa. Big stat mobile mostra 1,3 mil US$ (4); card Estatísticas mobile mostra Volume 24h: 1,3 mil US$ ▼89,48% (6) — batem porque foram capturados ao mesmo tempo, mas divergem do desktop (4,2 mil US$) porque a janela se moveu. Intermediário que compara dois dispositivos lê dois números diferentes e atribui inconsistência ao produto. O delta também migrou de ↓81,84% para ▼89,48% entre capturas — degradação real do pool dentro da janela de captura, sem nenhuma sinalização de "este número está vivo".
Por que a solução óbvia falha: congelar em "data de fechamento de 24h" inventa convenção que o restante do produto não segue.
Alternativa: timestamp único da view — rodapé ou header discreto Dados: 11:28 • atualiza a cada 30s. Todos os KPIs da página derivam da mesma snapshot daquele timestamp — eliminação de divergência intra-tela como garantia arquitetural, não coincidência. Desktop e mobile diferem quando capturados em momentos diferentes, mas dentro de uma tela única os números são coerentes. Trade-off: requer snapshot coerente no backend; ganho: usuário que duvida do número tem uma âncora factual.
Perfil afetado: intermediário (principal — começa a comparar entre dispositivos e sessões) + iniciante avançando.
Diagnóstico: o produto exibe valores em unidade técnica sem anotação em unidade intuitiva. No campo Comprar do swap mobile (8), a cotação USD aparece (0 US$), mas no campo Vender não há equivalente em fiat — assimetria de pedagogia que esconde o slippage real (o delta entre os dois USD é o slippage). No preço-limite da Ordem-limite (10), o input exibe 0,0000550306 em ETH — oito casas decimais que iniciante não decoda. O label virou prosa contextual ("Quando 1 WISE valer"), mas o número permaneceu jargão.
Por que a solução óbvia falha: substituir ETH por USD muda a unidade de cotação e perde a relação técnica WISE↔ETH; mostrar dois números por campo polui; notação científica (5,5 × 10⁻⁵) é pior para não-quant.
Alternativa: eyebrow USD discreto abaixo de qualquer número em unidade não-fiat — 0,0000550306 ETH + eyebrow ≈ 0,21 US$ em cinza pequeno. A precisão técnica permanece (necessária para LP / power user); a leitura intuitiva aparece como anotação. No campo Vender do swap: adicionar cotação USD em cinza abaixo do input, igual ao campo Comprar — o delta entre os dois torna-se o slippage visível. Trade-off: +16 px por campo; oracle de USD precisa ser fresco (risco de stale > 30s — aceitar mostrando cor diferente quando o dado envelhece).
Perfil afetado: iniciante (principal — não decoda decimais < 10⁻³) + intermediário acostumado a lápis.
Diagnóstico: duas manifestações de affordance desonesta com mecanismos distintos — false affordance visual (tela 8) e progressive disclosure tardio de feature crítica (tela 10). O produto renderiza affordances com aparência habilitada em estados onde não funcionam ou onde a informação necessária para exercê-las ainda não foi fornecida. No bottom sheet de swap (8), os chips 25% / 50% / 75% / Máx. têm aparência de habilitados com saldo 0 WISE (carteira desconectada) — tap em Máx. preenche 0 sem feedback de por que nada aconteceu. Na Ordem-limite (10), o campo de Expiração só aparece depois que o card Preço-limite é preenchido — usuário pode preencher Vender/Comprar manualmente e tocar em Confirmar sem ter encontrado Expiração, com o default 1 semana aplicado silenciosamente (feature crítica de produto financeiro escondida via progressive disclosure). Em ambos os casos, o componente se apresenta como acessível ou completo antes de estar pronto para ser usado.
Por que a solução óbvia falha: desabilitar chips visualmente pode confundir "está quebrado?"; remover o progressive disclosure infla o sheet.
Alternativa: chips de percentual com estilo diferente quando saldo = 0 (outline em vez de fill, opacidade 60%) + tap dispara prompt "Conecte sua carteira para usar atalhos de percentual" — affordance preservada, estado honesto. Expiração: sempre visível no estado vazio com default 1 semana já selecionado — chips de expiração não exigem preenchimento prévio, então não poluem o estado vazio com "campo obrigatório". Trade-off: dois estilos do mesmo componente chip; expiração adiciona ~50 px no sheet vazio.
Perfil afetado: iniciante (principal — primeiro contato com widget de swap / ordem-limite) + intermediário entre carteiras.
Diagnóstico: a coluna Tipo exibe Vender WIS… e Comprar W… em desktop (3) e em mobile (5). O símbolo do token é truncado e repetido em cada linha — informação redundante, porque o pool tem exatamente 2 tokens e ambos estão no header. Em mobile o truncamento é garantido por construção (largura menor), e WIS… não permite inferir com certeza o símbolo completo.
Alternativa: coluna Tipo vira ↓ vermelho (sell) / ↑ verde (buy) sem texto. O token está implícito no header da página. Economia de ~80 px em desktop (vai para coluna Carteira) e ~60 px em mobile (vai para USD com mais casas significativas, ou para chevron de row-expand). Trade-off: perde contexto em pools com múltiplos tokens (caso raro em v2); aceitável quando pool tem par fixo e header sticky com os dois símbolos está sempre visível.
Perfil afetado: iniciante (principal — não infere o símbolo truncado) + todos em leitura rápida.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch, Curve — quando o widget de swap/LP abre como modal ou bottom sheet, métricas de saúde do pool (APR, TVL, Volume) ficam atrás do overlay. Identidade da entidade (qual pool, qual fee tier) some quando o sheet expande para full-screen. O usuário decide sem contexto.
Por que afeta o target: iniciante mobile depende dos sinais de saúde para decidir se o pool é seguro para operar — e é exatamente o perfil que usa DEX 60–70% via mobile. A pool WISE/ETH tem APR 0% e Vol ↓89% (8); sem o sinal no sheet, o usuário opera em pool morto achando que é normal. Na transição para Ordem-limite (9), até a âncora "que pool estou operando" desaparece.
Hipótese de diferenciação Kotai: dois componentes persistentes em qualquer sheet de ação contextualizada a uma entidade: (a) chip-strip de saúde — APR 0% • TVL 133M • Vol ↓89% no topo do sheet, abaixo do grab handle, antes das tabs; em pool ativo, verde discreto; em pool morto, âmbar. (b) mini-chip de identidade — WISE/ETH v2 0.3% em 1 linha discreta, sempre visível mesmo em full-screen. Os dois somam ~60 px no topo do sheet e garantem que nenhuma decisão de execução acontece sem contexto.
Trade-off: 60 px em cada sheet de ação; risco de threshold mal calibrado para "pool morto" gerar falsos positivos. Aceitar expondo o critério ao usuário.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes desacoplam context ao abrir sheet (2) ✓ afeta iniciante mobile diretamente — maior base do target (3) ✓ razão = falta de padrão de design system "mini-identidade em sheet" + decisão de "modal não carrega contexto da entidade pai" (4) ✓ ganho perceptível — usuário nunca precisa fechar o sheet para saber em qual pool está operando.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch — o widget de swap inicial é vazio. Custo de gas, impacto de preço e saúde do pool só aparecem após o usuário digitar um valor. A decisão de digitar é tomada às cegas.
Por que afeta o target: iniciante não sabe quanto custa em gas antes de testar; para pools com baixa liquidez, o impacto de preço pode ser inaceitável — mas o usuário descobre apenas depois de preencher. Em pools mortos (caso WISE/ETH), o widget vazio é visualmente idêntico a um widget de pool líquida (1).
Hipótese de diferenciação Kotai: estado vazio do widget exibe duas informações heurísticas antes de qualquer digitação: Custo estimado: ~12 US$ gas (baseado em gas atual × tamanho médio de swap nesta pool) e, quando Vol/TVL < threshold, badge inline Pool com pouca atividade · Slippage pode ser maior. Quando o usuário digita um valor, as estimativas tornam-se precisas. Trade-off: estimativa errada cria expectativa frustrada — copy de heurística ("estimativa para tamanho médio de swap") precisa ser bem ancorada. Threshold de "pool inativa" precisa ser exposto como critério.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes exibem widget vazio até o usuário digitar (2) ✓ afeta iniciante e intermediário diretamente (3) ✓ razão = exibir custo antes de input requer estimativa heurística — decisão de design + investimento, não impossibilidade técnica (4) ✓ ganho perceptível — usuário decide se vale tentar antes de gastar tempo preenchendo.
Padrão atual da indústria: Uniswap, PancakeSwap, Curve, 1inch — chart é gráfico cru (picos são pontos na série temporal, sem narrativa), section de transações tem só título estático, cards de KPI são read-only. Os dados existem; a narrativa não.
Por que afeta o target: iniciante não lê gráfico DeFi como lê gráfico de bolsa tradicional — não tem repertório visual. Um bar alto isolado às 06h pode ser "pool ativo" ou "1 transação grande de saída" (2); 9 linhas na tabela pode ser "9 traders independentes" ou "1 bot fazendo 7 dos 9 swaps" (5); TVL ▼3,07% pode ser "saída normal" ou "3 LPs saindo em 6h" (6). A informação existe codificada em forma que exige decoda.
Hipótese de diferenciação Kotai: sistema de caption automático em 3 níveis, computado com dados já carregados:
Atividade concentrada em 1 transação às 06h (N transações, % do volume em 1 transação, tipo dominante buy/sell).Transações — 9 trades em 24h • 6 vender, 3 comprar • 67% do volume em 1 trade às 5h.Trade-off: copywriting de regras + i18n; caption errada em casos extremos é pior que silêncio — limitar a 4–5 templates conservadores por nível. Em pool ativo com 1.000+ transações/dia, "47% do volume em 2 carteiras" pode ser informação sensível editorialmente.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes deixam chart, transações e KPIs sem narrativa automática (2) ✓ afeta iniciante diretamente — intermediário absorve como aceleração de leitura (3) ✓ razão = falta de investimento em data-to-text + receio editorial (4) ✓ ganho perceptível — uma frase muda o tipo de pergunta que o usuário faz na próxima ação.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch, Curve — preços em par token/token exibidos em decimais brutos. Conversão para USD existe em outros lugares (carteira, page do token), mas não anotada inline no widget de operação. Usuário lê 0,0000550306 ETH (10) e não tem âncora de valor.
Por que afeta o target: iniciante mobile não tem heurística de 5,5 × 10⁻⁵ ETH. A prosa contextual "Quando 1 WISE valer" resolveu o jargão do label — mas não resolveu o jargão do número. Para o iniciante, a frase ainda termina em ...valer 0,0000550306 — que não diz nada.
Hipótese de diferenciação Kotai: eyebrow USD discreto abaixo de qualquer número em unidade não-fiat, em todo o produto. No widget de Ordem-limite: 0,0000550306 ETH + ≈ 0,21 US$. Nos dois campos do swap: cotação USD em ambos — o delta é o slippage real visível sem cálculo. Trade-off: oracle de USD precisa ser fresco; +16 px por campo; risco de USD stale criar discrepância vs execução real.
Passa nas 4 perguntas-teste? (1) ✓ universal — todos mantêm unidade técnica como nominal (2) ✓ afeta iniciante direto (3) ✓ razão = decisão de "manter precisão técnica como primária" + falta de camada de tradução (4) ✓ ganho perceptível — ≈ 0,21 US$ muda a decisão de executar de forma visceral.
Padrão atual da indústria: Uniswap, PancakeSwap, Curve — section "Contract addresses" lista endereços com símbolo apenas; histórico de transações exibe contrapartes como hashes encurtados sem rótulo. Distinção pool vs token não é exposta como label tipográfica; endereços de roteadores/agregadores aparecem idênticos a wallets de usuários humanos.
Por que afeta o target: iniciante trata todas as entradas da section Links como "contratos do pool" e navega para o lugar errado ao clicar (7); intermediário não decoda que 3 swaps seguidos da mesma wallet 0xe16A… são 1 bot (3) — modelo mental de atividade do pool fica distorcido.
Hipótese de diferenciação Kotai: duas intervenções:
POOL / TOKEN acima de cada entrada da section Links — 1 palavra em uppercase extra-small, resolve ambiguidade sem poluir. Em mobile, substitui o label de nome longo que estava sendo truncado (7).via roteador ao lado do endereço. Sem inferência "bot vs humano" (editorial); só rotulagem de contratos verificados (fato).Trade-off: eyebrow adiciona ~12 px por entrada; base de contratos requer manutenção. Exibir proveniência da label (curado por Kotai / unverified) para transparência.
Passa nas 4 perguntas-teste? (1) ✓ universal entre concorrentes (2) ✓ afeta iniciante direto + intermediário auditando fluxo (3) ✓ razão = falta de copy + custo de manter base canônica de contratos (4) ✓ ganho perceptível — 3 cliques com expectativas pré-formadas; "via 1inch" lido em segundos.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch, DexScreener — em mobile, tabelas DeFi recortam colunas e descartam o que sobra. Usuário que quer ver contraparte ou quantidades por token migra para desktop ou para o Etherscan.
Por que afeta o target: intermediário começa a auditar trades como parte normal do uso — saber quem é a contraparte, conferir slippage do trade, identificar agregadores (5). Mobile-first sem row-expand obriga esse usuário a abandonar o produto para fazer trabalho que pertence à tela.
Hipótese de diferenciação Kotai: chevron › discreto na borda direita de cada linha da tabela; tap abre bottom sheet de 60% com card detalhado — Horário, Tipo, USD, quantidade WISE, quantidade ETH, Carteira com badge via roteador / EOA, link Etherscan. Interação familiar (Notion, Linear, Gmail). Trade-off: dois toques para info que desktop entrega em um olhar; mas single-glance em desktop também exige varredura de 6 colunas. Risco baixo.
Passa nas 4 perguntas-teste? (1) ✓ todos descartam colunas em mobile (2) ✓ afeta intermediário — target válido (3) ✓ razão = falta de investimento em row-expand + receio de "complicar" a tabela (4) ✓ ganho perceptível — paridade informacional completa com desktop, sem sair do produto.
Padrão atual da indústria: Uniswap, PancakeSwap, 1inch — desktop exige digitar valor à mão (ou clicar MAX, único shortcut). Mobile do próprio Uniswap já tem 25 / 50 / 75 / Máx. (8) — o produto inverteu a hierarquia: deu ao mobile o que desktop também merecia.
Por que afeta o target: iniciante desktop não sabe quanto é "50% da posição" — vai à calculadora ou abandona. Intermediário sabe mas perde 2 cliques. Chips mostram "valor relativo ao saldo" instantaneamente.
Hipótese de diferenciação Kotai: chips 25 / 50 / 75 / 100% em ambos os breakpoints. Em desktop, tooltip on-hover mostra o valor absoluto antes do clique (50% = 12,3 ETH). Trade-off: polui levemente o campo Vender em desktop; ganho: paridade de affordance cross-breakpoint.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes não têm em desktop (2) ✓ afeta iniciante e intermediário em desktop (3) ✓ razão = assumir que desktop = digitar à mão (4) ✓ ganho perceptível — chip de 50% é atalho viral para LP que opera fracionado.
Padrão atual da indústria: Uniswap, MetaMask, Coinbase Wallet — on-ramps em DEX/wallets exibem USD como moeda nominal mesmo para usuários fora dos EUA. Bandeira/seletor de país afeta KYC ou método de pagamento, não a moeda exibida. Usuário brasileiro vê US$ no input e paga R$ no PIX sem transparência do quanto é cada um (11).
Por que afeta o target: o target do Kotai é mercado brasileiro / LatAm. On-ramp em USD com cobrança em BRL é a maior fonte de abandono pré-conversão em produtos cripto na região. Usuário que vê R$502 desde o início — com ≈ US$100 como eyebrow — toma uma decisão informada.
Hipótese de diferenciação Kotai: moeda nominal = moeda de pagamento detectada por locale. Presets em valores típicos da moeda local (R$500 / R$1.500 / R$5.000 para BRL; MX$2.000 / MX$6.000 / MX$20.000 para MXN). Conversão para USD como eyebrow + timestamp do FX rate. Quando o usuário troca o seletor de moeda, tudo recalcula. Trade-off: custo de manter FX feeds atualizados + presets currency-aware por moeda. Risco: rate desatualizado cria discrepância vs cobrança final do on-ramp parceiro — aceitar exibindo timestamp do FX rate.
Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes mantêm USD como nominal em locale não-USD (2) ✓ afeta iniciante diretamente — mercado LatAm é o target primário (3) ✓ razão = falta de investimento em locale completo (FX rate + currency-aware presets) (4) ✓ ganho perceptível e imediato — usuário decide aporte na moeda que entende.
+1% / +5% / +10%) é ambígua — "+5%" em relação a qual lado (vendedor ou comprador)? Inverte automaticamente ao trocar direção? Alternativa: chip mostra direção semântica + preço resultante em duas linhas.1 ano em Expiração sem aviso de risco de allowance longa. Aprovação do contrato fica ativa por 1 ano — sem nenhum sinal inline. Alternativa: eyebrow ⚠ no chip + microcopy condicional "Ordens longas mantêm aprovação ativa."ETH na tab Comprar ignora que o contexto da pool é WISE/ETH e o princípio "herdar contexto" (estabelecido na Tela 1) foi quebrado sem aviso. Alternativa: microcopy explicativa — "On-ramp suporta ETH. Para WISE, compre ETH e use Fazer swap."Nota: os drafts intermediários de síntese por lote estão em
_drafts/visualizar-pool-lote-1.mde_drafts/visualizar-pool-lote-2.md. São audit trail do raciocínio — manter até revisão aprovada.
Função: Estado de cotação após inserir valor (US$100).
Componentes
Regras de negócio
🟢 Insight Spinner inline no botão > overlay genérico. Preserva contexto, mantém input editável, comunica que algo está acontecendo sem perder ponto de retorno. Padrão sólido pra qualquer estado de cotação assíncrona (swap quote, gas estimate, allowance check).
Observação adicional Spinner inline funciona se latência é previsível. Quote de on-ramp envolve API de terceiro (MoonPay, Coinbase Onramp, Topper) e pode passar de 2-5s. Vale ter fallback após N segundos ("ainda calculando — parceiros podem levar alguns segundos") em vez de spinner indefinido.
^insight-1
Função: Tab on-ramp (fiat → crypto). Estado inicial antes de digitar valor.
Componentes
Regras de negócio
🟢 Insight Presets fiat com valores redondos são must-have pra reduzir digitação inicial — herdar como padrão pra qualquer tela de input fiat.
^insight-1
🔴 Fricção (estrutural — afeta iniciante BR/LatAm diretamente) Flag BR + valores em US$ criam dissonância de moeda no primeiro contato. Iniciante vindo de exchange local lê "compre cripto" como "compre com meu dinheiro", e o "meu dinheiro" é R$, não US$. Os presets em US$ forçam conversão mental antes do primeiro clique — exatamente onde a tela deveria reduzir digitação.
Por que solução óbvia falha: traduzir presets pra BRL direto pode esbarrar em restrição do provider fiat (MoonPay/Coinbase costumam operar tiers em USD). Mexer só no front sem alinhar com provider quebra na próxima tela.
Direcionamento Kotai: se a integração suporta BRL nativo, presets em BRL com USD pequeno ao lado ("R$500 ≈ US$100"). Se não suporta, manter USD mas com conversão BRL inline ("US$100 · ≈ R$500") e copy clara de que o débito final é em BRL via Pix/cartão com cotação do provider no momento da compra.
^friccao-1






O fluxo Comprar é um on-ramp fiat→cripto embutido dentro do shell visual do swap — e esse é o seu problema central. Desde o empty state (1) até o handoff final (7), o produto trata on-ramp e swap como se fossem a mesma mecânica, quando são radicalmente diferentes em cada dimensão relevante: cotação (determinística vs dependente de provider), rede de destino (implícita vs escolha obrigatória), fee (incluída no output vs cobrada por terceiro), e conclusão (onchain imediato vs aguardar KYC + confirmação fiat). O resultado é uma cadeia de dissonâncias que, isoladas, seriam gerenciáveis; cumulativamente, corroem a confiança no momento em que o usuário está a ponto de comprometer dinheiro real pela primeira vez. O perfil mais afetado é o iniciante — especificamente o usuário BR/LatAm vindo de CEX — que enfrenta flag de país em valores US$, cotação zerada com botão ativo, lista de redes sem contexto, fees invisíveis e handoff abrupto, nesta ordem.
O fluxo tem três instâncias de UX proativa bem executadas, cada uma de natureza diferente. Os presets de valor redondo (1) antecipam o atrito de digitação — o usuário não precisa pensar em valor; o produto oferece âncoras. A geo-detection com pré-seleção visível no topo da lista (4) antecipa o atrito de busca — o país já está selecionado, a confirmação é visual imediata. O card educativo "Iniciar com ETH" (5) antecipa o erro de produto clássico do iniciante: comprar stablecoin sem reserva de gas e descobrir no primeiro swap que não consegue fazer nada com ela. Esse terceiro padrão é o mais sofisticado — não facilita input nem automatiza escolha; educa antes do erro. Os três compartilham o princípio de intervir antes, não depois — padrão a herdar e expandir. O card educativo em particular tem superfície de expansão óbvia: o mesmo princípio cabe em "aviso antes de comprar token em rede que o usuário não usa" e "aviso antes de swap sem reserva de gas".
O atrito real não é cosmético: é o resultado de plugar on-ramp dentro do mesmo container visual do swap sem sinalizar que as mecânicas são diferentes. Na tela de entrada (1), a flag BR aparece com valores em US$ — o iniciante vindo de exchange local interpreta "compre cripto com seu dinheiro" e "meu dinheiro" é BRL; os presets em USD forçam conversão mental exatamente onde a tela deveria reduzir atrito. Na tela de cotação (3), "0 ETH" com botão Continuar ativo é lido como bug — porque em swap o número no output é a cotação real que vai executar; em on-ramp, o número real só vem do provider após o handoff, dependendo de fee do parceiro, método de pagamento, tier de KYC e cotação fiat do momento. Mostrar "valor estimado" não resolve: se o provider entregar 0,038 ETH quando o estimado era 0,041 ETH, vira sensação de bait-and-switch, piorando a fricção.
Direcionamento Kotai: separar visualmente os dois mundos desde o ponto de entrada — não usar o mesmo componente de output do swap na tela de cotação on-ramp. No estado pré-handoff, substituir o slot numérico por status explícito de que a cotação final vem do provider. Para moeda: se a integração suporta BRL nativo, presets em BRL com USD ao lado ("R$500 ≈ US$100"); se não suporta, conversão inline + copy clara sobre cotação no momento do débito.
Perfil mais afetado: iniciante BR/LatAm, especialmente vindo de CEX que já mostrava cotação em tempo real e output determinístico.
A tela de seleção de região (4) acopla a escolha a providers disponíveis, moeda fiat exibida e métodos de pagamento nas telas seguintes — o usuário não sabe disso ao escolher. Quem muda de região por curiosidade volta e vê providers diferentes, moeda diferente, e provavelmente não consegue reverter pro estado anterior de forma intuitiva. A tela de seleção de token (5) lista o mesmo token em múltiplas redes como entradas planas — USDC, USDC (Base), USDC (Unichain) — com distinção apenas por badge minúsculo no ícone. O iniciante não tem modelo mental de "mesmo token em redes diferentes"; escolhe o que vem primeiro, que pode ser a rede errada para como pretende usar o token depois. Nas duas telas, a decisão é irreversível sem recomeçar o fluxo, e a consequência só aparece depois do clique.
Por que solução óbvia falha: renomear para "USDC (Base) / USDC (Unichain)" resolve o display mas não resolve o modelo mental — o usuário ainda não sabe qual rede quer porque essa decisão depende de onde pretende usar o token depois, uma informação que o produto não coletou.
Direcionamento Kotai: tratar as duas escolhas como decisões de primeira classe. Na seleção de região (4), mostrar prévia da consequência inline — "Brasil: MoonPay, El Dorado · PIX, cartão · BRL". Na seleção de token (5), separar "qual token" de "em qual rede" em dois passos com recomendação contextual ("Recomendado pra iniciantes: Base — gas mais baixo"). Trade-off: dois passos em vez de um na seleção de token; lista mais densa na seleção de região.
Perfil mais afetado: iniciante em ambos os casos.
Na tela de handoff (7), o usuário é despachado para nova aba com o copy "Acesse a aba MoonPay para continuar. Você já pode fechar este modal." Sem nenhum estado intermediário persistente no app principal, quem fecha a aba errada, demora no KYC, ou paga e não vê a cripto chegar imediatamente fica sem ponto de verificação dentro do Uniswap. O copy "você já pode fechar este modal" pode ser lido como "tudo certo, segue sozinho" — mas o produto não tem mais nada a oferecer. A leitura de "não bloquear o usuário = respeitar o usuário" não se sustenta: o modal não diz "roda em background"; diz "eu encerrei minha parte, vai lá". É fim de handoff visível, não respeito ao usuário.
Direcionamento Kotai: manter faixa persistente de "compra em andamento via [provider]" visível no app principal com último status e link para retomar. Mesmo sem webhook real-time, "Iniciada às 14:32 — aguardando confirmação. Pode levar até 30 min." reduz o vácuo de ansiedade. Trade-off: depende de polling ou webhook do provider; estado pendente tem custo de manutenção; cobertura menor de providers no v1 em troca de maior profundidade nos que suportam integração adequada.
Perfil mais afetado: iniciante — é quem tem maior ansiedade entre "paguei" e "recebi" e menor repertório para diagnosticar o que aconteceu.
Padrão atual da indústria: Uniswap, MetaMask Portfolio, 1inch fiat — todos plugam on-ramp dentro do shell do swap sem avisar que existe um provider terceiro com KYC, fee própria e cotação independente (3). Todos mostram providers sem fee comparável — o usuário escolhe entre MoonPay e El Dorado sem saber que um pode custar 4% e outro 9% pelo mesmo método PIX (6). Todos desaparecem após o handoff — o app nativo não rastreia o estado da compra externa (7).
Por que afeta nosso target: o iniciante é quem mais usa on-ramp (ainda não tem cripto) e é quem tem maior ansiedade financeira no processo. Pagar fiat por algo que "desapareceu" entre o clique e o recebimento é a experiência mais propensa à desistência e ao não-retorno.
Hipótese de diferenciação Kotai: (1) badge "via parceiro fiat" visível desde a tab Comprar, com nome do provider e microcopy de uma linha ("taxas entre 3%–7%, KYC obrigatório na primeira compra"); (2) tela de seleção de provider como comparação real — ranking por fee para o método selecionado, não por ordem comercial; (3) faixa persistente de "compra em andamento via [provider]" no app principal até confirmação ou timeout explícito com instrução de suporte.
Trade-off: (1) e (2) tensionam relação comercial com providers — MoonPay e Coinbase preferem aparecer após o clique e sem comparação direta de fee; (3) exige integração com webhook ou polling, reduzindo cobertura de providers no v1.
Passa nas 4 perguntas-teste? (1) ✓ Todos os concorrentes principais fazem igual. (2) ✓ Afeta iniciante diretamente — on-ramp é a porta de entrada do iniciante no DeFi. (3) ✓ Razão de ninguém ter resolvido: relação comercial com providers + falta de investimento em integração, não impossibilidade técnica. (4) ✓ "O app me acompanhou até o fim" vs "o app me empurrou pra um lugar estranho" é diferença altamente perceptível.
Padrão atual da indústria: Uniswap, PancakeSwap, Jupiter, 1inch — todos listam o mesmo token em múltiplas redes como entradas planas na mesma lista, com distinção apenas por badge de rede minúsculo no ícone (5). O modelo implícito pressupõe que o usuário sabe o que é "rede" e qual escolher.
Por que afeta nosso target: "token em rede errada" é a causa #1 de "perdi minha cripto" quando na verdade o ativo está em rede que o usuário não sabe acessar. Iniciante que compra USDC achando "quero stablecoin" e recebe USDC na mainnet, mas usa só Base, fica com token que não consegue usar sem pagar gas de bridge que não entende.
Hipótese de diferenciação Kotai: separar "qual token" de "em qual rede" em duas etapas sequenciais. Após escolher USDC, exibir seleção de rede com recomendação contextual ("Recomendado pra iniciantes: Base — gas mais baixo" ou "Você usa Base com mais frequência"). Para usuário avançado, campo de busca direta mantém velocidade ("USDC Base").
Trade-off: dois passos em vez de um aumenta cliques; contraria a convenção visual atual da indústria; exige curadoria de qual rede recomendar por contexto de usuário e histórico de uso.
Passa nas 4 perguntas-teste? (1) ✓ Todos os concorrentes fazem igual — lista plana com badge sutil. (2) ✓ Afeta iniciante diretamente — causa perda de token perceptível e irrecuperável sem suporte externo. (3) ✓ Razão de ninguém ter resolvido: assumir conhecimento prévio + falta de investimento em fluxo de 2 passos, não impossibilidade técnica. (4) ✓ Usuário perceberia — "onde você quer usar esse token depois?" é uma pergunta que muda o resultado da compra de forma concreta e imediata.

O fluxo de Carteira Conectada é o mais abrangente do produto — cobre desde o estado de saldo zero até multi-wallet cross-chain, passando por um bloco completo de configurações e um sub-fluxo de transferência via exchange. Como um todo, o produto acerta na postura pró-segurança: defaults protetores, hierarquia de configurações bem estruturada e uso consistente da superfície de interação para orientar em vez de desabilitar silenciosamente (1, 11). O atrito se concentra em dois padrões estruturais que atravessam o fluxo inteiro: léxico que exige modelo mental que o iniciante ainda não tem, e affordances que nivelam ações de risco diferente. O perfil mais afetado é o iniciante BR vindo de exchange centralizada — que é justamente onde o maior diferencial competitivo pode ser construído.
Em vez de desabilitar silenciosamente ou emitir erro genérico, o produto usa a própria superfície de interação para orientar. O botão do widget de swap vira "Adicionar fundos para fazer swap" quando o saldo é zero (#1). O feedback pós-limpeza substitui o card de ação no mesmo slot, sem deslocar o contexto (#9). O banner de modo testnet persiste no topo da sidebar a cada olhada para o painel (#11). O modal de handoff para a Coinbase avisa que fechar não cancela a operação (#15). É o padrão mais consistente do fluxo — heurística a replicar em todo estado bloqueado com solução conhecida.
Três momentos distintos em que o produto usa uma frase literal e curta para antecipar o medo ou explicar a consequência da escolha: "sua frase de recuperação NÃO será removida" (#5), "tokens em testnets não têm valor real" (#10), "isso determinará o endereço da carteira na qual você receberá os fundos" (#14). O que torna esse padrão eficaz é a literalidade — sem jargão, sem abstração. Vale como régua: em toda decisão onde o erro custa dinheiro ou acesso, uma frase dizendo o que vai (e o que não vai) acontecer vale mais que qualquer ícone de aviso.
O produto assume postura pró-segurança por default antes de qualquer ação do usuário. Configurações organizadas em três níveis — uso cotidiano, privacidade e avançado — mantêm o que é perigoso longe do que é cotidiano (#2). Filtros de segurança (pequenos saldos, tokens desconhecidos, atividade reportada) todos ligados (#3). Ações de limpeza granular disponíveis antes do botão de wipe total (#4). O iniciante é protegido antes de saber que precisa ser. Note-se, porém, que este padrão falha na execução de detalhes visuais — veja fricção estrutural de affordances nivelados.
A separação "Minhas carteiras" vs "De uma conta" no modal de recebimento (#12) e o card próprio para transferência de exchange (#13) comunicam visualmente que carteira e exchange são entidades diferentes — justamente o modelo mental que o iniciante ainda não formou. É uma decisão arquitetural acertada que resolve uma confusão real sem precisar de tooltip ou onboarding explicativo. Vale replicar como padrão de organização em qualquer tela de origem de fundos.
A sessão suporta uma carteira EVM e uma Solana simultaneamente, dispensando o usuário de "escolher um mundo" (#17). O popover expõe as duas carteiras lado a lado como prova visual de quais identidades estão ativas (#18). Vale adotar como premissa de arquitetura no Kotai desde o início — multi-chain não é feature a adicionar depois, é decisão de modelo de dados que precisa estar na fundação.
O padrão mais recorrente do fluxo — aparece em 5 telas e manifesta-se de formas diferentes, mas com a mesma causa raiz: o produto usa léxico que exige conhecimento que é exatamente o que falta no target principal.
Na tela de estado base (#1), "Receber criptos" e "Transferência" descrevem o mesmo cenário para quem ainda não sabe que exchange ≠ carteira. No painel de filtros (#3), "tokens desconhecidos" oculta saldos sem expor o critério — o iniciante que recebeu um token legítimo de fonte confiável conclui que o app "sumiu" com o saldo. No modal de recebimento (#12), endereços hexadecimais truncados sem rótulo amigável obrigam o usuário a reconhecer a própria carteira pelo hash. Na seleção de rede para saque (#14), "Ethereum (+17 redes)" não diz quais dessas 17 a exchange suporta nem qual custa menos — o usuário que escolhe "Ethereum" pensando em Base paga uma taxa dezenas de vezes maior. Na tela de QR (#16), o título "Endereço de Ethereum" conflita com o badge "18 redes", fazendo o iniciante hesitar em mandar USDC em Base para um "endereço de Ethereum".
Perfil mais afetado: iniciante em todas as manifestações; intermediário nas telas de rede (#14 e #16).
Direcionamento Kotai: tratar como problema de naming system, não de correção pontual por tela. Decisões que resolvem em cascata: (a) nomear os caminhos de funding pelo cenário concreto ("De uma exchange", "De outra carteira", "Comprar com cartão ou Pix"); (b) expor o critério de filtro em uma linha ("ocultos: tokens fora da lista oficial com pouca liquidez") com contador de ocultos; (c) rotular endereços com nome amigável ("Sua carteira EVM") e o hash como subtexto; (d) expandir as redes por extenso nos pontos de escolha críticos. Trade-off: rótulos mais longos e manutenção de lista de redes atualizada — custo operacional real, mas que elimina o atrito mais recorrente do fluxo. As correções (a)–(d) ganham mais força como naming system coeso em todo o produto do que como correções pontuais por tela.
O segundo padrão estrutural do fluxo — também em 5 telas. O produto trata sistematicamente ações de risco diferente com o mesmo affordance visual, diluindo progressivamente o sinal de risco.
Na tela de dados do aplicativo (#4), o botão "Limpar todos os dados" recebe mais destaque que as ações granulares — o mais perigoso é o mais convidativo. O modal de limpar cache (#7) — ação reversível — recebe o mesmo template solene, a mesma frase de seed phrase e o mesmo botão rosa do modal de wipe total (#8) — ação irreversível. O botão de confirmação de ambos é "Limpar dados" em rosa de marca (#5), sem diferenciação de cor nem de rótulo pelo escopo. No dropdown de carteira (#17), "Alterar carteira" e "Desconectar sessão" aparecem com o mesmo peso visual — apenas o ícone vermelho diferencia.
O efeito acumulado é pior que qualquer instância individual: quando tudo soa igualmente solene, o aviso real perde força. O usuário treina a si mesmo a ignorar os modais.
Perfil mais afetado: iniciante que veio resolver um bug pequeno (limpar cache) e está propenso ao clique rápido; intermediário com histórico acumulado que perde tudo no wipe.
Direcionamento Kotai: três níveis de peso diferenciados por risco: (1) ação leve (cache, trocar carteira) → inline ou modal simples sem frase de seed phrase; (2) ação irreversível específica (limpar histórico, limpar preferências) → modal com rótulo específico no botão ("Limpar histórico", "Limpar preferências") e botão destrutivo em vermelho; (3) wipe total → modal destrutivo em vermelho + interação adicional (checkbox "entendo que vou perder tudo" ou segurar botão). Trade-off: perde-se simetria visual entre modais, mas o usuário aprende a diferença de risco pelo próprio peso da interação.
O botão de confirmação chama-se "Limpar dados" nos quatro modais de limpeza — o mesmo rótulo genérico para quatro escopos diferentes (#5). No modal de preferências (#6), o problema se estende: a descrição não retoma os itens que serão perdidos, dependendo da memória do passo anterior. Correção direta: rotular o botão pelo escopo específico ("Limpar histórico", "Limpar preferências", "Limpar cache", "Apagar tudo") e repetir os itens afetados na descrição. Trade-off menor de simetria visual — vale.
Padrão atual da indústria: DEXs globais integram Coinbase, quando muito. O fluxo de trazer fundos de exchange exige que o usuário copie o endereço da carteira, escolha a rede no painel da exchange (sem orientação de custo ou compatibilidade), inicie o saque e espere — sem feedback de status no DEX. Para o mercado BR, onde Coinbase é minoritária, o único card disponível em #13 equivale, na prática, a não ter integração nenhuma.
Por que afeta nosso target: O iniciante BR vem da Binance, Mercado Bitcoin, Foxbit ou Bybit. O primeiro funding é a barreira mais concreta entre ele e a primeira operação real. Hoje ele enfrenta: escolher rede sem ver o custo (#14), copiar endereço hexadecimal sem confirmação de compatibilidade, e voltar ao DEX sem nenhum feedback de status (#15).
Hipótese de diferenciação Kotai: Card "Trazer da minha exchange" na sidebar → seleção da exchange (Binance, Mercado Bitcoin, Foxbit, Bitso, Bybit) → tela com endereço de destino, rede recomendada, taxa estimada de saque naquela exchange e tempo médio de chegada → polling do endereço após o usuário sair para completar o saque → chip de status na sidebar ("Transferência em andamento — ETA ~5 min") que desaparece quando o saldo entra. Posicionamento implícito: enquanto a Uniswap é a ponte para o mercado EUA, o Kotai é a ponte LatAm.
Detalhe — Seleção de rede: No passo de escolha de rede, mostrar ao lado de cada opção a taxa estimada de saque (puxada da exchange integrada) e o tempo médio de chegada, com sugestão de rede "recomendada" (melhor balanço custo/tempo). Exemplo: "Base — ~US$ 0,30 • ~30s" vs "Ethereum — ~US$ 12 • ~3 min". O usuário sai do fluxo entendendo o porquê de uma escolha sobre a outra — diferencial que transforma um risco de erro caro em decisão informada.
Trade-off: Cada integração tem custo de manutenção — APIs mudam, UIs das exchanges mudam, suporte aumenta. A profundidade (taxa estimada em tempo real, polling de chegada) é proporcionalmente mais cara que o básico (endereço + instrução). Recomendação: lançar com o básico para as 3-4 exchanges mais relevantes ao BR e iterar com profundidade conforme adoção.
Passa nas 4 perguntas-teste?
Função: Popover que aparece sobre o avatar da sidebar e expõe, lado a lado, as duas carteiras conectadas na sessão (EVM e Solana) com seus endereços e atalhos.
Componentes
Regras de negócio
🟢 Insight Expor as duas carteiras em uma única visualização rápida resolve um problema real: em um mundo multi-chain, o usuário precisa de prova visual de quais identidades estão ativas naquele momento. Vale adotar como elemento permanente da sidebar.
^insight-1
🔴 Fricção real O popover lista as duas carteiras mas não sinaliza qual delas está conectada à operação que o usuário está prestes a fazer. Se o widget está em modo "swap de USDC (Base) para SOL (Solana)", as duas carteiras estão em jogo — uma assina a saída em Base, a outra recebe em Solana. Sem badge ou highlight, o usuário não consegue conferir, no ato, se o roteamento está usando as identidades corretas.
Perfil mais afetado: intermediário operando cross-chain.
Direcionamento Kotai: no popover (e no header da sidebar), marcar visualmente a(s) carteira(s) envolvida(s) na operação corrente — badge "De" na carteira de origem, "Para" na carteira de destino, ou highlight de borda nas duas quando a operação for cross-chain. Trade-off: o popover ganha estado dependente do widget, mas o usuário consegue auditar o roteamento sem abrir confirmação.
^friccao-1
🟡 Oportunidade competitiva Não qualifica isoladamente. A indicação de carteira ativa é refinamento que entra junto da experiência cross-chain, que tem sua própria oportunidade qualificada no relatório de mega menu (rede default + agregação multi-chain).
^oportunidade-1
Função: Tela com QR code e endereço completo da carteira EVM, acessada ao clicar em uma das carteiras próprias no modal "Receber criptos".
Componentes
Regras de negócio
🟢 Insight A combinação QR + endereço em texto + copiar + compartilhar é a redundância correta — cada usuário escolhe o canal de menor fricção (escanear no celular, colar em outra aba, mandar pra alguém). Pattern a replicar em qualquer tela de "recebe um identificador".
^insight-1
🔴 Fricção real O título diz "Endereço de Ethereum" mas o badge embaixo do endereço diz "18 redes". Para o iniciante, o conflito é direto: se é endereço de Ethereum, por que vale para 18 redes? E mais perigoso: alguém que vai mandar USDC em Base para esse endereço pode hesitar e desistir, achando que o endereço é só de mainnet Ethereum. A ambiguidade entre "Ethereum (a rede)" e "Ethereum (a família EVM)" trava o fluxo.
Perfil mais afetado: iniciante e intermediário que ainda não internalizou que EVM ≠ mainnet.
Direcionamento Kotai: trocar o título para "Endereço EVM" ou "Endereço Ethereum-compatível" e, abaixo do QR, listar 3-4 redes principais por extenso ("Ethereum, Base, Arbitrum, Polygon e +14") com link expandível para a lista completa. Trade-off: "EVM" é jargão, mas dá um nome consistente para a família e elimina a contradição visual com o badge.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Renomear título e expandir lista é correção de copy, não tese.
^oportunidade-1


Função: Estado da carteira conectada após ativar o modo testnet — a sidebar passa a sinalizar o modo no topo e os dados (saldo, atividade) refletem a rede de teste.
Componentes
Regras de negócio
🟢 Insight O banner persistente no topo da sidebar é a ancora visual correta: sempre que o usuário olha para o painel da carteira, lembra do modo em que está. Pattern obrigatório para qualquer modo que altere a interpretação dos valores na tela.
^insight-1
🔴 Fricção real (duas frentes)
O banner é verde com check. Verde + check é, em qualquer biblioteca de design, sinal de "sucesso/seguro/tudo certo" — o oposto da mensagem que se quer passar. O iniciante lê o banner como confirmação positiva ("meu app está ok") em vez de aviso de ambiente alternativo. Amarelo/âmbar comunicaria "atenção, contexto diferente" sem soar como erro.
O CTA do widget central muda de "Adicionar fundos para fazer swap" para "Selecione um token" — o app deixa de orientar para o próximo passo real, que em testnet é pegar tokens de faucet. O usuário entra em modo testnet, vê tudo zerado, e não tem nenhum caminho indicado para chegar a tokens. Beco sem saída.
Perfil mais afetado: iniciante que ligou testnet por curiosidade ou seguindo tutorial.
Direcionamento Kotai: trocar a cor do banner para âmbar e manter o ícone de raio; quando em testnet, o CTA do widget central deve apontar para "Pegar tokens de teste em [Sepolia faucet]" com link direto ou modal explicativo. Trade-off: comprometemo-nos a manter referências de faucet por rede (custo de curadoria), mas eliminamos o ponto morto.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Público do Kotai não vai usar testnet como caminho principal; o ajuste é higiene para os poucos que entrarem.
Observação adicional O toggle de "Modo testnet" estar em Configurações > Avançado é correto — esconde da área de uso cotidiano. Mas vale lembrar, no roadmap, que se o Kotai for fazer onboarding com tutorial interativo, vale ter uma rota separada de "simulação" sem usar a infraestrutura de testnet real.
^oportunidade-1
Função: Modal que dispara ao ligar o toggle "Modo testnet" em Configurações, explicando o que esse modo significa antes que o usuário siga operando.
Componentes
Regras de negócio
🟢 Insight A frase "tokens em testnets não têm valor real" é o tipo de disclaimer que funciona porque é literal e curto. Pattern a replicar para qualquer modo em que o usuário pode confundir representação com realidade financeira (sandbox, preview, paper trading).
^insight-1
🔴 Fricção real O modal tem só um botão ("Fechar") e o modo já foi ativado antes da explicação aparecer. Para o iniciante que ligou o toggle por curiosidade e leu o aviso, "Fechar" sugere cancelar a ação, mas o resultado é o oposto: ao fechar, ele continua em testnet. Não há "Sair do modo testnet" no modal — desligar exige voltar ao toggle.
Perfil mais afetado: iniciante explorando Configurações sem intenção real de usar testnet.
Direcionamento Kotai: oferecer dois CTAs no modal — "Continuar em testnet" (primário) e "Sair do modo testnet" (secundário) — para que ler o aviso e desistir seja um clique, não uma navegação reversa. Trade-off: o modal deixa de ser puramente didático e vira um ponto de decisão real, o que é precisamente o que se quer para um modo com efeitos colaterais visíveis.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Dois CTAs no modal é correção de UX, não tese.
^oportunidade-1

Função: Passo seguinte ao escolher Coinbase no modal de transferência. O usuário precisa decidir em qual rede (EVM agregada ou Solana) os fundos serão enviados.
Componentes
Regras de negócio
🟢 Insight O microcopy "Isso determinará o endereço da carteira na qual você receberá os fundos" explica o porquê da escolha, não só pede escolha. Em uma decisão onde o erro custa dinheiro, a frase preventiva é o ponto de UX mais importante da tela. Vale internalizar: toda escolha de rede no produto precisa de uma frase curta dizendo o que muda — não basta listar as opções.
^insight-1
🔴 Fricção real "Ethereum (+17 redes)" continua opaco no momento mais crítico do fluxo. O usuário acaba de aceitar um termo da Coinbase e está prestes a sacar — mas não sabe quais das 17 redes a Coinbase efetivamente suporta para esse saque, qual é a mais barata, qual é a mais rápida. Se ele escolher "Ethereum" pensando em Base, e a Coinbase só enviar via mainnet Ethereum, paga uma taxa de saque dezenas de vezes maior — e nada na tela alerta para isso.
Perfil mais afetado: iniciante e intermediário pouco familiarizado com diferenças entre L1 e L2.
Direcionamento Kotai: expandir as redes explicitamente (Ethereum, Base, Arbitrum, Optimism, Polygon…) com taxa estimada de saque e tempo médio de chegada ao lado de cada uma, puxando os dados do provedor da CEX e do gas atual. Trade-off: requer integração mais profunda com as exchanges suportadas (não só endereço, mas tabela de saque), mas torna a decisão auditável no ato.
^friccao-1
🟡 Oportunidade competitiva Qualifica em escopo modesto. (1) Resolve fricção real e cara: a escolha errada de rede em saque de CEX é um dos erros mais comuns e caros do onboarding. (2) Não é commodity: hoje praticamente todos os fluxos de CEX-to-wallet pedem a rede sem mostrar custo. (3) Defensável: depende de integração com tabela de fees por exchange e leitura de gas atual. (4) Não é cosmético: muda o custo real da operação.
Forma Kotai: no momento da escolha de rede, mostrar "Base — taxa ~US$ 0,30 • ~30s" vs "Ethereum — taxa ~US$ 12 • ~3 min". Sugerir uma rede como "recomendada" com base no balanço de custo e tempo. Diferencial: o usuário sai do fluxo entendendo o porquê de uma escolha sobre a outra, não apenas qual clicar.
^oportunidade-1

Função: Modal final do fluxo de transferência via Coinbase. Avisa o usuário que a operação foi delegada para uma nova aba e que ele pode fechar o modal sem prejudicar a transação.
Componentes
Regras de negócio
🟢 Insight Deixar claro que o modal pode ser fechado sem perder a transação é gentileza com o usuário em handoff async. Pattern a manter sempre que houver passagem de fluxo para outro sistema/aba.
^insight-1
🔴 Fricção real (duas frentes)
Não há link/CTA "Abrir Coinbase" no modal. Se o navegador bloqueou o popup, o usuário entende que precisa ir à Coinbase, mas o caminho é manual — abrir aba, fazer login, achar a operação pendente. Para iniciante com pouca prática de gerenciar abas, é exatamente onde a transação some.
Depois que o usuário fecha o modal, o Uniswap não dá nenhum feedback sobre o estado do saque (quanto está chegando, ETA, status). Quem volta à sidebar minutos depois sem ver alteração no saldo fica sem saber se a operação está em andamento ou se travou.
Perfil mais afetado: iniciante.
Direcionamento Kotai: oferecer botão primário "Abrir Coinbase em nova aba" (re-fire do popup), e, ao fechar o modal, expor um chip de status na sidebar ("Transferência em andamento via Coinbase — ETA ~5 min") que polla o endereço de destino e desaparece quando o saldo entra. Trade-off: exige polling e estado persistente, mas fecha o ciclo que hoje termina em silêncio.
^friccao-1
🟡 Oportunidade competitiva Não qualifica isoladamente. Status pós-handoff é refinamento que entra junto com a oportunidade qualificada no relatório 13 (integração com exchanges BR).
^oportunidade-1
Função: Menu de ações sobre a carteira ativa, aberto ao clicar no avatar/endereço no topo da sidebar. Permite trocar a carteira de cada cadeia (EVM e Solana) ou desconectar a sessão inteira.
Componentes
Regras de negócio
🟢 Insight O próprio fato de existir multi-wallet por cadeia (EVM e Solana coexistindo) é o ponto forte: dispensa o usuário de "escolher um mundo" e libera o produto para operar cross-chain de verdade. Vale adotar como premissa de arquitetura no Kotai.
^insight-1
🔴 Fricção real (duas frentes)
As três opções aparecem com o mesmo peso visual, mas "Alterar" é uma troca reversível e "Desconectar" é o término da sessão (irreversível sem reauth). Apenas o ícone vermelho diferencia. Sem divider ou agrupamento, o iniciante que quer só trocar de MetaMask pode clicar em "Desconectar" achando que volta para a tela de seleção de carteira.
"Alterar carteira Ethereum" é um verbo abstrato. O usuário não sabe se vai abrir a lista de carteiras conectadas, se vai re-abrir o pop-up do MetaMask, se vai trocar para outra carteira instalada, ou se vai desconectar e pedir nova conexão. "Trocar para outra carteira EVM" seria explícito.
Perfil mais afetado: iniciante.
Direcionamento Kotai: separar visualmente "trocar" de "desconectar" (divider + label "Sessão" antes do destrutivo), e usar verbos concretos: "Trocar carteira EVM" / "Trocar carteira Solana" / "Encerrar sessão". Trade-off: rótulos mais longos, mas o usuário sabe o que vai acontecer no clique.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Multi-wallet por cadeia é commodity emergente; a separação visual entre trocar e desconectar é correção.
^oportunidade-1









Função: Painel de configurações do aplicativo/carteira, aberto sobre a sidebar, com preferências de uso, controles de privacidade e opções avançadas.
Componentes
Regras de negócio
🟢 Insight Hierarquia em três seções (uso → privacidade → avançado) reduz overwhelm e mantém o que é perigoso (testnet, reset de dados) longe do que é cotidiano (tema, idioma). Vale replicar como template padrão de tela de configurações.
^insight-1
🔴 Fricção real Dois defaults inconsistentes com o perfil do usuário PT-BR:
Perfil mais afetado: iniciante PT-BR, que provavelmente não vai abrir Configurações no primeiro uso e vai operar com defaults desalinhados.
Direcionamento Kotai: derivar moeda e idioma do locale do navegador na primeira sessão (pt-BR → BRL + Português), com prompt curto na primeira entrada confirmando a escolha. Para análise, opt-in explícito com uma linha sobre o que é coletado ("comportamento de uso, sem chaves ou endereços"). Trade-off: menos dados de produto coletados no agregado, mas confiança maior e alinhamento com expectativa de privacidade do público-alvo brasileiro.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Painel de configurações em sidebar é boa prática estabelecida; o que muda são os defaults, que entram como fricção a corrigir, não como diferenciação.
^oportunidade-1


Função: Sub-tela de Configurações que controla o que aparece no portfólio e no feed de atividade, removendo ruído e ameaças comuns na cadeia (airdrops maliciosos, dust, spam).
Componentes
Regras de negócio
🟢 Insight A decisão de ligar tudo por padrão é o ponto forte: o iniciante é protegido de dust attacks e airdrops maliciosos antes mesmo de saber que eles existem. Padrão a manter — o usuário só descobre o controle se quiser desligá-lo, e o desligamento é a opção que exige escolha consciente.
^insight-1
🔴 Fricção real "Tokens desconhecidos" é uma categoria opaca: o critério (lista oficial? volume? idade do contrato?) não é dito em lugar nenhum. Um token novo e legítimo (lançamento recente, projeto BR de nicho) pode ser ocultado sem que o usuário entenda por quê — e, se ele recebeu o token de uma fonte de confiança, vai concluir que o app "sumiu" com o saldo.
Perfil mais afetado: intermediário que acompanha lançamentos.
Direcionamento Kotai: tornar a regra explícita em uma linha ("ocultos: tokens fora da lista oficial e com pouca liquidez") e exibir um contador ("3 tokens ocultos — ver lista") em vez de simplesmente sumir com o ativo. Trade-off: adiciona um link no portfólio, mas dá ao usuário um caminho para auditar o filtro sem precisar desligá-lo globalmente.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Filtros default ON são padrão emergente em DEXs e wallets sérias; o que falha é transparência do critério, que entra como fricção a corrigir.
^oportunidade-1
Função: Sub-tela que permite limpar diferentes camadas do storage local do app — histórico, preferências, cache ou tudo de uma vez.
Componentes
Regras de negócio
🟢 Insight A granularidade é o ponto forte: limpar cache para destravar preço/cotação é caso comum, e a maioria dos apps obriga o "reset tudo". Aqui a microcopy de cada ação explicita o impacto antes do clique — combinação que reduz medo e elimina suporte por mensagens do tipo "limpei e perdi meus favoritos".
^insight-1
🔴 Fricção real O botão "Limpar todos os dados" recebe o maior peso visual da tela (contorno escuro, sólido, ícone de lixeira), enquanto as ações granulares — que são as recomendadas no dia a dia — ficam discretas. A hierarquia visual está invertida em relação ao risco: a opção mais perigosa é a mais convidativa ao clique.
Perfil mais afetado: iniciante que veio aqui para resolver um bug pequeno e clica no botão mais saliente.
Direcionamento Kotai: inverter a hierarquia — as ações granulares como cards primários e "Limpar tudo" como link discreto ao final, com aviso explícito de irreversibilidade. Trade-off: o caminho de wipe completo fica menos óbvio, mas é exatamente o caminho que se quer dificultar.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Granularidade de reset é boa prática, não diferenciação; e o ajuste de hierarquia é correção, não tese de produto.
^oportunidade-1
Função: Modal de confirmação dupla antes de apagar o histórico local de contas (transações, saldos, pesquisas, notificações).
Componentes
Regras de negócio
🟢 Insight A frase "frase de recuperação NÃO será removida" é o ponto-chave. Ela ataca o medo concreto (perder acesso à carteira) em vez de dar um aviso genérico. Replicar como heurística: em todo modal destrutivo, declarar explicitamente o que NÃO acontece, não só o que acontece.
^insight-1
🔴 Fricção real O botão de confirmação se chama "Limpar dados" — rótulo genérico que repete em todos os quatro modais (histórico, preferências, cache, tudo). Como os modais têm o mesmo layout e cor, o usuário que reabre o modal depois de cancelar não tem como saber, só pelo botão, qual escopo está prestes a confirmar. A informação fica toda no título.
Perfil mais afetado: iniciante e qualquer usuário em fluxo apressado.
Direcionamento Kotai: rotular o botão pela ação específica ("Limpar histórico", "Limpar preferências", "Apagar tudo"). Trade-off: perde-se simetria visual entre modais, mas o botão passa a carregar a informação que hoje só está no título — e o gesto fica auditável até no print.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Confirmação dupla é padrão; o rótulo do botão é correção.
^oportunidade-1



Função: Modal de confirmação para limpar dados temporários (preços de token, dados de cotação, payloads em memória).
Componentes
Regras de negócio
🟢 Insight O ícone de storage é o mais claro da série — comunica diretamente "dados temporários". Bom ponto de referência para revisar os outros ícones da família.
^insight-1
🔴 Fricção real Limpar cache é uma ação reversível por natureza — o cache volta a ser preenchido no próximo carregamento. Mesmo assim, o modal usa o mesmo template e a mesma frase de tranquilização sobre a seed phrase usada para histórico e preferências (que são destrutivas). Isso, no agregado, dilui o sinal: se TUDO precisa do mesmo aviso solene, o aviso perde força quando importa de verdade (no modal 8, limpar tudo).
Perfil mais afetado: usuário recorrente que precisa limpar cache para corrigir cotação travada e é forçado a passar por um modal de tom dramático.
Direcionamento Kotai: tratar limpar cache como ação leve — pode ser um toast inline ("Cache limpo") sem modal, ou um modal mais simples sem o aviso sobre seed phrase. Reservar o template solene para ações de fato destrutivas. Trade-off: menos consistência visual entre modais, mas o usuário aprende a diferença de risco pelo próprio peso da interação.
^friccao-1
🟡 Oportunidade competitiva Não qualifica.
^oportunidade-1
Função: Estado pós-conexão com saldo zero. A sidebar deixa de ser "conectar/baixar" e passa a ser o painel da carteira do usuário, com onboarding explícito para colocar fundos antes de operar.
Componentes
Regras de negócio
🟢 Insight O CTA do widget de swap muda contextualmente para "Adicionar fundos para fazer swap" em vez de simplesmente desabilitar com um erro. O próprio botão vira a próxima ação útil — padrão a replicar sempre que houver bloqueio com solução conhecida ("Aprovar token", "Trocar de rede", "Conectar carteira").
^insight-1
🔴 Fricção real Os rótulos "Receber criptos" e "Transferência" descrevem ações quase idênticas para quem está começando — ambos são "alguém me manda cripto". A distinção "outra carteira" vs "plataforma de negociação" exige que o usuário já tenha o modelo mental de que exchange (Binance, Coinbase) é uma coisa diferente de carteira (MetaMask, Trust), o que é justamente o conhecimento que falta no iniciante.
Perfil mais afetado: iniciante vindo de exchange centralizada.
Direcionamento Kotai: nomear pelo cenário concreto ("De uma exchange (Binance, Coinbase, Mercado Bitcoin)" / "De outra carteira (MetaMask, Trust, Phantom)" / "Comprar com cartão ou Pix"). Trade-off: rótulos mais longos e menos elegantes, mas a curva de aprendizado da diferença carteira-vs-exchange é eliminada do ato de transferir.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Onboarding de funding em três caminhos é commodity de DEX; o que diferencia é o rótulo, que entra como fricção a corrigir.
^oportunidade-1







Função: Modal de confirmação para reset de preferências (favoritos, configs de swap, avisos de token, idioma e moeda).
Componentes
Regras de negócio
🟢 Insight Consistência visual entre modais destrutivos reduz carga cognitiva e cria expectativa estável ("é o mesmo padrão de sempre, sei o que esperar"). Vale manter.
^insight-1
🔴 Fricção real O ícone de usuário não comunica "preferências". Para iniciante, silhueta de pessoa sugere conta, identidade ou perfil — exatamente o tipo de associação que faz ele hesitar pensando que vai apagar sua carteira. E, diferente do modal anterior, a descrição não retoma o que foi listado na tela 4 ("favoritos, idioma, moeda…"), então quem chega direto pelo botão precisa lembrar.
Perfil mais afetado: iniciante.
Direcionamento Kotai: trocar o ícone por algo que sinalize ajustes (engrenagem pequena, sliders, estrela para favoritos) e repetir, na descrição, os itens que serão limpos ("favoritos, idioma, moeda, avisos"). Trade-off: descrição mais longa, mas elimina a memória dependente do passo anterior.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Refinamento de ícone e copy.
^oportunidade-1
Fluxo funcionalmente completo e visualmente coerente, mas com tensão central que está presente em quatro das seis telas: a hierarquia de opções serve aos objetivos comerciais do produto (distribuição da Uniswap Wallet) e não ao perfil de quem está chegando. O iniciante — que tipicamente chega com MetaMask de tutorial do YouTube — encontra sua carteira subordinada visualmente (1), o momento crítico de autorização em inglês (3), e jargão técnico sem tradução para benefício (3, 4). A única exceção ao padrão é o badge "Detectada" na tela 6, que sinaliza o caminho certo (6) mas não tem poder hierárquico para competir com o destaque rosa da wallet proprietária (6). Perfil mais afetado: iniciante e retornante intermediário.
O drawer lateral (1) mantém o widget de swap visível enquanto o usuário decide como conectar. O padrão se repete no modal do QR proprietário (2), onde a sidebar continua atrás. Decisão discreta mas poderosa: o usuário nunca perde o fio do que estava fazendo. Vale adotar como princípio para qualquer modal ou passo intermediário no produto.
QR rosa branded (2) e badge "Detectada" (6) são o mesmo padrão aplicado em contextos diferentes: um sinal visual específico que reduz dúvida e acelera a decisão sem exigir leitura. O QR diz "é este produto, não um QR genérico de phishing"; o badge diz "esta aqui funciona, é só clicar". Princípio generalizável para qualquer ponto do produto onde múltiplas opções concorrem.
O destaque visual rosa permanece na "Baixar Uniswap Wallet" independentemente do contexto do usuário. Na tela 1 (1), sem qualquer carteira instalada, o CTA ainda é "baixar novo produto" — não "qual carteira você já tem?". Na tela 6 (6), com três carteiras detectadas no navegador (Trust Wallet, MetaMask, Brave Wallet), a hierarquia visual não muda: o destaque rosa continua promovendo o produto da casa, e as carteiras que o usuário já tem ficam subordinadas num bloco "Outras". Para o iniciante, a mensagem implícita é "a forma certa de usar este produto é a nossa carteira". Para o retornante intermediário, é busca visual desnecessária numa tarefa de reconnect de alta intenção.
O agravante: a infraestrutura de detecção já existe — o badge "Detectada" prova isso (6). O que falta é a promoção hierárquica da carteira detectada ao topo, que não foi implementada por custo de negócio (push da wallet proprietária), não por limitação técnica. Ou seja, o produto está a meio caminho da experiência correta e parou onde a lógica comercial pede.
Solução óbvia que falha: simplesmente mover a carteira detectada para o topo sem alterar o CTA. Se o botão ainda diz "Conectar" genérico, a experiência de "o produto me reconheceu" não se materializa.
Alternativa concreta: quando houver carteira detectada, substituir o bloco topo por CTA primário contextual — "Continuar com MetaMask" — e mover as demais opções (incluindo a carteira da casa) para seção colapsada "Outras formas de conectar". Trade-off: perde-se push do produto próprio em momento de alta intenção; ganha-se velocidade de conexão e sinal implícito de "este produto trabalha a favor do usuário".
Mesmo padrão em dois pontos distintos: linguagem do sistema exposta ao usuário sem mediação. "Copy link" na tela 3 (3) não indica para que serve o link (abrir noutro device? compartilhar para si mesmo? colar numa wallet?) — iniciante vê o botão e não age. "Only WalletConnect certified" na tela 4 (4) não explica o que "certified" significa neste contexto (auditoria do protocolo? lista oficial? selo de segurança?) — na dúvida, o usuário mantém o default desligado e fica exposto a wallets não-auditadas sem saber que existe proteção opcional.
Correções são independentes e triviais em ambos os casos: "Copiar link para abrir no celular" e "Mostrar apenas carteiras auditadas + tooltip de 1 frase". Mas o padrão subjacente — copy que serve ao sistema, não ao usuário — deve ser tratado como critério de revisão no produto inteiro, não como fix pontual.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch colocam carteira proprietária ou parceira em posição de destaque na abertura do seletor de wallets, tratando as opções universais como secundárias. Uniswap vai além e apresenta dois itens proprietários antes de qualquer alternativa (1). O badge "Detectada" da tela 6 (6) indica que a Uniswap chegou perto de resolver — mas parou onde a lógica comercial exige.
Por que afeta nosso target: o iniciante chega de tutorial externo com MetaMask já instalado. Encontrar "baixe nossa carteira primeiro" antes de qualquer opção aumenta a barreira de entrada e comunica prioridade comercial onde o usuário esperava assistência técnica. O retornante intermediário, com carteira já conectada em sessão anterior, precisa fazer busca visual a cada reconnect.
Hipótese de diferenciação Kotai: seletor de carteiras ordenado por detecção no navegador — carteiras instaladas promovidas ao topo com CTA contextual ("Continuar com MetaMask"); última carteira usada no topo nas sessões seguintes; WalletConnect como fallback universal para quem não tem nada instalado; carteira proprietária (se houver) em pé de igualdade, sem destaque visual privilegiado.
Trade-off: abre-se mão da superfície de funil para distribuição de wallet própria. Sacrifício alinhado ao posicionamento pró-iniciante — e que dificilmente um concorrente com produto próprio de wallet vai replicar.
Passa nas 4 perguntas-teste?
Função: Drawer lateral à direita para escolher como conectar uma carteira.
Componentes
Regras de negócio
🟢 Insight Drawer lateral em vez de modal central é decisão correta: mantém o widget de swap visível atrás, preservando contexto do que o usuário estava fazendo antes de decidir conectar. Pequeno trunfo de continuidade.
^insight-1
🔴 Fricção (estrutural — funneling para wallet proprietária, afeta iniciante) A 1ª opção em destaque rosa é "Baixar Uniswap Wallet" — CTA para baixar produto novo, não para conectar carteira existente. A 2ª opção também é proprietária ("Aplicativo Uniswap"). As carteiras universais — WalletConnect, Coinbase, Binance, e por baixo MetaMask via WalletConnect — ficam num bloco "Outras", visualmente subordinadas. Para iniciante vindo de tutorial ou onboarding externo (que quase sempre prescreve MetaMask), a mensagem implícita é: "a forma certa de usar este produto é com a carteira do produto". Funneling soft que cobra um passo de download antes de qualquer ação. Não é affordance ruim — é hierarquia desenhada para o produto, não para o usuário.
Direcionamento para Kotai: hierarquia neutra de carteiras. Detectar carteiras instaladas no navegador e listá-las no topo (MetaMask, Phantom, Rabby...); WalletConnect como fallback universal; carteira proprietária (se houver) em pé de igualdade, não em destaque visual privilegiado.
^friccao-1
🔴 Fricção (cosmética — nomenclatura confusa) "Uniswap Wallet" e "Aplicativo Uniswap" são dois itens separados com nomes que se sobrepõem. Para iniciante, qual é qual? "Carteira" é o produto, "Aplicativo" é o canal que carrega esse produto? A diferença existe (download direto vs conectar via QR do app mobile já instalado), mas o copy não comunica.
Direcionamento para Kotai: se houver dois caminhos para o mesmo produto, nomear pelo verbo da ação do usuário ("Baixar" vs "Conectar via QR"), não pelo objeto.
^friccao-2
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch crescentemente colocam carteira proprietária ou parceira em posição de destaque na seleção de wallet, tratando as opções universais como secundárias. Para iniciante DeFi — que costuma chegar com MetaMask de tutorial do YouTube — abrir a tela e ver "baixe nossa carteira primeiro" antes de qualquer ação cria fricção desnecessária e sinal de produto que prioriza lock-in sobre experiência. Não é incompetência técnica de ninguém; é incentivo de business.
Diferenciação para Kotai: lista de carteiras ordenada por detecção no navegador ("você tem MetaMask instalado" → MetaMask no topo) e por uso prévio ("última carteira usada" → topo nas próximas sessões), com WalletConnect como entrada genérica para quem não tem nada instalado. Carteira proprietária, se vier a existir, fica em pé de igualdade — não em destaque visual.
Trade-off: abre-se mão de superfície de funil para distribuição de wallet própria. Sacrifício alinhado ao posicionamento de produto pró-iniciante.
^oportunidade-1
Função: Conectar via QR code escaneado pelo app Uniswap já instalado no celular.
Componentes
Regras de negócio
🟢 Insight QR rosa branded carrega trust signal — o usuário vê que a paleta do QR bate com a do produto que está conectando, reduzindo a chance de confusão com QR genérico de phishing colado fora de contexto. Decisão de visual que combina branding e segurança ao mesmo tempo. Manter sidebar visível atrás do modal preserva contexto do passo anterior.
Observação adicional: o cross-sell embutido ("Não tem? Baixar") é coerente com o flow — usuário clicou na opção do app proprietário, então oferecer o download faz sentido nesta tela específica. A fricção de funneling pertence ao relatório 1 (escolha da opção lá em cima), não a este modal isolado. Aqui o modal cumpre o que promete.
^insight-1
Função: Conexão via WalletConnect (bridge universal para carteiras compatíveis — MetaMask, Trust, Rainbow, etc.).
Componentes
Regras de negócio
🟢 Insight Suportar WalletConnect é não-negociável — é o padrão de mercado que permite qualquer carteira compatível conectar sem integração ponto-a-ponto. Para o produto, é única integração; para o usuário, é qualquer wallet.
^insight-1
🔴 Fricção (estrutural — i18n quebrada no momento crítico) Todo o resto da interface está em PT-BR (header da sidebar, opções, footer da Uniswap), mas o modal do WalletConnect aparece em inglês: "Scan this QR Code with your phone", "Copy link", "All Wallets". O usuário cai numa superfície estrangeira exatamente no passo de maior tensão — está prestes a autorizar uma carteira a interagir com o produto. Confiança quebra quando o idioma muda sem aviso, e iniciante pode interpretar como "saí do produto, estou em outro lugar".
Direcionamento para Kotai: ou usar WalletConnect com locale forçado em PT-BR (o SDK suporta passagem de locale via configuração), ou wrappear o modal com UI traduzida própria (mais investimento, mas controle total da experiência). A escolha depende de quanto se quer alinhar a primeira impressão do connect com o tom do resto do produto.
^friccao-1
🔴 Fricção (cosmética — "Copy link" sem contexto) "Copy link" sem explicação do uso pressupõe que o usuário sabe o que fazer com o link (abrir noutro device, compartilhar pra si mesmo, colar numa wallet). Iniciante não sabe — vê o botão e não age. Pequeno copy adicional ("Copiar link para abrir no celular") resolve.
^friccao-2
Função: Sidebar de conexão em seu estado mais completo: além das opções padrão, sinaliza quais extensões de carteira o navegador já tem instaladas para acelerar o reconnect.
Componentes
Regras de negócio
🟢 Insight O badge "Detectada" é um atalho cognitivo poderoso: em um lugar onde tudo parece igualmente válido, a etiqueta diz ao usuário "essa aqui já funciona, é só clicar". Reduz dúvida e acelera reconnect — vale replicar.
^insight-1
🔴 Fricção real Mesmo com três carteiras detectadas no navegador, o destaque visual permanece na "Baixar Uniswap Wallet" no topo, em rosa. A hierarquia comunica prioridade comercial (empurrar produto da casa), não prioridade contextual (a carteira que o usuário já tem). Para quem está retornando e só quer se reconectar, isso adiciona um passo de busca visual desnecessário.
Perfil mais afetado: usuário retornando (intermediário) com carteira já instalada.
Direcionamento Kotai: quando houver carteira detectada, promovê-la ao topo com CTA primário ("Continuar com MetaMask"). Manter a opção de baixar a carteira da casa, mas em hierarquia secundária. Trade-off: perde-se push do produto da casa em um momento de alta intenção, em troca de tempo de conexão menor e percepção de "o site me reconheceu".
^friccao-1
🟡 Oportunidade competitiva Qualifica. (1) Resolve fricção real do iniciante/retornante: "qual eu clico?". (2) Não é commodity: a maioria dos DEXs lista carteiras genéricas sem priorizar a detectada. (3) Difícil de copiar com profundidade — exige decisão de produto contra o próprio interesse comercial. (4) Não é cosmético: muda o caminho real e mensurável de conexão.
Forma Kotai: "Bem-vindo de volta — continue com [carteira detectada]" como bloco primário; outras opções colapsadas em "Conectar outra carteira". Ganho: conexão em 1 clique para retornante, e mensagem implícita de que o produto trabalha a favor do usuário, não da própria distribuição.
^oportunidade-1
Função: Estado do mesmo modal com o filtro de auditoria ativo, restringindo o grid a carteiras certificadas pelo protocolo WalletConnect.
Componentes
Regras de negócio
🟢 Insight A troca do título do header ("All Wallets" → "Only WalletConnect certified") funciona como feedback de estado mais forte do que só o toggle, que poderia passar despercebido. Padrão que vale replicar: quando um filtro muda o conjunto de resultados de forma significativa, alterar o próprio título da lista, não só o controle.
^insight-1
🔴 Fricção real Mesmo com o filtro ligado, a diferença visível em relação ao grid completo é pequena (praticamente as mesmas carteiras populares aparecem), o que dá a impressão de que o toggle não fez nada. Para iniciante que ligou justamente para se sentir mais seguro, o feedback é frustrante: ele esperava ver "menos opções e mais confiáveis" e vê quase o mesmo conjunto.
Perfil mais afetado: iniciante.
Direcionamento Kotai: mostrar contagem explícita ("12 de 247 carteiras auditadas") e badge de selo visível em cada card quando o filtro está ativo, para reforçar o ganho de confiança. Trade-off: adiciona ruído visual ao card, mas é o ruído que carrega a mensagem de segurança.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. É refinamento de feedback dentro de padrão existente, não diferenciação.
^oportunidade-1
Função: Modal sobreposto à sidebar que lista todas as carteiras compatíveis com WalletConnect, em grid de logos, para o usuário escolher uma que não está na lista principal.
Componentes
Regras de negócio
🟢 Insight Grid de logos prioriza reconhecimento visual sobre leitura — para usuário intermediário/avançado que já sabe qual carteira procurar, é mais rápido do que lista textual. Vale adotar como padrão da tela "todas as carteiras".
^insight-1
🔴 Fricção real O label "Only WalletConnect certified" é jargão técnico cru e o toggle vem desligado por padrão. O iniciante não tem como saber o que "certified" significa nesse contexto (auditoria do protocolo? selo de segurança? lista oficial?) e, na dúvida, mantém o default — ou seja, fica exposto a carteiras não-auditadas sem perceber que existe um nível de proteção opcional.
Perfil mais afetado: iniciante.
Direcionamento Kotai: trocar o rótulo por algo concreto ("Mostrar apenas carteiras auditadas" + tooltip explicando o que isso significa em uma frase) e considerar default ligado para iniciantes, com opção de afrouxar o filtro de forma explícita. Trade-off: ligar por padrão pode esconder carteiras populares que ainda não passaram pela auditoria — aceitável para o público-alvo, que prefere a lista curta e segura.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. O grid + filtro de certificação é boa prática de mercado; o problema é só o rótulo, que entra como fricção a corrigir, não como diferenciação.
^oportunidade-1















A Home do Uniswap acerta a porta de entrada: widget de swap funcional desconectado e hero como tarefa imediata reduzem fricção de adoção, e o multi-chain é tratado com decisões contextuais boas (busca de redes no popover, banner cross-chain onde importa). Em contrapartida, paga em duas frentes estruturais que afetam diretamente iniciante e intermediário — claims institucionais ambíguos sem qualificador, e listagens multi-chain planas, sem hierarquia de canonicidade nem sinalização de risco. É exatamente nessa segunda frente que mora a maior oportunidade competitiva pra Kotai.
O mesmo princípio aparece em duas escalas: na tela 1, o widget de swap é funcional mesmo sem carteira conectada ("try before you connect"); na tela 4, o hero entrega a tarefa primária acima da dobra e empurra todo o institucional pra baixo, opcional pra quem desce. O iniciante não é forçado a se comprometer (conectar) nem a processar densidade (institucional, personas, cross-promo) antes de testar o produto. Padrão sólido pra herdar — a regra subjacente é "deixe o usuário agir antes de aprender; deixe-o aprender antes de comprar".
Três acertos da mesma família: o banner cross-chain dismissible aparece exatamente no contexto onde a feature importa (modal de seleção de token entre redes); a busca de redes vem no topo do popover de filtro (resolvendo o que falta nos submenus de Idioma/Moeda); e "Todas as redes" é o default, reconhecendo que o iniciante geralmente não sabe em qual rede o token desejado está. Padrão de "informação no momento exato em que ela é decisão" — diferente do antipadrão comum de mostrar tudo o tempo todo.
"Tarifas zero do aplicativo" (tela 1) e "Impulsionando trilhões" (tela 4) sofrem do mesmo defeito: claim alto sem precisão. No primeiro caso, "tarifas zero" sugere transação gratuita pra quem não distingue fee de produto de gas de blockchain — quando a primeira transação real cobrar gas, a expectativa quebra. No segundo, "trilhões" sem número, janela temporal ou fonte é trust signal numérico sem lastro. Solução óbvia (esconder o claim) não serve — esses claims puxam SEO e conversão. Alternativa: precisão como diferencial. "Sem fee da Kotai sobre o valor trocado, gas pago à rede" no widget; "$X em volume cumulativo desde 2018" em vez de "trilhões". Trade-off: copy mais longo, menos punchline, mais credibilidade. Afeta iniciante diretamente — é exatamente o perfil que ainda decodifica claims literalmente.
Duas faces do mesmo problema arquitetural. Na tela 2, a lista por volume mistura USDC canônico com tokens de baixo volume ("Quq" no topo) e bridges não-canônicos ("Binance Bridged USDT") sem qualquer sinal visual de diferença — risco real de perda silenciosa por seleção errada. Na tela 3, com "Todas as redes" ativo, o mesmo token canônico aparece N vezes (USDC em Ethereum, Base, Arbitrum, Polygon…), cada um com endereço diferente, sem agregação — empurra a decisão de chain pra cima do usuário sem ajudá-lo. Solução óbvia (esconder tokens de baixo volume) falha porque bloqueia listings legítimos novos. Alternativa: tratar canonicidade como dado de primeira classe. Token canônico vira entrada única, expansível por rede; tokens não-canônicos recebem badges explícitos de status (verificado / baixo volume / nome ambíguo); em casos de alta similaridade (USDT fake), warning ativo na seleção, não banner passivo. Afeta diretamente iniciante e intermediário — avançado já tem ferramentas próprias.
O grid "Feito para todas as formas de fazer swap" empilha audiências distintas com peso visual idêntico: trader iniciante, LP, desenvolvedor consumindo fees-API, usuário de produtos proprietários. Pra iniciante, vários cards são ruído de audiências que não são ele. Entra aqui apesar de aparecer em 1 tela só por ser decisão estrutural de IA — se Kotai tiver landing com grid de personas, segmentar visualmente (sub-headers ou abas por perfil) e separar cross-promo de produto em section própria.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch listam tokens por volume sem distinção de risco. Scam tokens com nome similar a tokens reais, tokens recém-criados e bridges não-canônicos compartilham espaço visual com USDC e ETH legítimos. Por que afeta nosso target: iniciante DeFi não tem ferramenta interna pra distinguir canônico de wrap/scam — é vetor real e crescente de perda silenciosa em swaps. Hipótese de diferenciação Kotai: badges de status no token (verificado / não verificado / baixo volume / nome similar a canônico); separação visual entre "canônicos" e "emergentes" na lista; warning ativo (não banner passivo) quando o user seleciona token com similaridade alta a um canônico. Trade-off: exige infra de classificação (whitelist canônicos por rede + heurísticas de risco) e governança contínua — falsos positivos bloqueiam listings legítimos novos, falsos negativos deixam scam passar. Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes fazem igual. (2) ✓ afeta diretamente iniciante e intermediário. (3) ✓ é falta de investimento (exige curadoria contínua), não impossibilidade técnica. (4) ✓ ganho é diretamente perceptível pro target — distinguir "USDC" real de "USDC" falso é visível na primeira interação.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch tratam cada par token-rede como entrada de lista independente. O modelo mental do usuário é "quero USDC, escolho onde"; o produto inverte pra "qual dos N USDCs". Por que afeta nosso target: iniciante e intermediário multi-chain (que é o padrão hoje) gastam cognição decidindo entre N entries idênticas de nome — decisão dupla (token + rede) feita ao mesmo tempo, sem o produto ajudar a separar. Hipótese de diferenciação Kotai: token canônico como entidade única na lista, com sub-seletor de rede dentro do item. Pro user conectado, mostrar saldo por rede inline ("USDC — você tem $42 em Base, $128 em Polygon"); pro desconectado, ordenar redes por liquidez/volume do par alvo. Trade-off: exige curadoria de mapeamento canônico (qual contrato em qual rede é o "USDC oficial") — falhar nisso vira problema de risk signaling. As duas oportunidades são complementares: agregação cross-chain só é segura se o produto sabe distinguir canônico de bridged/scam. Operacionalmente, pra Kotai, isso é um único pacote de roadmap. Passa nas 4 perguntas-teste? (1) ✓ todos os concorrentes fazem igual. (2) ✓ afeta iniciante/intermediário multi-chain. (3) ✓ é falta de investimento em curadoria, não impossibilidade. (4) ✓ separar "qual token" de "em qual rede" é simplificação visível no primeiro uso.
Observação adicional: na tela 3, Unichain aparece em 3º lugar na lista de redes, antes de Base e Arbitrum — chain proprietária privilegiada na ordem de exibição. Decisão deliberada de cross-promo, não convenção neutra. Pra Kotai, vale ter consciência explícita de que ordem de redes em seletores é vetor de influência sobre escolha do usuário — pode ser por liquidez, por uso do user, ou por estratégia, mas deve ser decisão consciente e não default acidental.
Função: Mesmo modal de seleção com popover de filtro de rede aberto.
Componentes
Regras de negócio
🟢 Insight Três decisões acertadas em uma só tela: (1) busca de redes no topo do popover — exatamente o que faltava nos submenus de Idioma e Moeda; (2) badge "Novo" para redes recém-suportadas comunica evolução do produto sem inflar a lista permanentemente; (3) "Todas as redes" como default reconhece que o usuário pode não saber em qual rede o token que ele quer está. Pattern multi-chain de primeira classe.
^insight-1
🔴 Fricção (estrutural — fragmentação por rede confunde iniciante) Com "Todas as redes" ativo, o mesmo token canônico aparece N vezes (USDC em Ethereum, USDC em Base, USDC em Arbitrum, USDC em Polygon...) cada uma com endereço diferente. Para iniciante, é "qual eu escolho?" sem critério: cada item é tecnicamente um token distinto, mas conceitualmente é o mesmo dólar digital em redes diferentes. A lista achata essa hierarquia e empurra a decisão de chain pra cima do user, sem ajudá-lo a decidir.
Direcionamento para Kotai: representar tokens canônicos como item agregado com expand para escolher rede — "USDC" como entrada única que abre seletor de rede com saldo do user (se conectado) e indicador de liquidez por rede. Mantém o controle, reduz a fricção de escolher entre N "USDCs" idênticos.
^friccao-1
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch tratam cada par token-rede como entrada de lista independente. Para usuário multi-chain (que é o padrão hoje em DeFi), isso significa scrolling repetido pelo mesmo nome em diferentes contextos, sem agregação. O modelo mental do usuário é "quero USDC" (token canônico) e "escolho onde" (rede); o produto inverte isso para "qual USDC" (escolha de N entries com endereços diferentes).
Diferenciação para Kotai: token canônico como entidade única na lista, com sub-seletor de rede. Para o user conectado, mostrar saldo por rede inline ("USDC — você tem $42 em Base, $128 em Polygon"). Para user desconectado, ordenar redes por liquidez/volume do par alvo. O ganho é cognitivo direto: o usuário decide o token primeiro, a rede depois — não os dois ao mesmo tempo.
Trade-off: exige curadoria de mapeamento canonical (qual contrato em qual rede é o "USDC oficial") — falhar nisso vira problema de risk signaling do relatório 2. As duas oportunidades são complementares: agregação cross-chain só é segura se o produto sabe distinguir canônico de bridged/scam.
Observação adicional (hierarquia da lista): Unichain aparece em 3º lugar, antes de Base e Arbitrum — chain proprietária privilegiada na ordem de exibição. É decisão deliberada de cross-promo, não convenção neutra. Para Kotai, vale ter consciência: a ordem das redes no seletor é vetor de influência sobre escolha do user — pode ser organizada por liquidez, por uso do user, por estratégia, mas a decisão deve ser explícita, não default acidental.
^oportunidade-1
Função: Página completa rolada, mostrando institucional, personas e cross-promo de produtos.
Sections principais
Regras de negócio
🟢 Insight Decisão arquitetural acertada: hero entrega a tarefa imediata (widget swap funcional) e tudo abaixo é opcional para quem desce. O iniciante que só quer fazer swap não é obrigado a processar a densidade institucional — ela existe para SEO, trust e descoberta de produtos adjacentes, sem competir com a ação primária acima da dobra.
^insight-1
🔴 Fricção (estrutural — mistura B2C/B2B sem segmentação) O grid "Feito para todas as formas de fazer swap" empilha audiências muito distintas com peso visual idêntico: trader/swapper (B2C iniciante), LP em pools de liquidez (B2C intermediário/avançado), desenvolvedor consumindo "Tarifas para Aplicativos" (B2B/white-label), e usuário de produtos proprietários (Wallet, UniswapX). Não há rótulo, badge ou agrupamento que ajude cada perfil a achar seu card — todos disputam atenção em pé de igualdade. Para iniciante, vários desses cards são ruído de audiências que não são ele.
Direcionamento para Kotai: se a landing tiver grid de personas, segmentar visualmente — sub-headers ("Para quem faz swap", "Para quem provê liquidez", "Para desenvolvedores") ou abas/filtros que reorganizem os cards por perfil. Cards que são cross-promo de produto (wallet, chain, etc.) ficam em section separada, claramente nomeada como tal.
^friccao-1
🔴 Fricção (cosmética — claim sem qualificador) "Impulsionando trilhões" é claim institucional alto, mas "trilhões" como adjetivo vago sem número específico nem janela temporal (volume cumulativo histórico? TVL? swaps por ano?) entrega menos confiança do que aparenta. Trust signal numérico real funciona melhor com precisão ("$X em volume cumulativo desde 2018") do que com escala genérica.
Direcionamento para Kotai: claims quantitativos devem trazer número + janela + fonte (mesmo que rodapé). Sem isso, o efeito é o oposto — soa marketing de planilha sem lastro.
^friccao-2
🔴 Fricção (cosmética — wordplay UNIverso) "UNIverso" tenta puxar "Uniswap + universo". Em inglês ("UNIverse") o duplo sentido é mais natural; em PT-BR a leitura visual fica forçada e pode soar infantil para usuário que está avaliando confiar valor real no produto. Não é problema crítico, mas é decisão de copy que envelhece mal.
^friccao-3
Função: Seletor de token ao clicar em "Selecionar token" no widget de swap.
Componentes
Tokens visíveis na lista por volume Binance Bridged USDT (BNB Smar… — truncado), USDC, Ethereum, Tether, Quq, Base ETH, Wrapped Bitcoin…
Regras de negócio
🟢 Insight Chips de Recomendados acima da lista reduzem scroll para o caso de uso mais comum (5 tokens cobrem ~80% das jornadas). Endereço encurtado abaixo do nome serve como trust signal técnico, mesmo que iniciante não decodifique. Banner cross-chain colocado exatamente no contexto onde a feature importa (escolher token entre redes) é decisão de contexto correta.
^insight-1
🔴 Fricção (estrutural — listagem sem risk signaling, afeta iniciante) A lista por volume mistura tokens canônicos (USDC, ETH, USDT) com tokens de baixa qualidade ou desconhecidos ("Quq" no top da lista) e versões bridged que parecem o original mas não são ("Binance Bridged USDT" — não é o USDT canônico em Ethereum). Iniciante não tem como distinguir — clicar em "USDT" errado pode significar comprar um wrap em chain que ele não usa, ou pior, um token com nome quase idêntico ao real. Risco real de perda silenciosa, e a lista atual não dá nenhum sinal.
Direcionamento para Kotai: badges de status no token (verificado / não verificado / baixo volume / nome similar a token canônico) e proteção ativa para tokens recém-listados ou de volume suspeito.
^friccao-1
🔴 Fricção (cosmética — truncamento perde informação crítica) "Binance Bridged USDT (BNB Smar...)" — o nome completo identifica a rede, mas o truncamento corta exatamente isso. Para iniciante, ler "Binance Bridged USDT" sem ver a rede é informação incompleta numa decisão sensível. Trivialmente corrigível com tooltip no hover ou wrap em duas linhas.
^friccao-2
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch listam tokens por volume sem distinção de risco. O resultado é que scam tokens com nome similar a tokens reais (USDT fake, USDC fake), tokens recém-criados e bridges não-canônicos compartilham espaço visual com USDC e ETH legítimos. Iniciante DeFi não tem ferramenta para distinguir e cai — é vetor real e crescente de perda.
Diferenciação para Kotai: risk signaling explícito na lista — badge de verificação para tokens canônicos (USDC oficial em Ethereum), badge de atenção para tokens de baixo volume ou nome ambíguo, separação visual entre "canônicos" e "emergentes". Em casos de alta similaridade (ex: USDT fake), warning ativo na seleção, não banner passivo na lista.
Trade-off: requer infra de classificação (whitelist canônicos por rede + heurísticas de risco para o resto) e governança contínua — falsos positivos bloqueiam tokens legítimos novos, falsos negativos deixam scam passar. É investimento real, mas o ganho de confiança para iniciante é diretamente proporcional à precisão.
Observação adicional (consistência): o filtro de rede inline ao lado do input é o mesmo padrão observado no relatório 7 (Search Overlay) — potencial redundância com o seletor de rede global do header. Vale a mesma recomendação: unificar para uma única fonte de verdade de rede ativa.
^oportunidade-1
Função: Landing page principal. Widget de swap funcional como hero.
Componentes
Regras de negócio
🟢 Insight Widget interativo no hero ("try before you connect") é decisão poderosa — permite usuário explorar a interface antes de conectar wallet, reduz fricção de adoção e descontrói a barreira psicológica de "preciso me comprometer pra ver o produto". Padrão sólido para herdar.
^insight-1
🔴 Fricção (estrutural — promessa ambígua, afeta iniciante) "Compre e venda crypto com tarifas zero do aplicativo" carrega ambiguidade dupla. Primeiro, "tarifas zero" sugere "transação gratuita" para iniciante que não sabe distinguir fee de produto vs gas de blockchain — quando a primeira transação real cobrar gas, a expectativa quebra. Segundo, "do aplicativo" é confuso: zero no app mobile? Na web? No produto inteiro? A frase também mistura chains públicas (Ethereum, Base) com produto proprietário (UniChain) sob o guarda-chuva de "19 redes", borrando a fronteira entre infra-comum e cross-promo.
Direcionamento para Kotai: comunicar a fee de forma específica ("sem fee da Kotai" ou "0% sobre o valor trocado"), e mostrar gas estimado inline no próprio widget assim que houver valor preenchido. "Zero" só se for de fato zero em todas as componentes que o usuário paga.
^friccao-1
🔴 Fricção (cosmética — hierarquia de CTAs ambígua) Dois botões rosa coexistem com pesos próximos: "Selecionar token" dentro do widget (rosa, médio) e "Começar" abaixo (rosa, grande). Para iniciante que ainda não entendeu o flow, qual é a ação primária? Pior: "Começar" não tem objeto — começar o quê? Conectar wallet? Executar swap? Abrir tutorial?
Direcionamento para Kotai: hierarquizar CTAs por peso/cor. Ações internas do widget (selecionar token) ficam em estilo secundário; o botão de progressão fica primário e com copy específico ao próximo passo real ("Conectar carteira" se desconectado, "Fazer swap" se conectado e widget preenchido).
Observação adicional (dissonância leve): a tagline "Faça swap a qualquer hora, em qualquer lugar" vende onipresença/mobilidade, mas a tela é claramente desktop-first e o widget central é desktop. A frase pode estar mirando teaser pro app mobile, mas no contexto da página principal soa descolada da ação imediata. Não é fricção — é decisão de copywriting que vale revisar quando a tagline passar do hero para outras superfícies.
^friccao-2








Função: Tela intersticial após CTA "Baixar o aplicativo" oferecendo dois produtos da família (app mobile + extensão Chrome).
Componentes
Regras de negócio
🟢 Insight A noção de família-de-produtos (web + mobile + extension) é trunfo institucional — comunica que o ecossistema é coeso e reforça confiança. Para Kotai, vale o aprendizado: cross-promo de produtos próprios pode existir, desde que não seja apresentada como pré-requisito.
^insight-1
🔴 Fricção (estrutural — afeta iniciante) Para operar na Uniswap, o usuário não precisa de wallet da Uniswap — MetaMask, Rabby, Coinbase Wallet, Phantom, qualquer wallet compatível funciona. Mas o modal posiciona "App + Extensão" como "Como começar", sugerindo implicitamente que esses são pré-requisitos. É funneling soft para produtos proprietários sem disclosure de que existem alternativas. O título confunde produto-opcional com produto-pré-requisito.
Direcionamento para Kotai: se houver cross-promo de produtos próprios, separar claramente o vetor — "Conheça nossos apps" ou "Aplicativos Kotai" como título, e manter a tela de "Como começar" focada no que o usuário precisa de fato (conectar wallet, fazer primeiro swap), com app/extensão como opção, não como rota única.
^friccao-1
🔴 Fricção (decisão imposta sem suporte) Usuário clicou em "Baixar app" — já decidiu que quer um app. O modal o força a uma segunda decisão (qual produto?) sem ajudá-lo a escolher. Cards exibem screenshots quase idênticos ($22.323,42 vs $22.323,43, layout muito similar) — o que diferencia mobile app de extensão Chrome no que importa para o usuário (mobilidade no celular vs in-browser DApp interaction no desktop)? O modal não comunica.
Direcionamento para Kotai: se a escolha entre dois canais for inevitável, cada card deve carregar uma frase-chave de uso real ("Use no celular para acompanhar saldos em movimento" / "Use no Chrome para assinar transações sem trocar de janela"), não mockup de saldo idêntico que não diferencia nada.
^friccao-2
Função: Busca global universal sobre tokens, pools e carteiras.
Componentes
Regras de negócio
🟢 Insight Search universal com facet por tipo de entidade (tokens / pools / carteiras) é arquitetura sólida — permite cobrir descoberta de ativos e exploração on-chain no mesmo lugar. "Wallets" como facet habilita whale-watching e LP discovery, mas é caso de uso avançado, fora do target principal de Kotai. Vale herdar a arquitetura, não necessariamente todos os facets no MVP.
^insight-1
🔴 Fricção (estrutural — afeta iniciante e intermediário) O default ordena por volume 24h global, sem considerar a rede que o usuário está usando. Resultado: o top hit é "Binance Bridged USDT (BNB Smart Chain)" — irrelevante para quem está em Ethereum, Base ou Polygon. Existe filtro de rede ao lado do input, mas opera como gesto separado: o usuário precisa abrir, escolher rede e só então a busca fica contextualizada. Iniciante, que nem sabe que esse filtro existe, vê o overlay com resultado estranho na primeira impressão.
Direcionamento para Kotai: o estado default deve respeitar contexto disponível (rede ativa + wallet conectada). Trending global vira fallback quando não há contexto.
^friccao-1
🔴 Fricção (cosmética — copy) Placeholder "Pesquisar tokens, pools e carteiras" promete três entidades, mas não educa COMO buscar carteira: aceita ENS? Endereço hex? Nome de exchange? Sem hint ("vitalik.eth, 0xabc..."), a feature diferenciada (busca por carteira) só é descoberta por acidente.
Direcionamento para Kotai: placeholder com sample concreto rotacionando ("vitalik.eth", "0xabc...", "USDC") ou hint inline abaixo do input.
^friccao-2
🔴 Fricção (i18n — descuido) Todas as 4 tabs estão em inglês (All / Tokens / Pools / Wallets) enquanto o resto da interface — incluindo o próprio placeholder do overlay — está em PT-BR. "Carteiras" aparece traduzida no placeholder, mas vira "Wallets" na tab. Descuido específico, trivialmente corrigível, sinaliza tradução parcial inconsistente.
^friccao-3
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch defaultam o search para trending global, sem usar contexto disponível (rede ativa, wallet conectada, histórico). Iniciante chega no overlay e vê tokens irrelevantes para a jornada dele — quebra de relevância na primeira impressão de uma feature crítica.
Diferenciação para Kotai: search com hierarquia contextual no estado default — (1) tokens da wallet conectada, (2) recentes/frequentes, (3) trending na rede ativa, (4) trending global como fallback. Um usuário em Polygon procurando USDT vê primeiro o USDT que ele tem ou usou, depois o USDT da rede ativa, antes do USDT bridged em outra chain.
Trade-off: requer telemetria de uso (recentes, frequentes) e leitura de wallet para tokens próprios — exige que privacidade seja explícita ("Sua carteira" só aparece quando wallet está conectada e o user opta).
Observação adicional (consistência): o filtro de rede ao lado do input é potencialmente redundante com o seletor de rede global do header (presente em outras telas analisadas). Dois pontos de filtro de rede em paralelo confundem sobre qual está ativo onde. Em Kotai, vale unificar — search herda a rede global do produto, e troca de rede no search atualiza o contexto global, não cria um segundo filtro paralelo.
^oportunidade-1
Função: Submenu popover (acessado a partir de Preferências globais) com a lista de idiomas suportados.
Componentes
Idiomas listados (ordem) Inglês, Chinês simplificado, Chinês tradicional, Holandês, Francês, Indonésio, Japonês, Coreano, Português ✓, Russo, Espanhol (Espanha), Espanhol (América Latina), Espanhol (EUA), Espanhol (Argentina), Espanhol (Bolívia), Espanhol (Chile), Espanhol (Colômbia), Espanhol (Costa Rica)…
Regras de negócio
🟢 Insight Nomes em PT (idioma atual) ajudam usuário a reconhecer, mas exibir também o autônimo em paralelo ("English", "中文", "日本語") é padrão de produtos globalmente bons (Wikipedia, Airbnb) e ajuda quem está navegando em idioma errado a achar o seu — pequeno trunfo herdável a baixo custo.
^insight-1
🔴 Fricção (estrutural — granularidade inconsistente) Espanhol tem 8+ variantes regionais (Espanha, América Latina, EUA, Argentina, Bolívia, Chile, Colômbia, Costa Rica…) enquanto Português é item único. Brasil + Portugal + Angola + Moçambique somam mais falantes do que várias variantes hispânicas isoladas — não há justificativa lógica para a assimetria. Pior: o ROI da fragmentação é baixo, porque vocabulário técnico de DeFi (swap, slippage, liquidez, gas, pool) não muda significativamente entre regiões hispânicas. É over-engineering de localização que infla o submenu sem benefício proporcional.
Direcionamento para Kotai: consolidar variantes regionais em "Espanhol" único (eventualmente "Espanhol (LatAm)" e "Espanhol (Espanha)" como split máximo), e replicar a mesma lógica para Português. Critério: split só se justifica quando vocabulário diverge a ponto de prejudicar compreensão.
^friccao-1
🔴 Fricção (cosmética — descobribilidade) Com 15+ idiomas (mais variantes), scroll para achar Tailandês, Vietnamita ou Hindi é tedioso. Falta busca/filtro no topo do submenu — pattern padrão em qualquer produto com 10+ locales (Google Translate, Netflix).
Direcionamento para Kotai: campo de busca no topo do submenu sempre que a lista passar de ~10 itens.
^friccao-2
🔴 Fricção (cosmética — cobertura opaca) Sem indicação de % de tradução por idioma. Usuário escolhe um idioma menos usado (ex: "Espanhol (Costa Rica)") e descobre na prática que parte da interface caiu em fallback EN. Badges "100%" / "Beta" / "Parcial" (como Discord faz) seriam honestos sobre o estado real da localização.
Direcionamento para Kotai: badge ao lado do idioma quando cobertura for incompleta. Em pé de igualdade com tema de testnet — sinalização explícita evita confusão silenciosa.
^friccao-3




Função: Modal de confirmação para o wipe completo do storage local — combina histórico + preferências + cache em uma única ação.
Componentes
Regras de negócio
🟢 Insight A reassurance sobre a seed phrase, no contexto desta ação específica, ganha força máxima: aqui é onde o usuário realmente precisa ouvir "sua chave continua segura". Bom exemplo de copy preventiva. Mesmo se o modal de cache for simplificado, esta frase precisa continuar aqui.
^insight-1
🔴 Fricção real O botão de confirmação tem o mesmo peso visual e a mesma cor rosa do modal que limpa só o cache. A ação mais destrutiva do app (wipe completo) e a mais leve (cache) compartilham exatamente o mesmo affordance final. Não há nada no momento do clique que diga "esta é a opção mais cara".
Perfil mais afetado: qualquer usuário em fluxo apressado, mas o estrago é maior para o intermediário com histórico de uso acumulado.
Direcionamento Kotai: para o wipe completo, usar variante destrutiva (vermelho, não rosa de marca) e exigir interação adicional — digitar "LIMPAR", segurar o botão por 2s ou checkbox "entendo que vou perder tudo". Trade-off: aumenta atrito em uma ação rara, justamente onde o atrito tem que existir.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. Diferenciação visual de risco é boa prática de produto, não tese.
^oportunidade-1
Função: Modal aberto a partir do card "Receber criptos" da sidebar. Lista as origens possíveis para abastecer a carteira conectada — separando carteiras próprias do usuário e contas em exchanges integradas.
Componentes
Regras de negócio
🟢 Insight A separação "minhas carteiras" vs "de uma conta" é uma taxonomia útil: comunica visualmente que carteira e exchange são entidades diferentes, justamente o modelo mental que o iniciante ainda não tem. Vale replicar como organização padrão de qualquer tela de origem de fundos.
^insight-1
🔴 Fricção real Os endereços hexadecimais (0xd098…618a, EQp4…8DvX) aparecem sem rótulo amigável, então o usuário precisa reconhecer pelo endereço que aquela é a própria carteira dele. Para iniciante, isso lê como "outra entidade qualquer". Junte com "Ethereum + 17 redes" — que só faz sentido se você já sabe que endereços EVM são intercambiáveis entre redes — e a lista, que deveria simplificar, vira um quebra-cabeça.
Perfil mais afetado: iniciante.
Direcionamento Kotai: rotular cada item com nome amigável ("Sua carteira EVM — Ethereum, Base, Polygon, Arbitrum…") e o endereço como subtexto cinza. Em vez de "+17 redes", listar 3-4 redes principais por extenso para que o usuário reconheça pelo nome, e expandir as demais com um "ver todas". Trade-off: mais texto na lista, mas o usuário não precisa decifrar a notação.
^friccao-1
🟡 Oportunidade competitiva Não qualifica. A taxonomia é boa, mas é refinamento de copy; não vira posicionamento.
^oportunidade-1

Função: Modal aberto pelo card "Transferência" da sidebar. Sub-fluxo dedicado a trazer fundos de uma exchange centralizada para a carteira conectada.
Componentes
Regras de negócio
🟢 Insight Um card próprio para "trazer da exchange" reconhece um cenário real e separado do "transferir de outra carteira". Mantém a taxonomia que o modal 12 começou. Vale replicar a separação.
^insight-1
🔴 Fricção real (duas frentes)
Para o público-alvo BR, Coinbase é a exchange menos relevante da praça. Mercado Bitcoin, Binance, Foxbit, Bitso e Bybit dominam o mercado brasileiro. Ter apenas Coinbase integrada significa, na prática, que para 99% dos usuários BR esse fluxo é igual ao "Receber criptos" — só que com um clique a mais e uma promessa de integração que não entrega.
O rótulo "Transferência" é abstrato. Para iniciante, "Transferir" não comunica "trazer da minha exchange" — comunica "enviar para alguém". O título do card na sidebar ("Transferência — Transfira fundos de uma plataforma de negociação") já é mais claro que o título do modal.
Perfil mais afetado: iniciante BR.
Direcionamento Kotai: integrar com as exchanges relevantes ao mercado-alvo (Mercado Bitcoin, Binance, Bitso, Foxbit) com fluxo guiado — gerar endereço de destino, mostrar instruções específicas por exchange, detectar chegada do depósito e notificar. Rotular o card e o modal como "Trazer da minha exchange" em vez de "Transferência". Trade-off: cada integração tem custo de manutenção (APIs, mudanças de UI nas exchanges, suporte), mas é a barreira concreta entre o iniciante BR e a primeira operação real.
^friccao-1
🟡 Oportunidade competitiva Qualifica. (1) Resolve fricção real e mensurável do iniciante BR: trazer fundos da exchange é o primeiro passo, e hoje exige copiar endereço, escolher rede no painel da exchange e torcer para acertar. (2) Não é commodity: nenhum DEX global atende mercado BR com integração nativa de CEX. (3) Difícil de copiar com profundidade — requer integrações específicas, parcerias e suporte localizado, não apenas UI. (4) Não é cosmético: muda o tempo real de funding de uma carteira em ~10 minutos para ~1 minuto.
Forma Kotai: na sidebar, card "Trazer da minha exchange" → seleção da exchange → tela com endereço, rede recomendada, taxa estimada de saque na exchange e tempo médio de chegada. Pós-saque, polling do endereço para confirmar entrada e fechar o ciclo. Posicionamento implícito: enquanto a Uniswap é ponte EUA, o Kotai é ponte LatAm.
^oportunidade-1



Função: Estado pós-execução do painel "Dados do aplicativo": o item que foi acionado é substituído por um bloco descritivo do que aconteceu, enquanto os demais permanecem clicáveis.
Componentes
Regras de negócio
🟢 Insight Feedback inline (substituir o card no lugar) é mais robusto que toast: o usuário consegue ler com calma e o estado fica persistente até navegar para fora. Bom para ações de configuração onde o usuário tende a encadear várias.
^insight-1
🔴 Fricção real O bloco de feedback ocupa o mesmo espaço visual do card de ação, com tipografia parecida. Para quem chega na tela em segundo momento, fica ambíguo se o texto é uma descrição do que foi feito (passado) ou uma instrução do que essa opção faz (presente). Sem timestamp e sem ícone de status (check, concluído), o estado "pós-ação" se confunde com "em repouso".
Perfil mais afetado: usuário que volta à tela depois de alguns segundos ou que limpa múltiplos itens em sequência.
Direcionamento Kotai: marcar o bloco com ícone de check verde + carimbo de tempo relativo ("Limpo agora" / "Limpo há 1 min"), e oferecer um link "Limpar de novo" que recupera o card de ação. Trade-off: mais elementos no card, mas o estado fica autoexplicativo sem depender de memória do clique anterior.
^friccao-1
🟡 Oportunidade competitiva Não qualifica.
^oportunidade-1
O mega-menu da Uniswap opera em dois registros simultaneamente: funcional (search, dropdowns de tarefa, preferências) e institucional (cross-promo de produtos próprios, governança, jurídico). Onde o registro é puramente funcional e bem escopado — dropdown Pool com Ver/Criar, segmented control de Tema, progressive disclosure do jurídico — funciona bem. Onde os registros se misturam — Logo, modal "Como começar", "Preferências globais", "Visão geral" do Portfólio — o usuário-alvo paga. O padrão estrutural transversal é claro: títulos e escopos servem à empresa antes do modelo mental do usuário, e estados default ignoram contexto (rede ativa, locale) que o produto já tem. Perfil mais afetado: iniciante (primeira impressão envenenada por irrelevância) e intermediário recorrente (reconfiguração repetida do que poderia ser global).
Quando o agrupamento respeita uma única semântica e a granularidade é contida, o mega-menu acerta. Pool com só Ver/Criar evita inflar nav com ações do destino; progressive disclosure no jurídico mantém o dropdown limpo; Negociar e Portfólio como hubs por intenção evitam o usuário caçar entre menus. Padrão herdável: o ganho só se materializa se a hierarquia interna comunicar diferenças (vide fricções abaixo) — sem isso, hub vira fonte de confusão.
Search universal com facets por tipo de entidade (tokens/pools/wallets), idioma e moeda como controles independentes, bandeiras como reconhecimento visual rápido. Decisões de arquitetura corretas em si — o problema repetido não é a forma, é o escopo que falta. Vale herdar a arquitetura; falta repensar o conteúdo que entra nela.
Atrito real: quatro pontos do fluxo prometem amplitude e entregam recorte estreito. Logo (=home em qualquer produto mainstream) agrega cross-promo+institucional+governança. "Visão geral" do Portfólio mostra tokens/NFTs mas omite Pools/Stake, justamente onde mora o patrimônio "trabalhando". "Como começar a usar a Uniswap" redireciona pra baixar wallet própria, quando para usar a Uniswap basta MetaMask/Rabby/qualquer wallet compatível. "Preferências globais" promete centro de controle e entrega só cosmético (tema/idioma/moeda) — slippage, gas, deadline, MEV ficam fora.
Por que solução óbvia falha: renomear caso a caso ("Aparência" em vez de "Preferências globais") resolve o sintoma localmente, mas não trata a causa — a arquitetura de navegação foi desenhada para servir a empresa (espaço para cross-promo, branding institucional) antes do modelo mental do usuário. Fix superficial cobre etiqueta, não a decisão estrutural.
Alternativa: ou cada label reflete escopo real (Logo=home; "Display" em vez de "Preferências globais"; "Resumo de saldos" em vez de "Visão geral"), ou — quando o nome promissor faz sentido manter — o escopo é expandido pra cumprir a promessa (Visão geral inclui Pools/Stake; Preferências inclui execução). Trade-off: a primeira via é barata mas perde a oportunidade de competir; a segunda é cara mas vira diferencial (vide 🟡 abaixo). Perfil afetado: iniciante (constrói modelo mental errado) e intermediário (reconfigura o que esperava encontrar centralizado).
Atrito real: o produto tem informação (rede ativa, wallet conectada, locale detectado no on-ramp) e não usa no estado default. Search mostra "Binance Bridged USDT (BNB Smart Chain)" no topo pra usuário em Ethereum. Display de moeda permanece USD pra brasileiro depois de o sistema já mostrar bandeira BR no fluxo de compra. Usuário paga o custo de configurar manualmente algo que o sistema sabe.
Por que solução óbvia falha: simplesmente "defaultar para rede ativa" pode quebrar descoberta cross-chain (usuário em Polygon procurando USDC em Base). Tem que ser hierarquia, não substituição. Alternativa: estado default em camadas — (1) contexto do usuário (sua wallet/sua rede), (2) recentes/frequentes, (3) trending na rede ativa, (4) trending global como fallback. Trade-off: exige telemetria de uso e leitura de wallet com privacidade explícita. Perfil afetado: principalmente iniciante (primeira impressão de irrelevância) e intermediário BR/LatAm.
Atrito real: o mega-menu trata produtos proprietários (Uniswap Wallet, UniChain, Extensão) como caminho default. Logo abre dropdown com Wallet/Chain/API em destaque; "Baixar app" leva a modal que posiciona App + Extensão como "Como começar a usar a Uniswap". Em nenhum dos pontos há disclosure de que esses produtos são opcionais — o usuário-iniciante pode interpretar como pré-requisito.
Por que solução óbvia falha: remover toda cross-promo sacrifica canal legítimo de descoberta de ecossistema. Alternativa: cross-promo contextual, não por-default — wallet própria ofertada quando o usuário conecta com EOA externa e há benefício concreto pra trocar; modal de "Como começar" focado no que o usuário precisa de fato (conectar wallet qualquer, fazer primeiro swap), com app/extensão como opção rotulada como tal. Trade-off: perde-se canal gratuito de cross-promo no real-estate caro do header e dos intersticiais. Perfil afetado: iniciante (constrói modelo mental errado sobre dependências do produto).
Atrito real: Negociar empilha mercado on-chain (Swap), condicional on-chain (Limit), on-ramp fiat (Comprar) e off-ramp fiat (Vender) numa lista sem divisor — semânticas radicalmente diferentes com peso visual idêntico. Explorar empilha descoberta básica (Tokens, Pools) com analytics técnico (Transações, Leilões) no mesmo nível. Iniciante não tem como hierarquizar.
Alternativa: divisor ou subtítulo agrupando por natureza ("Negociação on-chain" / "Fiat"; "Descoberta" / "Analytics avançado"). Pedagogia de mecânica não vai no dropdown (polui, ninguém lê) — vai na tela de destino. Trade-off: dropdown ganha 2 linhas a mais de chrome. Perfil afetado: iniciante principalmente.
Submenu de idioma com 15+ itens em alfabético; submenu de moeda idem. Sem campo de busca no topo, sem seção "Frequentes" (USD, EUR, moeda local detectada). Pattern padrão em qualquer produto com 10+ locales. Trivialmente corrigível.
Espanhol em 8+ variantes regionais enquanto Português é item único, apesar de PT-BR/PT-PT/PT-AO somarem audiência relevante. Moedas LatAm cobrem 4 (ARS/BRL/COP/MXN) mas faltam CLP/PEN/UYU; África só tem NGN. Padrão indica inclusão reativa, não estratégia geográfica. Fix: consolidar variantes onde vocabulário não diverge significativamente; aplicar critério único de inclusão.
"Opções de privacidade" não diz se controla cookies, telemetria de wallet ou exposição de IP. "Leilões" evoca lance competitivo quando a mecânica (Dutch auction/LBP) é o oposto (preço decrescente, sem corrida). Singular/plural inconsistente "Pool" vs "Pools" entre nav e relatórios. Fix: nomear pelo que o controle faz/é, não pelo guarda-chuva conceitual.
Persistência das preferências (localStorage? wallet?) não é declarada. "Tema Automático" não diz que segue OS. Cobertura de tradução por idioma não é sinalizada (cair em fallback EN sem aviso). Conversão de moeda não diz qual oracle nem janela de atualização. Padrão: sistema decide algo nos bastidores e não comunica — iniciante não percebe a divergência, intermediário desconfia. Fix em todos os casos: 1 linha de microcopy/tooltip declarando a regra.
Tabs do overlay de search em EN (All/Tokens/Pools/Wallets) enquanto o resto da interface está em PT — inclusive o placeholder do mesmo overlay traduz "carteiras". Singular/plural "Pool"/"Pools" entre seções. Descuido específico, trivialmente corrigível, sinaliza pipeline de tradução incompleto.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch defaultam search e moeda para "trending global / USD" mesmo quando o produto já tem sinais de contexto (rede ativa, wallet conectada, locale do on-ramp). Por que afeta nosso target: iniciante chega no overlay e vê tokens irrelevantes para a jornada dele; brasileiro vê valores em USD e tem que traduzir mentalmente antes de qualquer decisão. Quebra de relevância na primeira impressão de features críticas. Hipótese de diferenciação Kotai: estado default em hierarquia — (1) tokens da wallet/rede ativa, (2) recentes/frequentes, (3) trending da rede ativa, (4) trending global como fallback; geo-default de moeda (BRL pra usuário BR) com override fácil. Trade-off: exige telemetria de uso e leitura de wallet com privacidade explícita; geo-default exige cotação confiável. Passa nas 4 perguntas-teste? (1) ✓ todos os 3 concorrentes principais fazem global; (2) ✓ afeta iniciante e intermediário BR/LatAm diretamente; (3) ✓ é falta de investimento (telemetria + decisão de privacy), não impossibilidade; (4) ✓ a relevância é sentida na primeira tela.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch tratam slippage, deadline, gas preset e MEV protection como configuração por-transação. Resultado: usuário recorrente reconfigura a cada swap; iniciante encontra essas siglas pela primeira vez no momento de maior tensão (transação prestes a sair) e decide sob pressão. Por que afeta nosso target: iniciante encara 4 decisões técnicas isoladas no pior momento possível; intermediário paga fricção repetida diariamente. Hipótese de diferenciação Kotai: Preferências como painel real com perfis nomeados ("Conservador", "Padrão", "Avançado") combinando os defaults em um clique. Swap herda os defaults com override por-transação opcional. Auto-slippage adaptativo por par continua como miolo do "Conservador". Trade-off: aumenta superfície de config e responsabilidade do produto sobre defaults seguros; perfis nomeados exigem curadoria de combinações que faça sentido em par volátil. Passa nas 4 perguntas-teste? (1) ✓ todos fazem config por-transação; (2) ✓ alta leverage iniciante e intermediário; (3) ✓ falta de investimento em design e copy, não impossibilidade; (4) ✓ perfeitamente perceptível — primeiro swap fica drasticamente mais simples.
Padrão atual da indústria: Uniswap (Wallet, UniChain, API), PancakeSwap (CAKE, Perpetuals, NFT, Win), 1inch (Wallet, Portfolio, Card) — todos carregam o header com cross-promo de ecossistema próprio. Nav serve à monetização de plataforma antes da tarefa. Por que afeta nosso target: iniciante chega em sobrecarga cognitiva (rede, gas, slippage, wallet) e precisa processar mais 8-15 entradas que não servem à tarefa imediata. Hipótese de diferenciação Kotai: header organizado por tarefa (Swap, Pools, Portfolio). Logo=home. Cross-sell, quando existir, contextual (vide oportunidade acima). Trade-off: perde-se canal gratuito de cross-promo para produtos adjacentes — relevante se Kotai vier a ter ecossistema próprio (wallet, chain, etc.). Passa nas 4 perguntas-teste? (1) ✓ todos fazem; (2) ✓ afeta iniciante diretamente; (3) ✓ é decisão de negócio (priorizar cross-promo) que pode ser revertida; (4) ✓ header mais limpo é sentido na primeira tela.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch fragmentam patrimônio entre wallet view, LP positions, staking, farming e rewards — usuário visita várias telas pra responder "quanto tenho neste produto". Por que afeta nosso target: iniciante/intermediário perde a noção de quanto está em jogo e onde está o dinheiro — quebra a leitura do próprio patrimônio. Hipótese de diferenciação Kotai: dashboard único agregando posições líquidas + LP + stake + rewards pendentes em um número-chave, com breakdown clicável que leva direto à tela de gerenciamento. Trade-off: exige arquitetura de dados que agregue fontes heterogêneas em tempo aceitável; valores podem divergir entre dashboard e telas de execução em alta volatilidade — janela de atualização precisa ser comunicada. Passa nas 4 perguntas-teste? (1) ✓ todos fragmentam; (2) ✓ alta leverage; (3) ✓ falta de investimento em pipeline de agregação; (4) ✓ percepção imediata.
Padrão atual da indústria: dropdowns como "Negociar" mesclam Swap/Limit/Comprar/Vender sem aviso de mecânica. Iniciante encontra Limit sem saber que pode não executar; encontra Comprar/Vender sem saber que sai do ecossistema on-chain via parceiro fiat com KYC. Por que afeta nosso target: custo é silencioso — usuário descobre depois, no meio da tarefa, e abandona ou comete erro caro. Hipótese de diferenciação Kotai: microcopy de uma linha na entrada de cada modo, badges curtos quando útil ("on-chain", "via parceiro fiat", "pode não executar"). Trade-off: copy ocupa espaço; exige curadoria contínua conforme a mecânica evolui (ex: Limit migrando de keepers para intent-based). Passa nas 4 perguntas-teste? (1) ✓ todos omitem; (2) ✓ alta leverage iniciante; (3) ✓ falta de investimento em copy/design; (4) ✓ percebido no primeiro contato com cada modo.
Padrão atual da indústria: Uniswap, PancakeSwap e 1inch tratam moeda como fiat-only no display, ignorando que muitos usuários DeFi pensam em USDC/USDT como "dólar real on-chain" — é o que de fato circula nas wallets e nas pools. Por que afeta nosso target: alinha display com vocabulário real do produto, reduz a abstração "USD ≠ stablecoin que tenho na wallet". Leverage maior em intermediário; iniciante percebe quando começa a entender o que tem. Hipótese de diferenciação Kotai: seletor que ofereça USDC/USDT como opções de display ao lado das moedas fiat. Trade-off: exige decisão sobre qual stablecoin é referência (USDC e USDT divergem em momentos de stress) e clareza sobre o oracle. Passa nas 4 perguntas-teste? (1) ✓ todos tratam como fiat-only; (2) parcial — afeta mais intermediário que iniciante (ponto mais fraco da oportunidade); (3) ✓ falta de investimento; (4) ✓ perceptível.
Observação adicional: três pilares estruturais aparecem com força no fluxo inteiro e merecem virar tese de produto Kotai — (1) labels e escopos refletem realidade do usuário, não real-estate da empresa; (2) defaults usam contexto que o sistema já tem; (3) cross-promo é contextual, não por-default. Os três têm origem comum: o mega-menu da Uniswap foi desenhado pra servir simultaneamente como ferramenta funcional e veículo institucional, e nos pontos de tensão o veículo ganha.
Função: Submenu popover (acessado a partir de Preferências globais) com a lista de moedas para exibição de preços e valores.
Componentes
Moedas listadas (ordem) USD ✓, ARS, AUD, BRL, CAD, CNY, COP, EUR, GBP, HKD, IDR, INR, JPY, KRW, MXN, NZD, NGN…
Regras de negócio
🟢 Insight Ícones de bandeira ao lado do código ISO ajudam escaneabilidade — diferente do submenu de Idioma, que é texto puro. Pattern bom de herdar: lista rolável carrega bandeira para reconhecimento visual rápido em vez de exigir leitura do código.
^insight-1
🔴 Fricção (estrutural — default não-localizado) O produto detecta locale BR em outros fluxos (bandeira brasileira automática no on-ramp), mas o default de moeda de exibição permanece USD para todos. Inconsistência: o produto sabe que o usuário é brasileiro o suficiente para mostrar bandeira BR ao comprar, mas não o suficiente para sugerir BRL como display. Usuário paga o custo de configurar manualmente algo que o sistema já tem informação para fazer.
Direcionamento para Kotai: geo-detect na primeira visita, sugerir moeda local com override fácil. Lembrar a escolha por wallet/sessão.
^friccao-1
🔴 Fricção (cosmética — ordem alfabética sem hierarquia) USD primeiro por ser default, depois ARS, AUD, BRL, CAD, CNY... — ordem por código ISO atende a quem? Brasileiro rola até B, chinês até C, europeu até E. Falta seção "Moedas frequentes" no topo (USD, EUR, moeda local detectada) + busca para os 15+ itens — mesmo padrão recomendado para o submenu de Idioma.
^friccao-2
🔴 Fricção (estrutural — semântica de conversão opaca) Escolher BRL muda apenas display ou afeta cálculos? Se uma fee é "0,3% = R$ 1,50", esse R$ 1,50 é cotação de qual segundo, com qual provedor? Sem disclosure tipo "Valores em BRL são estimativas via [oracle X], atualizados a cada Y segundos", o usuário avançado desconfia e o iniciante não percebe que a conversão pode divergir entre tela e execução — fonte de quebra de confiança quando a transação fecha com valor diferente do estimado.
Direcionamento para Kotai: disclosure inline curto perto do valor convertido ("≈ R$ 1,50, estimativa atualizada a cada 30s") + tooltip com fonte da cotação. Em momento de execução, mostrar o valor em USD/cripto ao lado do valor em BRL para que o usuário entenda o que vai sair de fato.
^friccao-3
🔴 Fricção (cosmética — cobertura geográfica desigual) LatAm tem 4 moedas (ARS, BRL, COP, MXN) mas faltam CLP (Chile), PEN (Peru), UYU (Uruguai). África tem só NGN — sem ZAR, KES, EGP. Sudeste asiático tem IDR mas não THB, VND, PHP. Padrão sugere inclusão reativa ("alguém da Nigéria pediu") em vez de estratégia geográfica clara.
^friccao-4
🟡 Oportunidade competitiva (alta leverage no target) Duas dimensões em que Uniswap, PancakeSwap e 1inch deixam dinheiro na mesa para o target Kotai:
Geo-default localizado. Todos os concorrentes defaultam para USD globalmente, mesmo quando o produto já tem sinais de locale (bandeira no on-ramp, IP, browser language). Para usuário BR/LatAm — o foco de Kotai — a primeira impressão dos valores em USD adiciona um passo de tradução mental antes de qualquer decisão. Defaultar para BRL com geo-detect em primeiro contato é diferencial sentido logo na primeira tela.
Stablecoins como unidade de display. Em DeFi, muitos usuários pensam em USDC/USDT como "dólar real on-chain" e gostariam de ver valores em USDC, não USD — porque é o que de fato circula nas wallets e nas pools. A lista de Uniswap trata moeda como conceito fiat-only, ignorando o vocabulário do próprio produto. Um seletor que ofereça USDC e USDT como display reduz a abstração "USD ≠ stablecoin" e alinha o display com o que o usuário realmente movimenta.
Trade-off: BRL default exige geo-detect coordenado com display + cotação confiável; stablecoin display exige decisão sobre qual stablecoin é referência (USDC e USDT divergem em momentos de stress) e clareza sobre o oracle. Ambos são complexidade real, mas pagáveis em troca de relevância imediata para o target.
^oportunidade-1
Função: Painel popover de personalização de interface (tema/idioma/moeda).
Componentes
Regras de negócio
🟢 Insight Separar idioma de moeda é correto — viabiliza combos como "PT + EUR" para europeu lusófono ou "EN + BRL" para brasileiro que prefere UI em inglês. Muitos produtos amarram os dois e perdem essa flexibilidade. A hierarquia visual também acerta: tema como segmented control inline (decisão imediata, 3 estados), idioma e moeda como expand para listas longas.
^insight-1
🔴 Fricção (estrutural — escopo enganoso, afeta iniciante e intermediário) "Preferências globais" promete amplitude mas entrega só cosmético. As preferências realmente críticas em DeFi — slippage default, deadline default, gas preset (slow/normal/fast), MEV protection on/off, hide spam tokens, denylist de redes — não estão aqui. Slippage é configurado em cada swap individualmente, em vez de "meu default é 0,5% até eu mudar". Para usuário recorrente, é fricção repetida diariamente; para iniciante, o nome do painel cria expectativa de centro de controle que depois se prova falsa.
Direcionamento para Kotai: ou renomear para refletir o escopo real ("Aparência" / "Display"), ou expandir o painel para incluir defaults de execução de fato. A primeira opção é mais segura e barata; a segunda vira oportunidade competitiva (abaixo).
^friccao-1
🔴 Fricção (cosmética — persistência opaca) Onde essas preferências moram? Se é localStorage do browser, mudar de máquina ou usar incógnito apaga tudo. Se é sincronizado por wallet, deveria estar declarado ("preferências sincronizadas com sua wallet"). Sem indicador, usuário multi-device tem que reconfigurar a cada novo ambiente — fricção silenciosa que acumula.
Direcionamento para Kotai: declarar a janela de persistência abaixo dos controles ("Salvo neste navegador" ou "Sincronizado com sua carteira"), com link para entender como funciona se relevante.
^friccao-2
🔴 Fricção (cosmética — Tema Automático sem clareza) "Automático" segue OS dark mode, hora do dia, ou heurística própria? Sem tooltip, usuário que tem OS sempre em dark mode mas quer light no Uniswap obtém resultado contra-intuitivo sem explicação. Trivialmente corrigível com tooltip ou subtítulo ("Segue o tema do seu sistema").
^friccao-3
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch tratam slippage, deadline, gas preset e MEV protection como configurações por-transação, sem default global. Resultado: usuário recorrente reconfigura a cada swap; usuário iniciante encontra essas siglas pela primeira vez no momento de maior tensão (transação prestes a sair) e tem que decidir sob pressão. Não é impossibilidade técnica — é convenção herdada que ninguém investiu em quebrar.
Diferenciação para Kotai: "Preferências" como painel real, com perfil de comportamento de execução — slippage default (com Auto adaptativo por par como sub-opção), deadline default, gas preset, MEV protection toggle. Cada swap herda os defaults, com override por transação quando o usuário quiser. Para iniciante, oferecer perfis nomeados ("Conservador", "Padrão", "Avançado") que combinam os defaults em um clique, em vez de pedir 4 decisões técnicas isoladas.
Trade-off: aumenta superfície de configuração e responsabilidade do produto sobre defaults seguros — slippage default fixo é perigoso em par volátil, então o Auto adaptativo continua sendo o miolo. A oportunidade é dar AO USUÁRIO controle sobre o regime (conservador vs agressivo), não o número absoluto.
^oportunidade-1
Função: Bridge desktop→mobile via QR para download do app Uniswap.
Componentes
Regras de negócio
🟢 Insight QR como pattern de bridge desktop→mobile é universal e funciona — convenção sólida e sem necessidade de reinventar. Vale herdar para Kotai. Badges App Store + Google Play funcionam também como trust signal ("app distribuído pelas lojas oficiais, não APK pirata"), reforçando confiança institucional.
^insight-1
🔴 Fricção (cobertura de canais — afeta iniciante) O modal trata todo usuário como primeira-instalação a partir do desktop. Falta: (a) alternativa "Enviar link para meu celular por SMS/email" para o usuário no escritório sem celular à mão; (b) detecção "você já tem o app instalado? abrir agora →" para o usuário recorrente. Sem essas saídas, o QR vira beco para parte da audiência.
Direcionamento para Kotai: oferecer SMS/email como fallback secundário (texto pequeno abaixo do QR: "Sem celular agora? Receber link por e-mail") e usar smart-banner ou universal link no mobile para abrir o app já instalado em vez de levar à store.
Observação adicional (Armadilha 1 — convenção válida descartada): A primeira leitura levantou "QR sem URL visível" como fricção de segurança em DeFi (risco de phishing por screenshots fora de contexto). Reclassificado como convenção válida — WhatsApp Web, Discord, Slack e Apple Pay todos mostram QR sem URL no contexto trusted do próprio app. Mexer (mostrar URL embaixo) introduz ruído visual e sugere desconfiança onde o usuário está em ambiente confiável. O risco de phishing existe, mas é problema do canal externo (fórum/screenshot fora de contexto), não da tela em si — não se resolve aqui.
Observação adicional (App Store + Google Play vs QR único): Os dois badges acompanham um QR único. Não é redundância pura — badges também atuam como trust signal de distribuição oficial. Vale manter o padrão, mas se o QR fizer detecção iOS/Android e levar direto para a store correta, vale comunicar isso (badge ativo destacado quando o user-agent é detectado, ou um único badge "Disponível nas lojas").
^friccao-1
Função: Mesma dropdown com sub-acordeão jurídico expandido no rodapé.
Componentes adicionais (revelados ao expandir "Jurídico e privacidade" no rodapé do dropdown)
Regras de negócio
🟢 Insight Progressive disclosure no rodapé ("Jurídico e privacidade" colapsado por padrão, expandindo inline) é decisão correta — mantém o dropdown principal limpo e dá saída para quem precisa do jurídico, sem inflar a hierarquia visual do menu. O trust signal de ter privacy controls fora do footer existe, mas só é colhido por quem descobre o menu (intermediário/avançado). Para iniciante, que não abre o logo, é invisível.
^insight-1
🔴 Fricção (cosmética — afeta intermediário) Dentro do sub-acordeão expandido, os 3 itens convivem flat e sem distinção: 2 são links de leitura legal (Política de privacidade, Termos de serviço) e 1 é configuração ativa ("Opções de privacidade" — provável cookie consent). Usuário clica esperando uma coisa e cai na outra.
Direcionamento para Kotai: separar visualmente "Configurações" (ações: cookies, analytics, telemetria) de "Documentos" (leitura: PP, ToS). Pode ser por subtítulo de seção, divisor ou por mover documentos para footer global e manter só configuração no menu de Settings.
^friccao-1
🔴 Fricção (cosmética — copy) "Opções de privacidade" é label vago. Em cripto, "privacidade" evoca coisas radicalmente diferentes — cookies, analytics web, telemetria de wallet, exposição de IP, proteção contra MEV. Sem subtítulo ou disclosure, é caixa-preta: usuário não sabe se vale o clique.
Direcionamento para Kotai: nomear pelo que controla ("Cookies e analytics", "Compartilhamento de dados", etc.), não pelo guarda-chuva "Privacidade".
^friccao-2
Função: Hub de descoberta de produtos da família Uniswap.
Componentes
Regras de negócio
🟢 Insight A separação entre "produto" (oferta comercial) e "protocolo" (camada DAO) é didática para quem já entende o modelo dual de DeFi — útil para intermediário/avançado.
^insight-1
🔴 Fricção (estrutural — afeta iniciante e intermediário)
O logo aglomera três coisas que não pertencem juntas: cross-promo de ecossistema (Wallet, UniChain, API), institucional (Sobre, Carreiras, Blog) e governança (Voto, DAO, Desenvolvedores). Esse agrupamento serve à empresa — empilhar visibilidade de side-products num real-estate caro — não ao usuário-alvo, que não vai ao logo buscar nenhum desses itens. O chevron ▾ ao lado do wordmark sinaliza que há menu, então a affordance existe; o problema não é descobribilidade visual e sim violação de convenção — em produto mainstream, logo = home, não menu.
Direcionamento para Kotai: logo = home, sem dropdown. Institucional (Sobre, Legal, Docs, Carreiras) vai para o footer global. Governança/DAO, quando relevante, ganha entrada nomeada própria na nav. Trade-off: abre-se mão de surface area para cross-promo de produtos adjacentes — sacrifício alinhado ao posicionamento de DEX para iniciante/intermediário.
^friccao-1
🟡 Oportunidade competitiva (alta leverage no target) Concorrentes carregam o header com cross-promo do próprio ecossistema (UniChain/Wallet; CAKE/Win/Perpetuals/NFT; 1inch Wallet/Portfolio/Card). Quem chega pela primeira vez encontra uma nav que serve à monetização de plataforma antes de servir à tarefa — e iniciante já está em sobrecarga cognitiva (rede, gas, slippage, wallet) sem precisar processar mais 8–15 entradas de ecossistema.
Diferenciação 2: header organizado por tarefa (Swap, Pools, Portfolio), sem mega-menu institucional atrás do logo. Cross-sell, quando existir, se faz contextualmente (ex: oferecer carteira nativa quando user conecta com EOA externa), não em menu hover-only que iniciante nunca abre.
Trade-off: perde-se canal gratuito de cross-promo para produtos adjacentes — relevante caso Kotai venha a ter ecossistema próprio (wallet, chain, etc.).
^oportunidade-1
Função: Acesso direto às ações de pool.
Componentes (apenas 2 opções)
Regras de negócio
🟢 Insight Dropdown enxuto (apenas Ver / Criar) evita inflar a navegação com ações que pertencem à tela de destino. Boa decisão arquitetural — preserva o menu como ponto de entrada e empurra granularidade para onde o usuário já está em contexto.
^insight-1
🔴 Fricção (de tela de destino, não do dropdown — afeta intermediário recorrente) "Ver posições" carrega peso duplo: é entrada para consultar posições e também para agir sobre elas (Add, Remove, Claim). Para o usuário recorrente, isso significa sempre passar por uma tela-intermediária de listagem antes de qualquer ação.
Direcionamento para Kotai: não alterar este dropdown — o atrito não é dele. Garantir que a lista de posições traga ações primárias (Add / Remove / Claim) inline em cada card, sem exigir clique de entrada na posição para depois agir. Dropdown permanece enxuto; o atrito se resolve na tela de destino.
Observação adicional (consistência): o nav top usa "Pool" no singular, enquanto outras seções/relatórios da Uniswap usam "Pools" no plural (ex: a coluna do Explorar e a aba dentro do próprio Pool). Inconsistência de nomenclatura, baixa prioridade — não afeta tarefa, mas é o tipo de incoerência que Kotai pode evitar com uma decisão única (singular ou plural) aplicada de ponta a ponta.
^friccao-1
Função: Acesso às visualizações do portfólio do usuário.
Componentes
Regras de negócio
🟢 Insight As 4 abas cobrem os tipos primários de wallet view stand-alone (saldos, NFTs, histórico) — boa cobertura para usuário casual. Falta o que importa para usuário DeFi ativo: posições em Pools e Stake, onde mora o patrimônio "trabalhando".
^insight-1
🔴 Fricção (estrutural — afeta iniciante e intermediário) "Visão geral" não cumpre o que o nome promete — mostra tokens e NFTs agregados, mas posições em Pools e Stake ficam de fora ou aparecem como preview parcial, forçando o usuário a sair do Portfólio para ver o patrimônio completo.
Direcionamento para Kotai: "Visão geral" deve consolidar todas as posições — líquidas, em pools, em stake e rewards pendentes — com deep-link direto para a tela de gerenciamento de cada uma. Não adicionar abas "Pools" e "Stake" no dropdown (inflaria a navegação e duplicaria caminhos com as seções top-level). Patrimônio é leitura unificada; ação continua nas seções dedicadas.
^friccao-1
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch fragmentam patrimônio entre wallet view, LP positions, staking, farming e rewards — usuário precisa visitar várias telas para responder "quanto tenho neste produto". Para iniciante/intermediário, isso quebra a noção de quanto está em jogo e onde está o dinheiro.
Diferenciação para Kotai: dashboard único agregando posições líquidas + LP + stake + rewards pendentes em um número-chave, com breakdown clicável por categoria que leva direto à tela de gerenciamento. Trade-off: exige arquitetura de dados que agregue fontes heterogêneas em tempo aceitável; em volatilidade alta, valores podem divergir momentaneamente entre dashboard e telas de execução — vale comunicar a janela de atualização para evitar quebra de confiança.
^oportunidade-1
Função: Acesso a analytics públicos da rede.
Componentes
Regras de negócio
🟢 Insight Dar destaque top-level a primary issuance ("Leilões") é decisão deliberada — não é convenção de DEX. Sinaliza intenção de competir em descoberta de tokens novos, não só em troca de tokens existentes. Reforçado pela posição na lista: Leilões aparece em 2º lugar, antes de Pools — escolha de hierarquia que privilegia descoberta sobre utilidade recorrente.
^insight-1
🔴 Fricção (copy — afeta iniciante e intermediário) "Leilões" evoca lance competitivo e arrematação — modelo mental oposto ao que Dutch auction / LBP querem produzir (preço decrescente, sem corrida). Usuário pode entrar com FOMO de "preciso ser rápido" quando a mecânica é desenhada para neutralizar bots e urgência.
Direcionamento para Kotai: se primary issuance fizer parte do escopo, testar termos como "Distribuições" ou "Ofertas iniciais" + microcopy explicativo na tela de destino ("preço decrescente, sem corrida"). Se Kotai não priorizar primary market no MVP, o ponto não se aplica.
^friccao-1
🔴 Fricção (estrutural — mistura de profundidade técnica) O dropdown empilha 4 entradas com nível de uso muito diferente: Tokens/Pools (descoberta básica, útil para qualquer usuário) ao lado de Transações (stream técnico de TXs em tempo real) e Leilões (primary market, especializado). Iniciante não tem como saber quais valem clique — peso visual idêntico achata a hierarquia.
Direcionamento para Kotai: separar visualmente "Descoberta" (Tokens, Pools) de "Analytics avançado" (Transações, Leilões) com divisor ou subtítulo, ou esconder analytics avançado em sub-rota até o usuário sinalizar intenção (visita recorrente, perfil de uso).
^friccao-2
Função: 4 modos de negociação em um menu.
Componentes
Regras de negócio
🟢 Insight Reunir swap, limit e on/off-ramp em um único hub de "Negociar" evita o usuário caçar por menus separados para tarefas adjacentes. A decisão arquitetural só rende quando a interface comunica claramente as diferenças entre os modos — caso contrário, vira fonte de confusão.
^insight-1
🔴 Fricção (estrutural — afeta iniciante) As 4 opções têm semânticas radicalmente diferentes — mercado on-chain (Swap), condicional on-chain (Limit), on-ramp fiat (Comprar) e off-ramp fiat (Vender). Cada item tem ícone próprio, então há diferenciação item-a-item; o que falta é agrupamento por natureza: a lista é flat, sem divisor entre on-chain e fiat, sem sinal de que Limit não é "swap com gatilho" e sim mecânica com pré-aprovação de tokens, dependência de keepers/fillers, exposição a MEV e possibilidade de nunca executar. Iniciante pode clicar em Limit subestimando o salto de complexidade ou em Comprar esperando trocar cripto por cripto, quando o caminho era Swap.
Direcionamento para Kotai: agrupar o dropdown em duas seções com divisor ou subtítulo — "Negociação on-chain" (Swap, Limit) e "Fiat" (Comprar, Vender) — e garantir que cada tela de destino abra com microcopy de uma linha explicando o que aquele modo faz antes do primeiro campo de input. Texto explicativo dentro do dropdown polui e ninguém lê; o lugar da pedagogia é o destino.
^friccao-1
🟡 Oportunidade competitiva (alta leverage no target) Uniswap, PancakeSwap e 1inch unificam swap, limit e on/off-ramp sem pedagogia visível das mecânicas. Iniciante encontra Limit sem saber que é mecânica com risco de não execução; encontra Comprar/Vender sem saber que sai do ecossistema on-chain via parceiro fiat com KYC e fees próprias. O custo é silencioso — usuário descobre depois, no meio da tarefa, e abandona ou comete erro caro.
Diferenciação para Kotai: assumir explicitamente o papel de pedagogia de mecânica em pontos de fricção — microcopy de uma linha na entrada de cada modo, badges curtos quando útil ("on-chain", "via parceiro fiat", "pode não executar"). Trade-off: copy ocupa espaço e exige curadoria contínua quando a mecânica evolui (ex: Limit migrando de keepers para intent-based).
^oportunidade-1


















