[CL-1176] E2E exchange и buyback (седьмой проход) #1192

Merged
andrei merged 1 commit from feature/claude-cl1176-exchange-buyback-e2e into master 2026-07-23 08:56:32 +00:00
Owner

Что сделано

Седьмой адверсариальный проход: 8 opt-in интеграционных сценариев (гейт E2E_DATABASE_URL, в CI skip):

Exchange (exchange(), Serializable + retry):

  • X1+X2: EUR→EURT 500 и обратно 200 — балансы 700/300, четыре парные COIN_EXCHANGE_OUT/IN строки с точными знаками и валютами.
  • X3: insufficient — отказ без изменения балансов, ledger пуст.
  • X4: дневной лимит — 10 обменов проходят (990/10, 20 записей), 11-й отбивается 429.

Buyback (sellToPlatform):

  • B1: happy — gross 400 / fee 20 (5%) / net 380; retire-to-pool (soldShares −4, availableShares +4, у платформы НЕТ ownership-строки — W8 анти-double-booking), пропорциональный basis-декремент 280, парные PLATFORM_BUYBACK ±380.
  • B2: недостаток ликвидности платформы — отказ, ничего не изменилось.
  • B3: p2pFrozenUntil блокирует buyback (паритет с P2P).
  • B4: продажа сверх владения — отказ.
  • B5: escrow-gate (MEGA-AUDIT A1-GATE) — 8 из 10 долей в CREATED-эскроу: продать 4 нельзя ('Not enough settled shares'), ровно 2 settled — можно (net 190).

Зачем

Замыкает E2E-покрытие оставшихся прямых money-путей пользователя. Багов не найдено — пути написаны по канону (::text+toNum, FOR UPDATE, Serializable у exchange, retire-to-pool у buyback). Правки только тестовые (обязательная trade-relation у эскроу, enum-статус CREATED).

План тестирования

8/8 passed на эфемерной БД из чистого prisma migrate deploy; повторный прогон 8/8; tsc чист; eslint файла 0 warnings.

Где могу ошибаться

  • BUYBACK_FEE_RATE зафиксирован в тесте = дефолту 0.05 — от прод-env числа не зависят.
  • Quote-путь (validateBuybackQuote, Redis-cache) не покрыт — требует Redis; atomic getAndDeleteShared покрыт юнитами.
  • burnShareTokens fire-and-forget вне транзакции — no-op без walletAddress, on-chain паритет вне скоупа E2E.
## Что сделано Седьмой адверсариальный проход: 8 opt-in интеграционных сценариев (гейт `E2E_DATABASE_URL`, в CI skip): **Exchange (`exchange()`, Serializable + retry):** - X1+X2: EUR→EURT 500 и обратно 200 — балансы 700/300, четыре парные COIN_EXCHANGE_OUT/IN строки с точными знаками и валютами. - X3: insufficient — отказ без изменения балансов, ledger пуст. - X4: дневной лимит — 10 обменов проходят (990/10, 20 записей), 11-й отбивается 429. **Buyback (`sellToPlatform`):** - B1: happy — gross 400 / fee 20 (5%) / net 380; retire-to-pool (soldShares −4, availableShares +4, у платформы НЕТ ownership-строки — W8 анти-double-booking), пропорциональный basis-декремент 280, парные PLATFORM_BUYBACK ±380. - B2: недостаток ликвидности платформы — отказ, ничего не изменилось. - B3: p2pFrozenUntil блокирует buyback (паритет с P2P). - B4: продажа сверх владения — отказ. - B5: escrow-gate (MEGA-AUDIT A1-GATE) — 8 из 10 долей в CREATED-эскроу: продать 4 нельзя ('Not enough settled shares'), ровно 2 settled — можно (net 190). ## Зачем Замыкает E2E-покрытие оставшихся прямых money-путей пользователя. Багов не найдено — пути написаны по канону (::text+toNum, FOR UPDATE, Serializable у exchange, retire-to-pool у buyback). Правки только тестовые (обязательная trade-relation у эскроу, enum-статус CREATED). ## План тестирования 8/8 passed на эфемерной БД из чистого `prisma migrate deploy`; повторный прогон 8/8; tsc чист; eslint файла 0 warnings. ## Где могу ошибаться - BUYBACK_FEE_RATE зафиксирован в тесте = дефолту 0.05 — от прод-env числа не зависят. - Quote-путь (validateBuybackQuote, Redis-cache) не покрыт — требует Redis; atomic getAndDeleteShared покрыт юнитами. - burnShareTokens fire-and-forget вне транзакции — no-op без walletAddress, on-chain паритет вне скоупа E2E.
[CL-1176] E2E-сценарии exchange и buyback на реальной БД (седьмой проход)
All checks were successful
CI / Telegram Mini App (pull_request) Successful in 1m49s
CI / Python SDK (pull_request) Successful in 29s
CI / Secrets Scan (pull_request) Successful in 12s
CI / Contracts (pull_request) Successful in 2m49s
CI / Prisma Migrate Gate (pull_request) Successful in 1m49s
CI / API (pull_request) Successful in 18m49s
CI / App (pull_request) Successful in 21m6s
8b5f691208
Восемь opt-in интеграционных сценариев (гейт E2E_DATABASE_URL): exchange
EUR→EURT/EURT→EUR с точными балансами и парными COIN_EXCHANGE_OUT/IN
строками, insufficient-отказ без следов в ledger, дневной лимит (10 обменов
проходят, 11-й — 429); buyback sellToPlatform — happy-путь (gross 400 /
fee 20 / net 380, retire-to-pool: soldShares−4 availableShares+4, платформа
НЕ держит ownership-строку, пропорциональный basis 700×4/10, парные
PLATFORM_BUYBACK ±380), отказ при недостатке ликвидности платформы,
p2p-freeze блокирует, продажа сверх владения отбивается, escrow-gate:
non-SETTLED эскроу-доли покупателя не продаются (settled 2 из 10 — продать
можно ровно 2). Багов в путях не найдено; правки только тестовые (trade
relation обязателен для escrow, enum CREATED). Повторный прогон зелёный.
andrei scheduled this pull request to auto merge when all checks succeed 2026-07-23 08:54:37 +00:00
andrei merged commit 072fbd2fa6 into master 2026-07-23 08:56:32 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech!1192
No description provided.