[CL-1176] p2pEscrow: полная модель revertPlan — off-chain unwind после on-chain REFUND (L-4) #1183
No reviewers
Labels
No labels
ci-failing
duplicate
needs-rebase
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
europa-tech-srl/europatech!1183
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/claude-1176-revertplan"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
p2p_escrows.revertPlan JSONB+revertAppliedAt TIMESTAMP(20260722110309_escrow_revert_plan). Деструктива нет.execute-trade.ts— обе ветки (SELL-ордер: locked-пропорцияlockedPurchasePrice; taker-продавец: прямойsellerPP);auto-match.ts— locked-пропорция sell-стороны, консистентная сbuildOrderFillUpdate.buildRevertPlan→createEscrowForTrade(trade, mode, revertPlan)→ персист.applyEscrowRefundRevert(p2pEscrow/revert.ts): применение РОВНО один раз после подтверждённого on-chain REFUND — вызов изrefund.tsпосле finalize (non-fatal: refund уже случился, неудачный unwind остаётся retryable,revertAppliedAtNULL). Внутри: FOR UPDATE (escrow → users в детерминированном порядке → buyer ownership), Zod-валидация JSONB-плана, обе ноги в СВОБОДНОЕ состояние по решению #1176 (buyer →balance/coinBalanceпо currency; seller ownership upsert +shares/+sellerPP; дебеты seller/SYSTEM; reversing-ledger всем трём), W15-B1.5 zero-basis при опустошении позиции, идемпотентностьrevertAppliedAt.P2P_ESCROW_REVERTED.revert.test.ts(happy EUR/EURT, идемпотентность, legacy-skip, wrong-status, шорт по долям → 409 без штампа, malformed plan → 500 без мутаций, zero-basis) + план-тест вauto-match.test.ts(sellerPP=locked-пропорция). Vault синхронизирован.Зачем
Финал L-4 (issue #1176): REFUNDED-эскроу ревертил только on-chain, off-chain обе ноги оставались settled — phantom-доли (дивиденд-leak закрыт ранее гейтом #1181 симптоматически) и невозвращённые деньги. Open question решён сессией 2026-07-22 (комментарий в issue): свободный balance, без реанимации ордеров — вечная заморозка в lockedBalance у COMPLETED-ордера недостижима ни одним переходом.
План тестирования
tsc --noEmitчисто; eslint 0 warnings; pre-commit гейты (audit-trail, migration-guard) пройдены.Где могу ошибаться
Closes #1176
b0399f3f913f5dd3d783