Closes the round-trip. Burn the IOU on BCH via UnifiedUsdtReserve.withdraw(chain)
(drops reserve[chain], require reserve>=amount — draining to 0 is by design) → the
operator releases the real USDC/USDT from the source vault back to the user's own
address. Single-chain; the reserve-depleted case (external Rabby-style bridge) stays
a later session.
Service: evm/tron.release() (operator-gated vault.release); server /redeem/quote +
/redeem/confirm (verifies the covenant-enforced reserve drop, idempotent, then
releases); state.redeems; bch.controllerInfo. UI: connect/correspondent-burn.ts
builds+signs the withdraw() burn in-browser with the user's own BCH key
(self-custodial; bundles UnifiedUsdtReserve.json); CrossChainDeposit gains a
Deposit/Withdraw toggle (copy: mint=lock / release=burn, never bridge).
Validated 2/2 on real Sepolia + Nile (correspondent-redeem-e2e.mjs): USDC 110->115,
USDT 10978->10983, reserve->0, release txs on-chain. tsc clean; both UI directions
render-verified in the running app. Snapshot 0200.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>