XP, Yield matching, Carry YELD payout

Этот раздел описывает механику Yield в текущем backend (внутренний технический модуль называется yield).

1) Термины (в текущей системе)

  • XP: в этом документе используется XP. Во внутреннем backend имя — xp (models/fields: XPCredit, carryLeftXP, carryRightXP).
  • USDOL/USDOR: LEFT/RIGHT branches в Yield.
  • Carry YELD: хранится в backend как carryYeldUsdo (USDO-base) и означает payout pool, накопленный через Yield matching, который затем выплачивается с weekly caps.

2) Расчет XP из инвестиции

  • Для каждой инвестиции XP считается так:
    • xpBase = amountBase * xpPercent / 100
    • xpPercent берется из Block settings (по умолчанию: 20%)

3) Распространение XP вверх по дереву

Инвестиция имеет placement side (LEFT или RIGHT) на основе investmentInviteCode:

  • Placement user может получить XP credit на той же стороне
  • Далее XP credit поднимается по цепочке referredByUserId до root (max depth guard=100)

4) Важное ограничение: XP credits получают только TIP3

  • В текущей системе XP credit создается только если у получателя programTier === TIP3.
  • Такая же проверка есть в yield worker (внутренний модуль yield): если получатель XP credit не TIP3, credit просто отмечается processed без изменения carry.

Это означает:

  • Пользователи TIP1/TIP2 не накапливают carryLeft/carryRight (yield carry).
  • Инвестиции TIP1/TIP2 могут «создавать» XP, но фактический XP credit получает только ancestor/placement node с TIP3.

5) Yield matching (10 XP + 10 XP → 10 USDO)

Yield worker работает с XPCredit:

  • Каждый credit увеличивает carryLeft или carryRight.
  • Размер пары фиксирован: 10 XP.
  • Для каждой matched pair payout фиксирован: 10 USDO.
  • После matching carry уменьшается, а payout добавляется в carryYeldUsdo.

6) Weekly payout cap (Reward levels)

carryYeldUsdo не становится балансом мгновенно. Выплату выполняет job payoutCarryYeld:

  • У каждого пользователя есть reward level (1..4) в userRewardStatus.
  • Weekly max payout по умолчанию:
    • L1: 2000 USDO/week
    • L2: 4000 USDO/week
    • L3: 6000 USDO/week
    • L4: 8000 USDO/week
  • Если carryYeld превышает оставшийся weekly allowance, overflow burned (не выплачивается).
  • Прогресс weekly payout хранится через yieldAccount.weeklyPayoutUsdo + weekKey.

7) Auto payout schedule

  • При yieldAutoPayoutEnabled=true добавляется repeat job payoutCarryYeld с cron pattern.
  • При выключении repeat job удаляется по best-effort.

8) Эффект TIP upgrade на carry

При повышении tier:

  • Pending XP credits помечаются processed.
  • yieldAccount.carryLeftXP/carryRightXP сбрасываются в 0.
  • В investment create flow carryYeldUsdo также сбрасывается в 0 (кроме upgrade endpoint, где сбрасывается только left/right carry).