[CL-1180] L-4: escrow refund off-chain revert (trade-unwind) — open question РЕШЁН, готов к реализации #1176
Closed
opened 2026-07-20 18:30:29 +00:00 by andrei
·
1 comment
No Branch/Tag specified
master
agent/devops/pix-15311
agent/devops/pix-15306
agent/cto/pix-15177
main
agent-fullstack/pix-8664
feature/claude-cl1176-payout-e2e
feature/claude-cl1176-guard-dbname-fix
feature/claude-cl1176-e2e-in-ci
feature/claude-cl1176-conditional-prisma-mock
feature/claude-cl1176-exchange-buyback-e2e
agent/devops/pix-14678
feature/claude-cl1176-webhook-distribution-e2e
feature/claude-cl1176-type-honesty
feature/claude-cl1176-cancel-expire-e2e
fix/sentry-lenis-empty-touch
agent/fullstack/pix-13735-news-title-scope
agent/fullstack/pix-13735-newsai-fixtures
agent/fullstack/pix-13735-news-safelist
fix/low-audit-20260719
chore/monthly-deps-20260719
agent/compliance/pix-13735
agent/fullstack/pix-14259
fix/blog-properties-links-20260718
fix/news-sitemap-public-parity-20260718
fix/nowpayments-probe-alert-hygiene-20260718
agent/sentry/pix-14176
agent/cto/pix-14168
agent/fullstack/pix-14161
agent/cto/pix-14162
codex/react-doctor-suppression-20260717
agent/fullstack/pix-14153
agent/cto/pix-14151
agent/fullstack/pix-14150
agent/fullstack/pix-14132
agent/fullstack/pix-14144
deploy/pix-14136
agent/fullstack/pix-14136
codex/docs-audit-status-20260717
codex/fix-ma0710-m2-lending-confirmations-20260717
codex/fix-ma0710-m1-lazy-hydrate-accessibility-20260717
codex/fix-ma0710-h5-timelock-bootstrap-contract-20260717
codex/fix-ma0710-h4-eurt-timeout-reconciliation-20260717
codex/fix-ma0710-h3-purchase-accounting-20260717
codex/fix-ma0710-h2-stripe-post-actions-20260716
agent/fullstack/pix-14122
agent/fullstack/pix-14118
agent/cto/pix-14065
codex/fix-hero-fallback-copy-20260716
agent/fullstack/pix-14030
codex/fix-react-doctor-lazyhydrate-20260716
agent/fullstack/pix-13809
codex/stripe-payment-create-atomic-20260714
agent/devops/pix-13984
agent/cto/pix-13978
agent/compliance/pix-13968
agent/fullstack/pix-13935
agent/fullstack/pix-13886
agent/fullstack/pix-13744
fix/pix-13874-zod-record-schema
agent/fullstack/pix-13760-v2
fix/pix-13839-compliance-locale
agent/fullstack/pix-13846
agent/fullstack/pix-13760
fix/pix-13844-cabinet-meta
agent/devops/pix-13833-pr1074
fix/PIX-13775-rooms-share-price
fix/pix-13738-compliance-copy
agent/cto/pix-13726
codex/institutional-bulk-lock-order-20260711
codex/payment-lock-legacy-audit-20260711
codex/payment-lock-order-20260711
codex/idempotency-legacy-compat-20260710
codex/idempotency-fingerprint-conflict-20260710
codex/stripe-fallback-idempotency-20260710
codex/payout-serialization-retry-20260710
codex/tg-balance-idempotency-20260710
codex/lending-repay-race-20260710
feature/claude-vault-withdraw-failclosed-20260710
feature/claude-mega-audit-20260710-5
feature/claude-mega-audit-20260710-4
feature/claude-mega-audit-20260710-3
feature/claude-mega-audit-20260710-2
fix/qa-password-reset-email
feature/claude-api-eaddrinuse-retry
archive/master-deploy-pix8054
archive/pr-913
archive/pix-7201-apr-hero-fix-v2
archive/fix--rate-limit-ipv6-networkform-20260614
archive/pix-7201-apr-hero-fix-clean
archive/local-pix-8195
archive/fix--pix-9866-it-faq-launch-date
archive/fix--public-activity-pii-fallback-test
archive/fix--pix-ci-pr-janitor-checkout
archive/fix--pix-9573-faq-withdrawal-minimum
archive/fix--pix-9384-consolidated-overclaim-sweep
archive/fix--pix-9125-mui-color-resolve
archive/fix--pix-9092-swap-mui-color-resolve
archive/fix--pix-8998-i18n-votes-securities
archive/fix--pix-9050-v2
archive/fix--pix-8297-income-overclaim
archive/fix--pix-8381-bridge-lz-disabled
archive/fix--pix-8943-launch-date-i18n-202606161833
archive/fix--pix-8239-compliance-rebase
archive/fix--pix-8284-blog-remaining-overclaims
archive/fix--pix-8284-blog-remaining-overclaims-v2
archive/fix--pix-8190-legal-structure-overclaim
archive/fix--pix-8164-rebase
archive/fix--pix-8239-compliance-followup
archive/fix--pix-7916-remaining-overclaims
archive/fix--pix-8105-v3
archive/fix--pix-7901-cashflow-v2
archive/fix--pix-7901-cashflow-messaging
archive/fix--pix-7860-compliance-messaging
archive/fix--pix-7839-apply-seed-workflow
archive/fix--pix-7766-compliance-fr-es
archive/fix--pix-7766-fr-es-compliance-overclaim
archive/fix--pix-7808-ru-launch-date
archive/fix--pix-7734-seo-price-live
archive/fix--pix-7713-spv-erc1155
archive/fix--pix-7749-blog-normalize
archive/fix--pix-6193-contract-info
archive/fix--pix-7294-guaranteed-secondary-marketplace
archive/fix--pix-7613-blog-disclaimers
archive/fix--pix-13865-prerender-fix
archive/fix--pix-6172-public-news-guard
archive/fix--pix-13865-prerender-warnings
archive/fix--pix-13720-ci-skill-md-and-plan-phrases
archive/fix--pix-13713-regression-test-rooms-pagination
archive/fix--pix-12450-rooms-pagination
archive/fix--pix-10565-guaranteed-tokenization-guide
archive/fix--pix-11214-appError-eslint
archive/fix--pix-10617-protobufjs-security
archive/fix--news-ai-provider-chain
archive/fix--pix-10285-comma-splice
archive/fix--pix-10067-id-consob-faq
archive/fix--claude-cl-redis-adapter-mock-on
archive/fix--deploy-prev-sha-nonsticky
archive/fix--deploy-release-gate-timeout
archive/fix--PIX-4255-db-restore-readiness
archive/feature--twitter-oauth-prod
archive/fix--PIX-10911-mica-bio-overclaim
archive/feature--tg-notify-deploy-integration
archive/feature--claude-remediation-b3
archive/feature--pix-6445-compliance-sanitizer
archive/feature--claude-pix-9050-rebase
archive/feature--claude-pix-9116-rebase
archive/feature--claude-pr-janitor
archive/feature--claude-pix-9041-rebase
archive/feature--claude-pix-8943-rebase
archive/feature--claude-pix-8991-rebase
archive/feature--claude-pix-8556-api-compliance
archive/feature--claude-pix-8674-rebase
archive/feature--claude-pix-8644-rebase
archive/feature--claude-pix-7878-rebase
archive/feature--claude-pix-8259-rebase
archive/feature--claude-pix-8105-rebase
archive/feature--claude-pix-10315-rebase
archive/feature--claude-pix-10084-rebase
archive/feature--claude-pix-6734-apr-disclaimer
archive/feature--claude-google-admin-login
archive/feature--claude-mega-audit-w-20260629
archive/feature--claude-marketing-copy-fix
archive/feature--claude-cl-softdelete-consistency
archive/feature--claude-dep-update-2026-06-14
archive/feature--claude-cl-rm-stale-telegram-mock
archive/feature--claude-cl-kyc-idem-stale-recovery
archive/feature--claude-cl-rm-fomo-countdown
archive/feature--claude-cl-regsummary-softdelete
archive/feature--claude-cl-fix-deploy-push-413
archive/feature--claude-cl-fix-forecasttab-mock-path
archive/feature--claude-cl-kraken-fetch-timeout
archive/feature--claude-cl-escrow-deposit-window
archive/feature--claude-audit-wave4-admin-2fa
archive/feature--admin-modernize-116
archive/feat--pix-10603-vault-cleanup
archive/feat--cto-eslint-fixes
archive/feat--pix-6076-public-compliance-copy
archive/feat--PIX-8170-soften-blog-income-claims
archive/feat--PIX-7409-health-limiter-v2
archive/feat--PIX-7860-public-copy-safety
archive/feat--PIX-7409-health-limiter
archive/cto--pix-6373-prod
archive/devops--pix-12433-telegram-config
archive/codex--static-release-retention-20260702
archive/codex--session-blacklist-audit-doc-sync-20260701
archive/compliance-pix-6561-final
archive/codex--remove-article-preview-cdn-20260701
archive/codex--obj-id-static-redirect-20260604
archive/codex--i18n-aria-namespace-audit-20260702
archive/codex--google-oauth-admin-guard-20260701
archive/codex--dao-timelock-admin-handoff-20260701
archive/codex--europatech-csp-zero-hash
archive/backup--agent-devops-pix-12477
archive/backup--agent-devops-pix-13505-brotli
archive/codex--b3-yield-distribution-reconcile-20260701
archive/agent-ir-investor-relations--pix-9995
archive/agent-sentry--pix-8509
archive/agent-ir-investor-relations--pix-9966
archive/agent-ir-investor-relations--pix-9863
archive/agent-ir-investor-relations--pix-9048
archive/agent-ir-investor-relations--pix-9658
archive/agent-ir-investor-relations--pix-7057
archive/agent-ir-investor-relations--pix-7058
archive/agent-ir-investor-relations--pix-8976
archive/agent-ir-investor-relations--pix-7019
archive/agent-ir-investor-relations--pix-6521
archive/agent-ir-investor-relations--pix-6494
archive/agent-ir-investor-relations--pix-6353
archive/agent-ir-investor-relations--pix-6478
archive/agent-ir-investor-relations--pix-6335
archive/agent-fullstack--pix-8953
archive/agent-fullstack--pix-9412
archive/agent-ir-investor-relations--pix-10201
archive/agent-fullstack--pix-8839
archive/agent-fullstack--pix-8828
archive/agent-fullstack--pix-8786
archive/agent-fullstack--pix-8599
archive/agent-fullstack--pix-8297
archive/agent-fullstack--pix-8501
archive/agent-fullstack--pix-8284
archive/agent-fullstack--pix-8239
archive/agent-fullstack--pix-8259
archive/agent-fullstack--pix-8190
archive/agent-fullstack--pix-8170
archive/agent-fullstack--pix-8195
archive/agent-fullstack--pix-8105
archive/agent-fullstack--pix-8072
archive/agent-fullstack--pix-8164
archive/agent-fullstack--pix-7916
archive/agent-fullstack--pix-7915
archive/agent-fullstack--pix-7939
archive/agent-fullstack--pix-7901
archive/agent-fullstack--pix-7884
archive/agent-fullstack--pix-7878
archive/agent-fullstack--pix-7857
archive/agent-fullstack--pix-7860
archive/agent-fullstack--pix-7844
archive/agent-fullstack--pix-7808
archive/agent-fullstack--pix-7838
archive/agent-fullstack--pix-7839
archive/agent-fullstack--pix-7790
archive/agent-fullstack--pix-7791
archive/agent-fullstack--pix-7772
archive/agent-fullstack--pix-7713
archive/agent-fullstack--pix-7734
archive/agent-fullstack--pix-7771
archive/agent-fullstack--pix-7650
archive/agent-fullstack--pix-7687
archive/agent-fullstack--pix-7623
archive/agent-fullstack--pix-7597
archive/agent-fullstack--pix-7578
archive/agent-fullstack--pix-7552
archive/agent-fullstack--pix-7540
archive/agent-fullstack--pix-7539
archive/agent-fullstack--pix-7527
archive/agent-fullstack--pix-7510
archive/agent-fullstack--pix-7436
archive/agent-fullstack--pix-7507
archive/agent-fullstack--pix-7416
archive/agent-fullstack--pix-7425
archive/agent-fullstack--pix-7409
archive/agent-fullstack--pix-7399-delivery
archive/agent-fullstack--pix-7400-compliance-copy
archive/agent-fullstack--pix-7400-compliance-copy-v2
archive/agent-fullstack--pix-7389
archive/agent-fullstack--pix-7375
archive/agent-fullstack--pix-7376
archive/agent-fullstack--pix-7337
archive/agent-fullstack--pix-7344
archive/agent-fullstack--pix-7360
archive/agent-fullstack--pix-7304
archive/agent-fullstack--pix-7318
archive/agent-fullstack--pix-7317
archive/agent-fullstack--pix-7010
archive/agent-fullstack--pix-7172
archive/agent-fullstack--pix-7001
archive/agent-fullstack--pix-6961
archive/agent-fullstack--pix-6980
archive/agent-fullstack--pix-6867
archive/agent-fullstack--pix-6743
archive/agent-fullstack--pix-6744
archive/agent-fullstack--pix-6866
archive/agent-fullstack--pix-6659
archive/agent-fullstack--pix-6710
archive/agent-fullstack--pix-6690
archive/agent-fullstack--pix-6618
archive/agent-fullstack--pix-6607
archive/agent-fullstack--pix-6639
archive/agent-devops--pix-8163
archive/agent-devops--pix-8189
archive/agent-devops--pix-8054
archive/agent-devops--pix-6394
archive/agent-devops--pix-13687
archive/agent-devops--pix-7974
archive/agent-cto--pix-9487
archive/agent-cto--pix-9610
archive/agent-devops--pix-11297
archive/agent-cto--pix-9486
archive/agent-cto--pix-9457
archive/agent-cto--pix-9483
archive/agent-cto--pix-9148
archive/agent-cto--pix-9116
archive/agent-cto--pix-9089
archive/agent-cto--pix-8944
archive/agent-cto--pix-9050
archive/agent-cto--pix-8943
archive/agent-cto--pix-8878
archive/agent-cto--pix-8881
archive/agent-cto--pix-8882
archive/agent-cto--pix-8755
archive/agent-cto--pix-8724
archive/agent-cto--pix-8744
archive/agent-cto--pix-8655
archive/agent-cto--pix-8695
archive/agent-cto--pix-8674
archive/agent-cto--pix-8644
archive/agent-cto--pix-8592
archive/agent-cto--pix-8518
archive/agent-cto--pix-8494
archive/agent-cto--pix-8469
archive/agent-cto--pix-8480
archive/agent-cto--pix-7532
archive/agent-cto--pix-8371
archive/agent-cto--pix-7655
archive/agent-cto--pix-7495
archive/agent-cto--pix-7201
archive/agent-cto--pix-7494
archive/agent-cto--pix-7195
archive/agent-cto--pix-7178
archive/agent-cto--pix-7196
archive/agent-cto--pix-7133
archive/agent-cto--pix-7143
archive/agent-cto--pix-7138
archive/agent-cto--pix-7097
archive/agent-cto--pix-7040
archive/agent-cto--pix-7109
archive/agent-cto--pix-7032
archive/agent-cto--pix-7039
archive/agent-cto--pix-7038
archive/agent-cto--pix-6977
archive/agent-cto--pix-7022
archive/agent-cto--pix-7014
archive/agent-cto--pix-6967
archive/agent-cto--pix-6962
archive/agent-cto--pix-6960
archive/agent-cto--pix-6949
archive/agent-cto--pix-6953
archive/agent-cto--pix-6918
archive/agent-cto--pix-6850
archive/agent-cto--pix-6891
archive/agent-cto--pix-6867
archive/agent-cto--pix-6685
archive/agent-cto--pix-6734
archive/agent-cto--pix-6703
archive/agent-cto--pix-6678
archive/agent-cto--pix-6675
archive/agent-cto--pix-6664
archive/agent-cto--pix-6648
archive/agent-cto--pix-6658
archive/agent-cto--pix-6650
archive/agent-cto--pix-6632
archive/agent-cto--pix-6634
archive/agent-cto--pix-6642
archive/agent-cto--pix-6602
archive/agent-cto--pix-6623
archive/agent-cto--pix-6613
archive/agent-cto--pix-6601
archive/agent-cto--pix-6570
archive/agent-cto--pix-6554
archive/agent-cto--pix-6553
archive/agent-cto--pix-6540
archive/agent-cto--pix-6542
archive/agent-cto--pix-13359-api-build-fix-rebased
archive/agent-cto--pix-13359-api-build-fix
archive/agent-cto--pix-6396-doc-update
archive/agent-cto--pix-12568
archive/agent-cto--pix-12858
archive/agent-cto--pix-13073-redis-ci-fix
archive/agent-cto--pix-11506
archive/agent-cto--pix-11505
archive/agent-cto--pix-11576-review-complete
archive/agent-content-writer--pix-7457
archive/agent-cto--pix-11101
archive/agent-compliance--pix-9887
archive/agent-compliance--pix-7344-v2
archive/agent-compliance--pix-7173
archive/agent-compliance--pix-9696
archive/agent-compliance--pix-6577
archive/agent-compliance--pix-10382-rebased
archive/agent-compliance--pix-10382
archive/agent-compliance--pix-10315
archive/agent-compliance--pix-10084
archive/agent-cmo--pix-6407
archive/agent
archive/agent-4922b3c6-a783-4afd-941b-e22186f4f40f--pix-7016
archive/agent-27a1dc8e-9e87-48b3-8ab7-0603a2d5374a--pix-9387
sale-ready-20260629
v9.0
v4.0
v3.0
No labels
ci-failing
duplicate
needs-rebase
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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#1176
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Находка бэкенд-аудита L-4 — escrow refund не ревертит off-chain движения трейда
Severity: LOW (узкий exception-путь), но money-correctness.
Статус: design-ready spec, требует dedicated single-agent реализации + CEO review (money hot-path + Prisma schema, Rule 118).
Проблема
On-chain escrow держит и доли, и платёж (
depositShares→depositPayment→settle). Off-chain settlement при match — источник истины (полностью в trade-tx до создания escrow). При REFUNDED/EXPIRED escrow on-chain откатывается, off-chain остаётся settled → дрейф по обеим ногам. Реальный residual:income-distribution/preparation.ts:135начисляет дивиденды на phantom-доли покупателя из REFUNDED escrow (до ручной reconciliation-коррекции).Почему не сделано автономно
sellerPP(проп. cost-basis, вычтенный из purchasePrice продавца при match) не персистится → корректный revert невозможен из текущих данных (приближение = порча налоговой/gains-базы).План (полная модель — в spec)
p2p_escrows.revertPlan JSONB,revertAppliedAt TIMESTAMP(-- APPROVED:).applyEscrowRefundRevertв$transaction+ FOR UPDATE (buyer/seller/SYSTEM, sorted) + reversing ledger + идемпотентность (revertAppliedAt), backward-safe (plan=null → skip).⚠️ Открытый вопрос (решить ДО кода)
buyer-refund для resting BUY: покупатель дебетован при создании ордера (lockedBalance), не при match. Revert возвращает на balance И/ИЛИ восстанавливает lockedBalance ордера? Ордер уже COMPLETED. Уточнить взаимодействие с order-lifecycle.
Промежуточная безопасная альтернатива (если полный revert отложен)
Распространить существующий
getUnsettledEscrowSharessettled-gate на income-distribution — закрывает дивиденд-leak без разворота трейда.Источник: BACKEND-AUDIT сессия 2026-07-20. Полный spec: L4-escrow-refund-revert-SPEC.md.
РЕШЕНИЕ open question (сессия 2026-07-22, по поручению CEO)
Buyer-refund для resting BUY при unwind REFUNDED/EXPIRED эскроу: возврат на свободный
balance/coinBalance(по currency ордера).lockedBalanceНЕ восстанавливать, ордер НЕ реанимировать.Основания (из кода, не из общих соображений)
status: COMPLETED+ locked=0 (execute-trade.ts→buildOrderFillUpdate), cancel →CANCELLED, lockedShares:0, lockedBalance:0(cancel-order.ts:86), expire — аналогично. COMPLETED-ордер сlockedBalance>0— состояние, недостижимое ни одним переходом: его не видит ни cancel-путь, ни expire-cron → у этих денег не существует пути возврата пользователю. Вечная заморозка.lockedBalance— обязательство купить поpricePerShareордера. Восстановление = молчаливое пере-выставление оферты по устаревшей цене без волеизъявления пользователя (авто-rematch по протухшей цене = прямой ущерб).create-order.ts:139-148); возврат = reversing Transaction (REFUND, сescrowId/tradeIdв description/details). Возврат в lockedBalance пары в существующей ledger-семантике не имеет.filledShares/remainingSharesНЕ корректировать (fill был; unwind — отдельное reversing-событие поверх, не «отмена fill»). Единое правило исключает ветвление семантики по статусу ордера.Следствия для спеки (уточнение плана)
revertPlanbuyer-нога:{ userId, amount, currency, creditTo: currency==='EURT' ? 'coinBalance' : 'balance' }— суммы из уже вычисленных дельт match-пути (tradeTotalPrice, seller-нога —sellerProceeds+sellerPPиз персистируемого plan).applyEscrowRefundRevert: reversing Transaction обеим сторонам,FOR UPDATE(buyer/seller/SYSTEM, sorted), идемпотентностьrevertAppliedAt— как в спеке, без изменений.Блокер снят — можно приступать к реализации полной модели (миграция + match-пути + refund.ts + тесты) по плану из шапки.
[CL-1180] L-4: escrow refund off-chain revert (trade-unwind) — design-ready, требует go по open questionto [CL-1180] L-4: escrow refund off-chain revert (trade-unwind) — open question РЕШЁН, готов к реализации