Track the deferred integration surface for MempoolMonitor.
Scope
Wire charon-scanner::MempoolMonitor into the CLI listen loop:
- Spawn the monitor task alongside
BlockListener, sharing the same RootProvider<PubSubFrontend>.
- Forward the
mpsc::Receiver<OracleUpdate> into a pre-sign builder task once a real signer + deployed liquidator are available.
- On each
ChainEvent::NewBlock, call PendingCache::drain_for_block(block_hash, confirmed_tx_hashes) with the set of tx hashes confirmed by the new block. Feed each returned UnverifiedPreSigned into the executor's simulation gate and broadcast only on SimulationVerdict::Ok.
- Add metrics hooks once
charon-metrics merges (see the TODO(charon-metrics) in run_once).
Non-goals
- Actually broadcasting pre-signs; the signer + liquidator contract wiring is tracked separately.
- Replacing
BlockListener — the monitor is additive.
Acceptance
- CLI listens on both streams concurrently.
drain_for_block is called with a real confirmed-tx set, not an empty one.
- No pre-sign reaches
eth_sendRawTransaction without a successful eth_call simulation first (CLAUDE.md safety invariant).
Track the deferred integration surface for
MempoolMonitor.Scope
Wire
charon-scanner::MempoolMonitorinto the CLI listen loop:BlockListener, sharing the sameRootProvider<PubSubFrontend>.mpsc::Receiver<OracleUpdate>into a pre-sign builder task once a real signer + deployed liquidator are available.ChainEvent::NewBlock, callPendingCache::drain_for_block(block_hash, confirmed_tx_hashes)with the set of tx hashes confirmed by the new block. Feed each returnedUnverifiedPreSignedinto the executor's simulation gate and broadcast only onSimulationVerdict::Ok.charon-metricsmerges (see theTODO(charon-metrics)inrun_once).Non-goals
BlockListener— the monitor is additive.Acceptance
drain_for_blockis called with a real confirmed-tx set, not an empty one.eth_sendRawTransactionwithout a successfuleth_callsimulation first (CLAUDE.md safety invariant).