[CL-W12E] Динамические gas caps на всех blockchain-callsites (D1.2 wiring) #508

Merged
andrei merged 2 commits from feature/claude-w12e-dynamic-gas-wiring into master 2026-06-11 05:21:03 +00:00
Owner

Что сделано

D1.2 wiring (хвост W12): getDynamicGasPriceCaps (estimateFeesPerGas + hard-ceiling clamp + fallback на статику) подключён ко всем blockchain-tx callsites — 30 сайтов в 18 файлах:

  • bridge: admin, operations (включая cross-chain unlock — оценка на dest-chain client + destChainId), queries
  • vault: admin, operations ×3
  • lending: borrow ×2, service, liquidation cron
  • rmm: service, write.service ×2
  • p2pEscrow: create, deposit, dispute, refund
  • identity-registry: compliance-rule ×3, identity-registry ×3
  • EURT mint (token.service), share-token ×2
  • Guard-тест w12e-dynamic-gas-wiring.test.ts: статический скан src — ни одного прямого getGasPriceCaps вне lib/blockchainTxQueue.ts (RED: 18 файлов → GREEN)
  • Попутно: мок share-token в buyback.service.branches.test.ts дополнен 4 экспортами (реальный пропуск, вскрытый stripCallArgs-фиксом mock-sync-check из PR #504)

Зачем

Мега-аудит D1: статичные капы ниже live baseFee → viem не отправляет tx → settlement (vault/bridge/escrow/liquidation) тихо стоит при fee-спайке. Динамика была только на vaultQueueProcessor; остальные пути оставались уязвимы.

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

  • vitest полный: 724 файла / 10074 теста GREEN
  • tsc --noEmit: 0
  • eslint --max-warnings 0: 0
  • mock-sync-check: clean
  • guard RED→GREEN (TDD)

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

  • +1 RPC-вызов (estimateFeesPerGas) на каждую tx — на Base это дёшево, но при недоступном RPC добавляется задержка до fallback (исключение ловится внутри, путь не ломается)
  • dest-chain оценка в bridge unlock полагается на корректность getPublicClientForChain(destChainId) — если конфиг чейна неполный, fallback вернёт статичные капы этого chainId (поведение прежнее)

admin-merge reason: solo-dev (Rule 103.1)

  • local-review: Agent(code-reviewer) WARN — HIGH (double client в 3 admin-helpers) + MEDIUM (dispute/refund) + LOW addressed in 36245fb84
  • ci-status: green (head 36245fb84)
  • local: vitest 724/10074 green, tsc 0, eslint 0, mock-sync clean, audit-trail markers
## Что сделано D1.2 wiring (хвост W12): `getDynamicGasPriceCaps` (estimateFeesPerGas + hard-ceiling clamp + fallback на статику) подключён ко **всем** blockchain-tx callsites — 30 сайтов в 18 файлах: - bridge: admin, operations (включая cross-chain unlock — оценка на **dest-chain** client + `destChainId`), queries - vault: admin, operations ×3 - lending: borrow ×2, service, liquidation cron - rmm: service, write.service ×2 - p2pEscrow: create, deposit, dispute, refund - identity-registry: compliance-rule ×3, identity-registry ×3 - EURT mint (`token.service`), share-token ×2 - Guard-тест `w12e-dynamic-gas-wiring.test.ts`: статический скан src — ни одного прямого `getGasPriceCaps` вне `lib/blockchainTxQueue.ts` (RED: 18 файлов → GREEN) - Попутно: мок share-token в `buyback.service.branches.test.ts` дополнен 4 экспортами (реальный пропуск, вскрытый stripCallArgs-фиксом mock-sync-check из PR #504) ## Зачем Мега-аудит D1: статичные капы ниже live baseFee → viem не отправляет tx → settlement (vault/bridge/escrow/liquidation) тихо стоит при fee-спайке. Динамика была только на vaultQueueProcessor; остальные пути оставались уязвимы. ## План тестирования - vitest полный: 724 файла / 10074 теста GREEN - tsc --noEmit: 0 - eslint --max-warnings 0: 0 - mock-sync-check: clean - guard RED→GREEN (TDD) ## Где могу ошибаться - +1 RPC-вызов (estimateFeesPerGas) на каждую tx — на Base это дёшево, но при недоступном RPC добавляется задержка до fallback (исключение ловится внутри, путь не ломается) - dest-chain оценка в bridge unlock полагается на корректность `getPublicClientForChain(destChainId)` — если конфиг чейна неполный, fallback вернёт статичные капы этого chainId (поведение прежнее) --- admin-merge reason: solo-dev (Rule 103.1) - local-review: Agent(code-reviewer) WARN — HIGH (double client в 3 admin-helpers) + MEDIUM (dispute/refund) + LOW addressed in 36245fb84 - ci-status: green (head 36245fb84) - local: vitest 724/10074 green, tsc 0, eslint 0, mock-sync clean, audit-trail markers
[CL-W12E] feat(blockchain): динамические gas caps на всех tx-callsites (D1.2 wiring)
All checks were successful
CI / Secrets Scan (pull_request) Successful in 15s
CI / Python SDK (pull_request) Successful in 31s
CI / Telegram Mini App (pull_request) Successful in 1m40s
CI / Contracts (pull_request) Successful in 1m57s
CI / Prisma Migrate Gate (pull_request) Successful in 1m49s
CI / API (pull_request) Successful in 7m48s
CI / App (pull_request) Successful in 8m2s
00fc57656e
Мега-аудит D1: статичные капы ниже live baseFee тихо останавливали settlement
при fee-спайке. getDynamicGasPriceCaps (estimateFeesPerGas + hard-ceiling clamp,
fallback на статику при недоступности оценки) был подключён только к
vaultQueueProcessor — теперь на всех 30 callsites в 18 файлах:
bridge (admin/operations/queries, включая dest-chain client для cross-chain
unlock), vault (admin/operations), lending (borrow/service/liquidation cron),
rmm, p2pEscrow (create/deposit/dispute/refund), identity-registry, EURT mint
(token.service), share-token.

Guard-тест w12e-dynamic-gas-wiring.test.ts: статический скан src — ни одного
прямого getGasPriceCaps вне lib/blockchainTxQueue.ts (RED 18 файлов -> GREEN).
Попутно: buyback.service.branches.test мок share-token дополнен 4 экспортами
(вскрыто stripCallArgs-фиксом mock-sync-check).
[CL-W12E] review: один PublicClient на вызов — hoist в admin-helpers, reuse в dispute/refund
All checks were successful
CI / Secrets Scan (pull_request) Successful in 14s
CI / Python SDK (pull_request) Successful in 32s
CI / Telegram Mini App (pull_request) Successful in 1m44s
CI / Contracts (pull_request) Successful in 1m49s
CI / Prisma Migrate Gate (pull_request) Successful in 1m54s
CI / App (pull_request) Successful in 7m42s
CI / API (pull_request) Successful in 8m20s
36245fb84d
Находки code-review PR #508: HIGH — bridge/admin, bridge/queries, vault/admin
создавали два клиента (estimation + simulate); MEDIUM — p2pEscrow dispute/refund
дублировали getPublicClient() внутри callback. Теперь один клиент на вызов.
LOW — WHY-комментарий в deposit.ts (один estimate на 3-tx последовательность).
andrei merged commit dc7c3fd6ad into master 2026-06-11 05:21:03 +00:00
andrei deleted branch feature/claude-w12e-dynamic-gas-wiring 2026-06-11 05:21:03 +00:00
Sign in to join this conversation.
No reviewers
No labels
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!508
No description provided.