Inversiones (Farm Miner) y TIP tiers

En el sistema actual (cómo funciona ahora)

1) Reglas principales para crear una inversión

  • Una inversión se crea solo si el sistema tiene activos activos:
    • USDT (BSC) y USDO (Interno)
  • El usuario que invierte debe tener referredByUserId (es decir, debe haberse registrado con un invite code).
  • La inversión requiere un investmentInviteCode (8 caracteres, A-Z/0-9) — este es el código de placement para el árbol de Yield.
  • Inversión mínima: 10 USDT.

2) Clasificación TIP (TIP1/TIP2/TIP3)

TIP se calcula a partir del monto de inversión según la configuración del Block:

  • tier1MaxBase (por defecto: 480 USDT)
  • tier2MaxBase (por defecto: 975 USDT)

Si:

  • amount ≤ tier1Max → TIP1
  • amount ≤ tier2Max → TIP2
  • en caso contrario → TIP3

Importante: el programTier global del usuario se calcula sumando el principal de todos los farm miners ACTIVE (no solo una inversión). Esto permite mejoras de TIP mediante múltiples inversiones.

3) Plazo/retorno de Farm Miner y “hourly mint”

Después de invertir, se crea un FarmMiner con la siguiente lógica:

  • termMonths y returnMinPercent/returnMaxPercent provienen de la configuración según el TIP.
  • returnPercent tiene dos capas:
    • En el momento de la inversión, se establece un returnPercent inicial (aleatorio en [min, max]).
    • El worker de earn puede re-aleatorizar returnPercent en cada mint/crédito y guarda el último valor usado.
  • profitBase = principal * returnPercent / 100
  • totalMintBase = principal + profitBase
  • El intervalo de mint proviene de farmMinerMintIntervalMinutes (por defecto: 60 minutos).

El earn/mint se calcula prorrata según el tiempo transcurrido:

  • El worker calcula mintedTarget a partir de horas transcurridas (o minutos si el intervalo < 60) y totalMintBase.
  • Luego acredita mintDue = mintedTarget - mintedBase al saldo USDO del usuario (entrada de ledger).
  • Cuando termina el plazo o mintedBase >= totalMintBase, el miner pasa a COMPLETED.

4) Placement de inversión (LEFT/RIGHT)

investmentInviteCode debe pertenecer a algún usuario:

  • Si es igual a inviteCodeLeft de ese usuario → placementSide=LEFT
  • Si es igual a inviteCodeRightplacementSide=RIGHT

En la UI esto suele mostrarse como USDOL (LEFT) y USDOR (RIGHT).

5) El investment invite code se bloquea después de la primera inversión

  • Si un usuario ya tiene una inversión y investmentInviteCodeLocked=true, entonces en inversiones posteriores debe usarse el mismo investmentInviteCode.
  • Después de la primera inversión, el backend siempre guarda/bloquea el placement code elegido.

6) Bono de referral (directo/boca a boca)

En el sistema actual, la comisión de referral va al marketing inviter (referredByUserId) — es decir, la persona cuyo invite code usó el usuario al registrarse:

  • El porcentaje de referral viene de la configuración (referralPercent, por defecto: 10%).
  • La elegibilidad depende del TIP del receptor:
    • TIP1 → 0% (no recibe)
    • TIP2/TIP3 → recibe, pero existe un cap máximo (tip2ReferralMaxBase / tip3ReferralMaxBase).

7) Múltiples miners y “upgrade” (solo aumento)

  • Un usuario puede tener múltiples farm miners (múltiples inversiones).
  • En la API actual, es posible aumentar el principal de un miner existente (upgrade). En ese caso:
    • el principal aumenta
    • el TIP puede cambiar según el nuevo principal
    • el plazo y returnPercent se recalculan (returnPercent vuelve a ser aleatorio)
    • el miner se reinicia “desde ahora” (mintedBase=0, accruedHours=0, endsAt recalculado)