Investimentos (Farm Miner) e TIP tiers

No sistema atual (como funciona agora)

1) Regras centrais para criar um investimento

  • Um investimento é criado somente se o sistema tiver ativos ativos:
    • USDT (BSC) e USDO (Interno)
  • O usuário investidor deve ter referredByUserId (ou seja, deve ter se registrado com um invite code).
  • O investimento requer um investmentInviteCode (8 caracteres, A-Z/0-9) — este é o placement code para a árvore de Yield.
  • Investimento mínimo: 10 USDT.

2) Classificação TIP (TIP1/TIP2/TIP3)

TIP é calculado a partir do valor do investimento com base nas configurações do Block:

  • tier1MaxBase (padrão: 480 USDT)
  • tier2MaxBase (padrão: 975 USDT)

Se:

  • amount ≤ tier1Max → TIP1
  • amount ≤ tier2Max → TIP2
  • caso contrário → TIP3

Importante: o programTier geral do usuário é calculado somando o principal de todos os farm miners ACTIVE (não apenas um investimento). Isso permite upgrades de TIP via múltiplos investimentos.

3) Prazo/retorno do Farm Miner e “hourly mint”

Após investir, um FarmMiner é criado com a seguinte lógica:

  • termMonths e returnMinPercent/returnMaxPercent vêm das configurações conforme o TIP.
  • returnPercent tem duas camadas:
    • No momento do investimento, um returnPercent inicial é definido (aleatório em [min, max]).
    • O worker de earn pode re-randomizar returnPercent em cada mint/crédito e armazena o último valor usado.
  • profitBase = principal * returnPercent / 100
  • totalMintBase = principal + profitBase
  • O intervalo de mint vem de farmMinerMintIntervalMinutes (padrão: 60 minutos).

Earn/mint é calculado pro rata com base no tempo decorrido:

  • O worker calcula mintedTarget a partir das horas decorridoas (ou minutos se intervalo < 60) e totalMintBase.
  • Em seguida, credita mintDue = mintedTarget - mintedBase no saldo USDO do usuário (entrada no ledger).
  • Quando o prazo termina ou mintedBase >= totalMintBase, o miner fica COMPLETED.

4) Placement de investimento (LEFT/RIGHT)

investmentInviteCode deve pertencer a algum usuário:

  • Se for igual a inviteCodeLeft desse usuário → placementSide=LEFT
  • Se for igual a inviteCodeRightplacementSide=RIGHT

Na UI isso geralmente aparece como USDOL (LEFT) e USDOR (RIGHT).

5) Investment invite code bloqueado após o primeiro investimento

  • Se um usuário já tiver um investimento e investmentInviteCodeLocked=true, então para investimentos seguintes o mesmo investmentInviteCode deve ser usado.
  • Após o primeiro investimento, o backend sempre salva/bloqueia o placement code escolhido.

6) Bônus de referral (direto/boca a boca)

No sistema atual, a comissão de referral vai para o marketing inviter (referredByUserId) — ou seja, a pessoa cujo invite code o usuário usou no registro:

  • O percentual de referral vem das configurações (referralPercent, padrão: 10%).
  • A elegibilidade depende do TIP do destinatário:
    • TIP1 → 0% (não recebe)
    • TIP2/TIP3 → recebe, mas há um cap máximo (tip2ReferralMaxBase / tip3ReferralMaxBase).

7) Múltiplos miners e “upgrade” (somente aumento)

  • Um usuário pode ter múltiplos farm miners (múltiplos investimentos).
  • Na API atual, é possível aumentar o principal de um miner existente (upgrade). Nesse caso:
    • o principal aumenta
    • o TIP pode mudar com base no novo principal
    • o prazo e returnPercent são recalculados (returnPercent volta a ser aleatório)
    • o miner reinicia “a partir de agora” (mintedBase=0, accruedHours=0, endsAt recalculado)