Clube de Recompensas — Programa
Pré-requisitos de acesso
- Permissão (módulo):
viewRewardsProgram(para ler) /manageRewardsProgram(para salvar) - Licença/Feature:
REWARDS_CLUB - Contêiner do menu: GERAL → grupo Clube de Recompensas
O que é / quando usar
A tela Programa é o singleton de configuração do Clube de Recompensas (RCS) para o tenant. Aqui você define a identidade do clube, como o nível (tier) do usuário é calculado (métrica + janela), os caps anti-fraude globais, as pools de pagamento (carteiras-casa por asset) e as cotações manuais usadas quando não há price-feed automático.
Use ao montar o clube pela primeira vez e sempre que precisar mudar a regra macro (ex.: passar de "volume de depósitos" para "pontos de missão", pausar payouts em emergência, abastecer/monitorar a pool de pagamento).
Pré-condições
- Permissão:
viewRewardsProgrampara abrir;manageRewardsProgrampara que os controles fiquem editáveis e o Salvar funcione (permissão dupla: enum CPM + módulo dinâmico no DB). - Licença/Feature:
REWARDS_CLUBhabilitada na licença do tenant (Vault). Se desabilitada, o grupo nem aparece no menu. - Dependências de outras telas: os níveis são criados em Níveis e as missões em Missões. Quando a métrica de tier é
POINTS, é preciso ter missões que concedem pontos.
Passo a passo
- Acesse o menu Clube de Recompensas → Programa (
/rewards-club/program). - Defina Status (Ativo/Pausado) e o nome do programa.
- Escolha a Métrica do tier (volume de depósitos, volume negociado ou pontos de missão) clicando no card correspondente.
- Escolha a Janela do tier (vitalícia, últimos 90 dias ou ano corrente).
- Configure o asset padrão de recompensa e o fiat de referência.
- Ajuste os caps anti-fraude (por dia, por usuário/dia).
- Cadastre as pools de pagamento (uma carteira-casa por asset) e, se necessário, as cotações manuais.
- Clique em Salvar — a mutação exige step-up (ver abaixo).
Campos
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
Status (status) | ACTIVE ou PAUSED | Sim | Ativo: eventos disparam payouts e o tier engine recomputa em ciclo. Pausado: eventos continuam auditados, mas missões não pagam; o tier engine segue rodando. Use Pausado em emergências. |
Métrica do tier (tierMetric) | Como o nível é calculado | Sim | DEPOSIT_VOLUME (soma de depósitos confirmados em fiat), TRADE_VOLUME (volume negociado em fiat) ou POINTS (pontos de missão). Valores canônicos do rcs-lib — definem o que o engine soma para posicionar o usuário num tier. |
Janela do tier (tierWindow) | Período considerado na métrica | Sim | LIFETIME (acumulado vitalício — nunca desce de nível), ROLLING_90D (janela rolante de 90 dias — pode perder o nível), CALENDAR_YEAR (reseta em 1º de janeiro). |
Asset padrão de recompensa (defaultRewardAsset) | Token/asset usado quando a missão não define um | Não | Quando uma missão não tem rewardAssetId, o payout usa este asset. Torna o token de recompensa configurável e modular (ex.: tBRL, MID, USDC) — sem travar em fiat. |
Fiat de referência (referenceFiat) | Moeda de exibição da métrica financeira | Condicional | Usado para exibir a métrica quando ela é DEPOSIT_VOLUME/TRADE_VOLUME. Quando a métrica é POINTS, a UI exibe em "pts" e ignora este campo. Substitui o fiatRef legado (espelhado para retrocompat). |
Cap global por dia (globalMaxPayoutsPerDay) | Limite anti-bot de payouts/24h no programa todo | Não | 0 = sem limite. |
Cap por usuário/dia (globalMaxPayoutsPerUserPerDay) | Limite anti-bot de payouts/24h por usuário (todas as missões) | Não | 0 = sem limite. Camada de proteção independente do cap por missão. |
Pools de pagamento (pools[]) | Carteiras-casa que seguram o saldo de payout por asset | Sim (para pagar) | Cada pool tem assetId, walletAddress, balance (saldo) e minBalanceAlert (limite de alerta). A barra de saldo fica vermelha quando balance ≤ minBalanceAlert. Sem pool com saldo, o asset não consegue pagar. |
Cotações manuais (manualQuotes) | Override de cotação asset → fiat de referência | Não | Map ASSET → valor (1 unidade do asset = N de fiat). Usado pelo QuoteService do RCS quando não há price-feed automático para esse par. Linhas em branco são ignoradas no salvar. |
O mapa NFTs por tier (
tierNftAssets) aparece aqui apenas como leitura (retrocompat com programas legados). A geração da NFT de cada nível mudou para a tela Níveis (botão "Gerar NFT" por linha).
Ações e modais
- Salvar: persiste o programa via
PUT /v1/rewards-club/admin/program. Exige step-up (X-Step-Up-Token: re-autenticação senha + MFA, janela de 5 min). Se o token expirar, o gateway responde428 Step-up requirede o interceptor solicita nova verificação. - Adicionar/Remover pool e Adicionar/Remover cotação manual: manipulam as listas localmente; só são persistidos no Salvar.
Regras de negócio / cuidados
Atenção
- Pausar o programa não para a captura de eventos (auditoria continua) — apenas suspende os pagamentos. Útil para conter um incidente sem perder o histórico.
- A escolha entre
LIFETIMEe janelas rolantes muda profundamente o comportamento: emLIFETIMEo usuário nunca desce de nível; emROLLING_90D/CALENDAR_YEARele pode perder o tier. - Trocar a métrica para
POINTSsem missões pontuadoras configuradas deixa todos no nível base. Garanta missões commissionPoints > 0antes. - Mantenha as pools abastecidas: saldo abaixo do alerta sinaliza risco de payouts falharem por falta de fundos na carteira-casa.
- Valores financeiros: saldos, alertas e cotações trafegam como string BigNumber — sem arredondamento; trate como BigNumber antes de qualquer aritmética.
- Idempotência: os payouts subjacentes passam pela FinLib, que é idempotente por
externalId. O código de erroE00021("already processed") significa sucesso (já liquidado), não falha.
Exemplos
Cenário 1 — Clube de captação por volume de depósitos (vitalício)
Objetivo: premiar quem mais deposita, sem nunca rebaixar.
- Status = Ativo.
- Métrica = "Volume de depósitos".
- Janela = "Vitalícia".
- Fiat de referência = BRL.
- Asset padrão de recompensa = tBRL.
- Cadastre uma pool tBRL com a carteira-casa e um
minBalanceAlertconfortável. - Salve (step-up). Os thresholds de cada nível (em BRL) são definidos em Níveis.
Cenário 2 — Clube de engajamento por pontos (rolante 90 dias)
Objetivo: premiar atividade contínua; quem para, desce.
Cenário 3 — Conter um incidente sem perder histórico
Suspeita de abuso/bot disparando payouts:
- Abra Programa e mude Status para Pausado, salve (step-up).
- Os eventos continuam sendo capturados e auditados, mas nenhuma missão paga.
- Ajuste os caps anti-fraude (
globalMaxPayoutsPerUserPerDay > 0) e revise as missões suspeitas. - Volte o status para Ativo quando estiver seguro.