One row per hop of each swap route decoded from Universal Router execute()
calldata. Split routes (multiple swap commands in one execute) become
distinct route_index values; multi-hop routes become multiple hop_index rows.
These events are decoded by scanning each successful transaction's top-level
calldata for the Universal Router execute() selector — so the UR is captured
both when it is trx.to AND when an aggregator/proxy/Safe (e.g. MetaMask
0x881d40…) forwards the UR's raw execute() calldata as an internal call. When
a configured UR address is visible (trx.to, or passed in the calldata by an
address-forwarding aggregator) it fixes router_address and the generation;
when the forwarder resolves the UR by id (e.g. MetaMask) neither is in
calldata, so router_address is empty and generation falls back to the
V4-capable v2. This path needs only base-detail blocks (no call trace
required). Only successful transactions are emitted (reverted txns are
dropped). A direct call to a configured UR decodes only its entry-point
execute() (offset 0; trailing calldata is ignored by the contract); a
forwarded/registry-resolved call is decoded only when the tx also emitted a
Uniswap pool Swap log, since calldata alone does not prove it executed. Even
so, a command flagged allow-revert or any forwarded call may not have executed
— see allow_revert. There is no log to key on, so log_index/block_index are
always 0 and ordinal is a per-block sequence number (see lib.rs / ordinal field).